feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #18
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#18
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.505178be5209d7b318cc92200344e2eada8d19890📋 變更摘要(送審 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⚔️ 攻擊方登場
🛡️ 防守方登場
🟠 警告|🧰 Leo
位置:
readme.md第 76–132 行問題描述
README 內大量函式清單同時硬編分支名稱與行號錨點,這次 diff 已經整批從
master改成develop並同步調整行號。這類文件和原始碼結構高度重複,後續只要插入幾行程式,文件連結就會失準,維護者必須靠人工記得同步整張表。修改建議
改成不含行號的穩定檔案連結,或把這份 API/功能表改由 JSDoc/腳本產生。若一定要保留行號,建議把產生流程寫入 npm script,避免每次程式碼位移都人工批次修改 README。
🟠 警告|🔮 Mage
位置:
src/index.js第 374–387 行問題描述
建問題模式下只要有任何保留 finding 就會建立 issue,且後續一律把 PR 設為相依於該 issue;但收尾結果仍是
severe.length === 0 ? 'success' : 'failure'。最小情境:攻擊方只產生 1 條「建議」,severe.length為 0,action commit[success],但 PR 被 issue dependency 擋住無法合併。這讓「success=可通過」與「非嚴重問題也阻擋合併」兩個語義互相矛盾。修改建議
明確對齊語義:若只有嚴重問題才應阻擋合併,則只在
severe.length > 0時建立 dependency;若所有保留問題都要阻擋合併,則 result/exit code 不應只看嚴重問題。建議寫法
🟠 警告|⚡ Rogue
位置:
src/lib/gitrepo.js第 131–132 行問題描述
淺層 checkout 找不到 merge-base 時,第一個補救策略直接
git fetch --unshallow origin,這是在浪費網路與磁碟 I/O:大型 repo 會把完整歷史抓回來,可能從數十 MB 變成數 GB、從秒級變分鐘級,而且只為了找一個 base/head 的共同祖先。後面的--deepen=1000策略根本來不及省資源,因為 unshallow 成功就先把整包歷史吃下去了。修改建議
先用 bounded deepen 補 base 與 HEAD,仍失敗再把
--unshallow當最後手段;或把 unshallow 限定到必要 ref。這樣常見 PR 只多抓一小段歷史,不會一上來把整個 repo 歷史吞進 runner。建議寫法
🟠 警告|🔮 Mage
位置:
src/lib/gitrepo.js第 140–140 行問題描述
deepen HEAD策略實際執行的是git fetch --deepen=1000 origin HEAD,這裡的HEAD是遠端 origin 的預設分支,不是目前 checkout 的 PR head commit。最小情境:PR head 是 feature 分支或 fork commit、checkout 為 shallow detached HEAD,且--unshallow因 runner/遠端限制失敗;此 fallback 只加深 origin 預設分支,沒有補到 PR head 歷史,merge-base origin/<baseRef> HEAD仍會失敗。修改建議
不要用
origin HEAD代表目前 PR head。把headRef或可 fetch 的 head ref 傳入resolveMergeBase,並對該 ref 加深;若只有 SHA,需確認遠端可依 SHA fetch,否則應要求 checkout fetch-depth: 0 並輸出明確診斷。🔵 建議|🎼 Bard
位置:
action.yml第 3–3 行問題描述
檔頭的
更新時間仍寫著2026/07/17 18:49:58,但本次檔案內容與 PR 標示的最後更新時間已是 2026/07/20;硬編時間戳若不準,文件節拍會比沒有更刺耳。修改建議
移除手動維護的更新時間,或改成由產生文件的腳本統一更新,避免同一份 PR 裡多個時間互相打架。
🔵 建議|🎼 Bard
位置:
readme.md第 41–49 行問題描述
流程圖把
S2放到S8後面,視覺上像從第 8 步倒跳第 2 步;即使語意是「延後執行」,編號與閱讀順序互相拉扯,讓文件節奏走調。修改建議
流程圖節點代號改用語意名稱,或把顯示文字改成「延後清理舊留言」而不要保留
2的步驟編號。建議寫法
🔵 建議|🎼 Bard
位置:
src/index.js第 179–181 行問題描述
issueBuffer的旋律太含糊:讀者會以為裡面放的是 issue,實際上暫存的是尚未送出的留言 body。命名沒有把資料形狀唱清楚。修改建議
改成能描述內容與用途的名稱,例如
pendingIssueCommentBodies,並同步調整註解與迴圈變數。建議寫法
🧩 code-review-resolve 處理進度
本議題為 AI Code Review 建問題模式的追蹤議題。以
--issue all併同.gitea/ai-review/findings/逐條處理後結果如下(對照目前程式碼與exclusions.json):readme.md第 76–132 行src/index.js第 374–387 行src/lib/gitrepo.js第 131–132 行src/lib/gitrepo.js第 140–140 行action.yml第 3–3 行readme.md第 41–49 行src/index.js第 179–181 行小計:✅ 已解決 2 條、🚫 誤報(已列入 exclusions)2 條、⏭️ 待人工處理 3 條。
resolveMergeBase補抓策略調整、deepen PR HEAD改用 head SHA、留言閉包改名、push-tokeninput 移除等)。.gitea/ai-review/exclusions.json既有裁決等價,不重複新增排除條目。處理完成,依 code-review-resolve 流程關閉本議題。