feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #23
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#23
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.5d8dd5ce92e26b92c0b5064c25147882d20a2b5df📋 變更摘要(送審 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/index.js第 397–411 行問題描述
建問題模式下,
filesToCommit只有在exclusionsChanged時才包含檔案;若本次有嚴重問題但沒有任何 excluded finding,程式會建立追蹤 issue、嘗試加 dependency,接著因「exclusions.json 無變更」略過 commit/push,最後又回傳 0。最小重現:create-issue: true、kept = [{ severity: '嚴重' }]、excluded = []。結果沒有[failure]commit 可觸發下一輪,也沒有本輪 exit 1,嚴重問題不會讓檢查失敗。修改建議
建問題模式也必須保證嚴重問題會產生可觀測的失敗訊號。若仍採下一輪快速回報設計,嚴重問題時至少要 commit 一個結果標記檔;若沒有檔案可 commit,應直接回傳 1。
建議寫法
🔴 嚴重|🔮 Mage
位置:
src/index.js第 409–415 行問題描述
本輪審查最後一律
return 0,把「有嚴重問題」的失敗狀態完全交給下一輪讀取[failure]commit。最小重現:workflow 使用自動 token(例如GITHUB_TOKEN/gitea.token)執行,AI 找到至少 1 條嚴重問題,commitFindings(... result: 'failure')push 成功,但該 token 推送不會再觸發 CI;本輪已回傳 0,下一輪也不存在,PR 檢查會顯示通過。這裡把「PAT 一定會觸發下一輪」當成未驗證前提,前提不成立時嚴重 finding 會被放行。修改建議
不要讓目前 run 在有嚴重問題時無條件成功。可行方向:維持
severe.length > 0時回傳 1;或在啟用延後失敗機制前,明確驗證 token 為可觸發 CI 的 PAT 且結果 commit 實際產生下一輪,否則 fallback 為本輪 exit 1。建議寫法
🟠 警告|🗡️ Assassin
位置:
action.yml第 19–22 行問題描述
這段新增說明鼓勵呼叫端傳入「能觸發 CI 的 PAT」。攻擊者最喜歡這種長效、高權限、可觸發 workflow 的憑證:若 action 跑在不可信 PR、AI CLI 被 prompt injection 誘導讀環境變數,或同 repo PR 可改動本 action 程式碼,就可能把 PAT 外送或濫用成寫入 repo/觸發 CI 的跳板。
修改建議
不要把長效 PAT 當建議預設。改用最小權限、短效的 GitHub App/Gitea App token,並明確禁止在不可信 fork PR 傳入可寫 token。若目標只是回報檢查結果,優先用 status/check API 寫結果,不要靠 PAT push 再觸發下一輪 CI。
建議寫法
🔵 建議|🧰 Leo
位置:
readme.md第 58–131 行問題描述
README 的功能表把分支名稱與行號大量硬編在外部 URL 裡,這次已經需要整批
master改develop並同步多個#Lxx。這類文件會隨任何程式碼插行、函式移動或預設分支變更而失準,維護成本會線性累積,最後讀者點到的文件比沒有文件更誤導。修改建議
改用 repo 相對連結、不固定行號,或把這段功能表改由腳本從 JSDoc 自動產生。若需要連到特定實作,優先連到檔案或錨點,避免每次重排程式碼都要同步更新幾十個行號。
建議寫法
🔵 建議|🎼 Bard
位置:
src/lib/gitrepo.js第 302–310 行問題描述
pushWithCredential的參數名使用secret,但呼叫端與整份檔案脈絡都稱它為token。同一個概念忽然換了名字,像樂句中途轉了不必要的調,增加閱讀時的對照成本。修改建議
延續既有命名,把
secret改為token;若想強調不可外洩,可交給 JSDoc 說明,不必在參數名上另起一套稱呼。建議寫法
🔵 建議|🎼 Bard
位置:
src/lib/review.js第 31–40 行問題描述
這段註解的旋律前後失和:開頭寫「原始輸出預設隱藏」,下一句卻說預設附上 stderr 與 stdout 片段。讀者尚未進入程式碼,就已被兩個互相拉扯的描述絆住。
修改建議
請讓文件只唱一個調性:若目前設計是預設輸出遮罩後的診斷片段,就刪掉「原始輸出預設隱藏」或改成「原始輸出會先遮罩與截斷」。
🧩 code-review-resolve 處理進度
本議題為 AI Code Review 建問題模式的追蹤議題。以
--issue all併同.gitea/ai-review/findings/逐條處理後結果如下(對照目前程式碼與exclusions.json):src/index.js第 397–411 行src/index.js第 409–415 行action.yml第 19–22 行readme.md第 58–131 行src/lib/gitrepo.js第 302–310 行src/lib/review.js第 31–40 行小計:✅ 已解決 0 條、🚫 誤報(已列入 exclusions)2 條、⏭️ 待人工處理 4 條。
resolveMergeBase補抓策略調整、deepen PR HEAD改用 head SHA、留言閉包改名、push-tokeninput 移除等)。.gitea/ai-review/exclusions.json既有裁決等價,不重複新增排除條目。處理完成,依 code-review-resolve 流程關閉本議題。