feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #28
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#28
Reference in New Issue
Block a user
變更摘要
本分支持續處理 AI Code Review findings,最新推送新增以下修正:
[failure]結果 commit,由下一輪 CI 快速回報失敗;即使 Gitea 問題相依 API 不支援,也不會只留下 issue 而缺少失敗檢查。createIssueAndFlushBufferedComments改回依序寫入暫存情境留言,保留工具、diff、攻擊方、防守方等流程順序。src/lib/diagnostics.js模組,移除review.__test測試後門。resultFilesToCommit純函式與測試,鎖定建問題模式嚴重/非嚴重結果檔提交規則。既有本分支重點
resolveMergeBase/commitAndPushFindings的分支 ref 驗證,拒絕空值、路徑穿越與不合法 git branch 名稱。pushWithCredential,以 Gitea server origin 建立 extraheader scope,並驗證 push remote 與 server origin 相符。Authorization: Bearer ...遮罩規則,避免只遮到Bearer而留下 token 本體。issueFindingCommentJSDoc,明確涵蓋嚴重、警告與建議的共用 issue 留言模板。node --test測試腳本與 Gitea / gitrepo / review / diagnostics 契約測試。影響範圍
src/index.js:建問題模式結果提交規則、情境留言順序、空 findings 快速路徑。src/lib/diagnostics.js/src/lib/review.js:診斷與遮罩模組邊界調整。src/lib/gitrepo.js:ref 安全檢查、push 認證 scope 防護。src/lib/templates.js:issue finding 留言模板文件對齊。test/*.test.js/package.json:新增零相依 Node 測試。.gitea/ai-review/findings/*.json:移除本輪已處理 findings。驗證
npm test通過:10 tests / 0 failed。風險與注意事項
🤖 AI Code Review|審查工具
codexcodex-cli 0.144.6gpt-5.5d424447d1502f49538fcb3093d23b5ac7bfa16c5📋 變更摘要(送審 git diff)
action.ymlpackage.jsonreadme.mdsrc/index.jssrc/lib/agents.jssrc/lib/context.jssrc/lib/diagnostics.jssrc/lib/gitea.jssrc/lib/gitrepo.jssrc/lib/review.jssrc/lib/roles.jssrc/lib/templates.jstest/gitea.test.jstest/gitrepo.test.jstest/review.test.js⚔️ 攻擊方登場
🛡️ 防守方登場
🔴 嚴重|🗡️ Assassin
位置:
src/index.js第 344–348 行問題描述
建問題模式在
addIssueDependency失敗時只記錄警告,接著本輪仍會回傳 0;若commitFindings後續因沒有實際 diff 可提交而沒有產生[failure]結果 commit,攻擊者只要讓嚴重 finding 被搬到追蹤 issue,且目標 Gitea 未啟用 issue dependencies 或 token 權限不足,就會 fail-open:PR 既沒有相依阻擋,也沒有失敗檢查阻擋合併。修改建議
有嚴重問題時,相依關係設定失敗應視為阻擋條件:要嘛直接回傳 1,要嘛確認 failure 結果 commit 已成功產生後才允許本輪回傳 0。不要把阻擋機制失效降級成純警告。
🟠 警告|🔮 Mage
位置:
src/index.js第 330–338 行問題描述
在建問題模式下,這段新增的 PR 回貼 issue 連結會在每次審查有保留問題時都新增一則 PR 留言,但同一流程前面明確跳過
resolveOldComments(建問題模式不清理 PR 舊留言)。最小重現:PR 第一次審查建立 issue #10 並在 PR 留連結;後續推新 commit 再跑一次,建立 issue #11 並再留一則連結。PR 上會同時存在 #10 與 #11,舊 issue 可能已過時,讀者無法判斷哪個才是目前審查結果。修改建議
建問題模式也應對本 action 先前的 PR 連結留言做過時標記,或在新增連結前查找並更新既有連結留言。若要避免碰觸 issue 內的審查內容,清理範圍可限制在 PR 上含
MARK且標題為「已建立追蹤問題」的留言。🔵 建議|🎼 Bard
位置:
src/lib/diagnostics.js第 55–63 行問題描述
agentFailureDetail裡的stderr與stdout區塊幾乎同譜重奏:取值、slice、redact、判斷、push 只差欄位名。這種重複雖小,卻讓後續若要調整遮罩或長度時容易改一半走調。修改建議
建議抽出小 helper,例如
appendRedactedOutput(parts, label, value),讓 stderr/stdout 共用同一段處理節奏。🔵 建議|🎼 Bard
位置:
src/lib/gitrepo.js第 139–160 行問題描述
runFetch、tryMergeBase、firstError、strategies夾在resolveMergeBase主旋律中,使這個函式同時負責驗證、fetch 策略編排、診斷文字組裝與錯誤包裝。即使邏輯可行,閱讀節奏已偏密,維護者很難一眼分辨「主要流程」與「補救策略」。修改建議
建議將 fetch 策略與診斷收集抽成小函式,例如
fetchAndRecord、resolveMergeBaseWithStrategies,讓resolveMergeBase保留高階流程:驗證 baseRef → fetch base → 嘗試 merge-base → 補抓歷史。🔵 建議|🎼 Bard
位置:
src/lib/gitrepo.js第 317–346 行問題描述
pushWithCredential的 JSDoc 已經很完整,但正文註解再次長篇解釋 checkout token、PAT、extraheader 清空等細節;文件與程式內註解重複奏同一段旋律,反而稀釋真正需要看的程式碼。修改建議
保留 JSDoc 的背景說明,函式內註解縮成操作提示即可,例如只說明「先清空 checkout extraheader,再注入本次 PAT header」。
如果新建議題失敗,則改用原本的檔案處理流程
本輪 code-review-resolve 處理結果
src/index.js[failure]結果 commit,主流程直接回傳 1,避免 fail-open。src/index.jssrc/lib/diagnostics.jsappendRedactedOutput,讓 stderr/stdout 共用遮罩與限長流程。src/lib/gitrepo.jspushWithCredential正文註解,保留 JSDoc 背景說明。src/lib/gitrepo.jsresolveMergeBase的較大型抽象拆分屬維護性重構,未在本輪硬改。驗證:
npm test通過(11 tests / 0 failed),git diff --check通過。來源 wrapper 已回寫:
.gitea/ai-review/findings/2026-07-21-14:42:39.json目前保留 1 筆待後續處理 finding。