feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #11
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#11
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.64c2b6d426569441d6c3d8ad892117b9fcdee9e11📋 變更摘要(送審 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
位置:
action.yml第 49–59 行問題描述
新增的長效 PAT 會以
INPUT_PUSH-TOKEN環境變數存在於整個 Node Action 執行期間,而審查流程會啟動可受 PR diff 提示注入影響的 AI CLI 子程序。若子程序繼承目前環境,攻擊者可在惡意 diff 中誘導工具讀取並外傳此 PAT,取得推送儲存庫甚至更廣的權限;pushWithCredential最後才安全注入認證,無法消除 PAT 在前面 AI 階段已暴露的風險。修改建議
不要把長效 PAT 作為執行 AI 審查之 Action 的輸入。將推送結果拆到獨立 job/受信任 workflow,使用短效、限單一儲存庫與限目標分支的憑證;同時讓所有 AI CLI 子程序使用明確 allowlist 建立環境,排除
INPUT_PUSH-TOKEN、各類 token 與 secrets。若無法拆分,讀取後立即從process.env移除,並確保 PAT 只傳給單次git push子程序。建議寫法
🟠 警告|🧰 Leo
位置:
src/index.js第 119–139 行問題描述
流程步驟編號被當成跨模組識別值,散落在
index.js、各 library 的日誌與 JSDoc、README 流程圖及功能表。這次僅因插入並延後一步,就必須同步修改大量步驟2~步驟8字串,而且實際執行順序已變成 1、3~8、2、9~10;未來再調整流程時非常容易讓文件、日誌與程式碼脫節。修改建議
以穩定的語意階段名稱取代硬編碼序號,例如
TOOL_DETECTION、COLLECT_DIFF、RESOLVE_OLD_COMMENTS,由單一常數表集中決定顯示名稱;README 的流程順序則從同一份定義產生,或至少不要在各函式文件重複紀錄易變的數字。建議寫法
🟠 警告|🧪 Maya
位置:
src/index.js第 260–276 行問題描述
「無可審查變更」新增了兩種不同結果,且一般模式把清理舊留言延後到新留言發布後,但沒有測試驗證這個關鍵時序。若留言建立或保存 findings 失敗,可能留下半套新結果,或錯誤地清除仍應保留的舊審查;建問題模式也需要確認先前暫存的工具留言確實不會送到 PR 或建立 issue。
修改建議
補上一般模式與建問題模式的空檔案案例。一般模式應斷言先建立本回合「無可審查變更」留言,再呼叫
resolveOldComments,且傳入的集合包含新留言 ID;讓新留言建立失敗時,斷言不會清理舊留言。建問題模式則斷言不呼叫任何 PR/issue 留言 API、不建立 issue、不清理舊留言,並以成功結束。🟠 警告|⚡ Rogue
位置:
src/lib/gitrepo.js第 134–135 行問題描述
淺層 checkout 一旦首次 merge-base 失敗,就優先執行
--unshallow,會下載整個存取庫歷史;大型或長壽專案可能從原本只需補數十至數百個 commit,膨脹成數 GB 網路傳輸、磁碟占用與分鐘級等待。後面的--deepen=1000因已解除 shallow 幾乎失去意義。修改建議
先採固定深度的漸進補抓並於每次補抓後重試 merge-base,例如依序 deepen 100、1000;只有仍找不到共同祖先時,才把
--unshallow當最後手段。建議寫法
🟠 警告|🔮 Mage
位置:
src/lib/gitrepo.js第 143–147 行問題描述
補深 HEAD 的策略實際執行
git fetch ... origin HEAD;這裡的HEAD由遠端解析,通常代表遠端預設分支,而不是目前 checkout 的 PR head。最小重現:淺層 checkout 的 PR 分支與預設分支不同、base 歷史已足夠但本地 PR head 祖先不足,且--unshallow失敗;「deepen HEAD」會補抓預設分支,當前本地 HEAD 仍缺歷史,最後錯誤地判定無法取得 merge-base。修改建議
以 PR head 的確切 SHA 或來源分支 refspec 補抓,而非遠端
HEAD;可將headSha/headRef傳入resolveMergeBase,例如 fetch<headSha>,並在每次補抓後驗證目前 HEAD 的 shallow boundary 是否確實前移。建議寫法
🔵 建議|🎼 Bard
位置:
readme.md第 41–50 行問題描述
流程圖依執行順序呈現
1 → 3 → 4 → … → 8 → 2 → 9,步驟編號逆行,讀起來像樂譜突然倒拍。雖然「步驟 2 延後執行」有文字說明,但編號本身仍迫使讀者反覆確認這是刻意安排而非文件筆誤。修改建議
流程圖改用階段名稱而非固定數字,或依實際執行順序重新編號;若固定編號具有相容性意義,至少把節點標成「延後執行步驟 2」,使逆序意圖在圖中立即可辨。
建議寫法
🔵 建議|🎼 Bard
位置:
src/index.js第 194–207 行問題描述
postComment這個名字過於泛化,讀者會直覺以為它必定「發布留言」,但建問題模式下可能只寫入issueBuffer並回傳null。名稱與實際副作用走了不同旋律,呼叫端難以一眼判斷留言究竟已發布、被暫存,或發往 PR/issue。修改建議
將名稱改為能呈現路由語義的
routeReviewComment或postOrBufferReviewComment,並同步調整呼叫處;若保留 nullable 回傳值,也可定義較明確的結果型別,避免Promise<Object|null>的含義只能靠長篇註解補足。建議寫法
🧩 code-review-resolve 處理進度
本議題為 AI Code Review 建問題模式的追蹤議題。以
--issue all併同.gitea/ai-review/findings/逐條處理後結果如下(對照目前程式碼與exclusions.json):action.yml第 49–59 行src/index.js第 119–139 行src/index.js第 260–276 行src/lib/gitrepo.js第 134–135 行src/lib/gitrepo.js第 143–147 行readme.md第 41–50 行src/index.js第 194–207 行小計:✅ 已解決 4 條、🚫 誤報(已列入 exclusions)2 條、⏭️ 待人工處理 1 條。
resolveMergeBase補抓策略調整、deepen PR HEAD改用 head SHA、留言閉包改名、push-tokeninput 移除等)。.gitea/ai-review/exclusions.json既有裁決等價,不重複新增排除條目。處理完成,依 code-review-resolve 流程關閉本議題。