feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #16
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#16
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|審查工具
antigravity1.1.4gemini-3.5-flash321a717f91303bd4b865eacb0d11546ef9e79e11📋 變更摘要(送審 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/lib/gitrepo.js第 102–149 行問題描述
攻擊者可以透過提交惡意 Pull Request,將
baseRef(PR 目標分支)命名為包含路徑穿越(Path Traversal)的字串,例如../../hooks/pre-push。由於resolveMergeBase直接將baseRef拼接至git fetch的 Refspec 參數中(例如+refs/heads/${baseRef}:refs/remotes/origin/${baseRef}),這將導致git fetch寫入至.git/refs/remotes/origin/../../hooks/pre-push(即.git/hooks/pre-push)。這會覆寫或建立 Git Hook,並在後續執行 git 操作時自動觸發該惡意 Hook,從而造成遠端程式碼執行(RCE)。同樣地,commitAndPushFindings函數中的headRef也存在類似的拼接風險。修改建議
在將
baseRef與headRef傳入 git 指令之前,應進行嚴格的合法性檢查。建議使用正則表達式限制分支名稱僅能包含安全的字元(如英數字、斜線、底線、連字號、句點),且絕對不得含有..或以-開頭,必要時亦可使用git check-ref-format命令先行驗證該分支名稱是否安全。建議寫法
🟠 警告|🗡️ Assassin
位置:
src/lib/review.js第 16–82 行問題描述
當 AI 代理工具執行失敗時,
agentFailureDetail預設會將 stderr 和 stdout 的前 500 字元經由redactSecrets遮蔽後輸出到 CI 日誌中。然而,redactSecrets採用的是黑名單式的正則表達式,若 agent 輸出中包含非標準格式的 API 金鑰(如短於 40 字元的 secret、自定義 Token 標頭)、資料庫連線字串或敏感個資(PII),此種黑名單防線極易被繞過,進而將敏感機密永久暴露於公開的 CI 日誌中。修改建議
建議在預設情況下,CLI 失敗時只輸出 Exit Code 與錯誤類型的診斷資訊,而不主動傾印 stdout/stderr 的內容。只有當明確啟用 CI 偵錯模式(例如
process.env.ACTIONS_STEP_DEBUG === 'true')時,才允許輸出經遮蔽後的詳細輸出,以在日常運行中最大程度地保護機密不外洩。建議寫法
🧩 code-review-resolve 處理進度
本議題為 AI Code Review 建問題模式的追蹤議題。以
--issue all併同.gitea/ai-review/findings/逐條處理後結果如下(對照目前程式碼與exclusions.json):src/lib/gitrepo.js第 102–149 行src/lib/review.js第 16–82 行小計:✅ 已解決 0 條、🚫 誤報(已列入 exclusions)1 條、⏭️ 待人工處理 1 條。
resolveMergeBase補抓策略調整、deepen PR HEAD改用 head SHA、留言閉包改名、push-tokeninput 移除等)。.gitea/ai-review/exclusions.json既有裁決等價,不重複新增排除條目。處理完成,依 code-review-resolve 流程關閉本議題。