feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #19
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#19
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.5b277ff2f7c4b565601d57ce93d346e4735b27ebb📋 變更摘要(送審 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⚔️ 攻擊方登場
🛡️ 防守方登場
🔴 嚴重|🔮 Mage
位置:
src/lib/gitrepo.js第 140–140 行問題描述
deepen HEAD這個補抓策略實際執行的是git fetch --deepen=1000 origin HEAD,它會補遠端origin的預設 HEAD,而不是目前 checkout 的 PR head。最小重現:PR 來自非預設分支或 fork,checkout 為 shallow history,origin/HEAD指向develop,目前HEAD是 PR 分支 commit;初次merge-base origin/<baseRef> HEAD失敗後,此策略只加深預設分支歷史,PR head 的父提交仍不存在,最後仍會丟出「無法解析 merge-base」。這會讓原本可藉由加深 PR head 解決的淺層 checkout 直接審查失敗。修改建議
不要用
origin HEAD代表目前 PR head。resolveMergeBase需要取得可 fetch 的 PR head ref(例如ctx.headRef/事件 payload ref/head repo remote)並加深該 ref;若只能拿到headSha,至少應明確診斷「無法加深目前 HEAD」,不要把遠端預設 HEAD 當成修復策略。建議寫法
🟠 警告|🗡️ Assassin
位置:
action.yml第 21–24 行問題描述
這裡建議呼叫端傳入「能觸發 CI 的 PAT」作為 action token。攻擊者最愛這種長效、可推送、可觸發 workflow 的憑證:只要此 action 在不受信任 PR 上執行,或 PR 能影響 action/workflow 執行內容,惡意變更就可能讀取
INPUT_TOKEN、推送結果 commit、再藉由可觸發 CI 的身分製造後續執行鏈。自動 token 原本不觸發 CI 是一道防線,這個建議等於要求使用者把防線拆掉。修改建議
不要泛稱建議使用可觸發 CI 的 PAT。文件與介面應明確要求最小權限、repo 限定、短效或可輪替 token,並禁止在 fork/不受信任 PR context 暴露 PAT。更穩的設計是分離 API 留言 token 與 push token,且只有在明確受信任事件或受保護分支才允許 push token 存在;否則拒絕 commit/push,只做留言或 artifact。
🟠 警告|⚡ Rogue
位置:
src/lib/gitrepo.js第 128–130 行問題描述
這裡在淺層 checkout 找不到 merge-base 時,第一個補救策略就是
git fetch --unshallow origin,等於可能把整個 remote 歷史一次抓回來。大型 repo 或長歷史分支會直接浪費數百 MB 到數 GB 網路與磁碟 I/O,CI 時間也會被偷走;其實多數 PR 只需要有限 deepen 就能找到共同祖先。修改建議
先做有上限、目標明確的 deepen base/head,仍失敗才把
--unshallow當最後手段。這樣常見情境只付固定上限成本,不會一失敗就下載全歷史。建議寫法
🔵 建議|🎼 Bard
位置:
readme.md第 42–50 行問題描述
流程圖的節點 ID 旋律走調了:
S1之後一路走到S8,才突然接回S2。雖然顯示文字說明「步驟 2 延後」,但 Mermaid 原始碼的閱讀順序變成倒敘,維護者改圖時很容易在編號與流程方向之間迷路。修改建議
節點 ID 建議改成語意名稱,讓「顯示的步驟編號」與「Mermaid 內部識別碼」各司其職;延後執行的步驟 2 可命名為
ResolveOld,讀起來會比S8 --> S2更順。建議寫法
🔵 建議|🧰 Leo
位置:
readme.md第 59–132 行問題描述
README 的功能列表手動維護了大量
src/branch/develop/...#Lxx深連結與行號。這次 PR 已經一次改動數十個 branch/line anchor,代表文件和原始碼行號高度耦合;下一次只要插入幾行程式,文件就會悄悄過期,維護者很難知道哪些連結還準。修改建議
避免在手寫 README 綁定行號,改連到函式所在檔案或穩定章節錨點;若必須保留行號,請把這段改成產生式文件,讓 CI 或腳本從原始碼/JSDoc 重新生成,減少人工同步成本。
🔵 建議|🎼 Bard
位置:
src/index.js第 181–185 行問題描述
issue這個變數名太素,像樂譜上只寫「音符」卻不說是哪一聲部。此處承載的是建問題模式建立出的追蹤 issue,後面還會與 PR issue 編號、Gitea issue API 參數交錯出現,名稱過泛會讓閱讀節奏變濁。修改建議
改成能表明角色的名稱,例如
trackingIssue。對應的ensureIssueCreated也可改為ensureTrackingIssueCreated,讓閉包狀態與用途一眼對上。建議寫法
🔵 建議|🎼 Bard
位置:
src/index.js第 194–203 行問題描述
postComment的命名與實際行為不再押韻:一般模式會立刻留言,但建問題模式在 issue 尚未建立時只是把內容塞進issueBuffer,回傳null。函式名唱的是「發布」,實際卻可能只是「暫存」,讀者得進函式內才知道節拍轉了。修改建議
把名稱改成能涵蓋兩種行為的動詞,例如
queueOrPostComment或publishReviewComment,並讓 JSDoc 第一行明講「可能暫存」。若想更清楚,也可拆成postPrComment與queueIssueComment,由呼叫點明示模式差異。建議寫法
🔵 建議|🧰 Leo
位置:
src/lib/review.js第 14–75 行問題描述
review.js這次新增redactSecrets()與agentFailureDetail(),但這兩個函式處理的是 AI CLI 執行失敗診斷與機密遮罩,責任更接近agents.js或共用 log/sanitize 工具。現在審查結果整理模組同時負責 diff、裁決、issue 發文與 CLI 診斷格式,模組邊界越來越鬆;之後其他地方若也要記錄 agent 失敗,很容易複製一份遮罩邏輯或反向依賴review.js。修改建議
將這兩個函式移到
src/lib/agents.js(例如匯出formatAgentFailure()),或新增src/lib/sanitize.js/src/lib/diagnostics.js。review.js只消費格式化後的錯誤摘要,避免讓審查編排模組承擔 CLI 診斷細節。🔵 建議|🎼 Bard
位置:
src/lib/templates.js第 388–405 行問題描述
issueLinkComment產生的是 PR 上唯一的建問題模式回貼留言,但名稱少了 PR 的聲部;同檔已有issueBody、issueFindingComment,乍看會以為這也是 issue 內留言模板,命名層次不夠分明。修改建議
改名為
prIssueLinkComment或trackingIssueLinkComment,讓模板的投遞位置與用途直接寫在名稱裡,避免與 issue 內文、issue finding 留言混成一團。建議寫法
🧩 code-review-resolve 處理進度
本議題為 AI Code Review 建問題模式的追蹤議題。以
--issue all併同.gitea/ai-review/findings/逐條處理後結果如下(對照目前程式碼與exclusions.json):src/lib/gitrepo.js第 140–140 行action.yml第 21–24 行src/lib/gitrepo.js第 128–130 行readme.md第 42–50 行readme.md第 59–132 行src/index.js第 181–185 行src/index.js第 194–203 行src/lib/review.js第 14–75 行src/lib/templates.js第 388–405 行小計:✅ 已解決 3 條、🚫 誤報(已列入 exclusions)1 條、⏭️ 待人工處理 5 條。
resolveMergeBase補抓策略調整、deepen PR HEAD改用 head SHA、留言閉包改名、push-tokeninput 移除等)。.gitea/ai-review/exclusions.json既有裁決等價,不重複新增排除條目。處理完成,依 code-review-resolve 流程關閉本議題。