feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #27
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#27
Reference in New Issue
Block a user
變更摘要
本分支持續處理 AI Code Review findings,最新推送新增以下修正:
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 契約測試。影響範圍
src/lib/gitrepo.js:ref 安全檢查、push 認證 scope 防護。src/lib/review.js:AI CLI 失敗診斷政策、遮罩規則、issue findings 留言批次發布。src/index.js:建問題模式情境留言批次沖刷。src/lib/templates.js:issue finding 留言模板文件對齊。test/*.test.js/package.json:新增零相依 Node 測試。.gitea/ai-review/findings/*.json:移除本輪已處理 findings。驗證
npm test通過:8 tests / 0 failed。風險與注意事項
🤖 AI Code Review|審查工具
codexcodex-cli 0.144.6gpt-5.59e7f8a2a0a807c26e12e9bf0381e7decfb9e5568📋 變更摘要(送審 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⚔️ 攻擊方登場
🛡️ 防守方登場
🔴 嚴重|🔮 Mage
位置:
src/index.js第 149–153 行問題描述
這個變更把「本輪審查」改成即使有嚴重問題也回傳 0,並假設後續由
[ai-review-bot][failure]結果 commit 觸發下一輪 CI 再失敗。最小重現:workflow 仍依 action.yml 常見用法傳入自動 token(或任一不會觸發 synchronize CI 的 token)→ AI 找到 1 條嚴重問題 → 本輪成功建立留言與 push 結果 commit,但該 push 不觸發下一輪 → 沒有任何檢查讀到[failure]commit,PR 最終呈現通過。這是未驗證的外部時序假設;嚴重 finding 會被靜默放行。修改建議
不要讓失敗判定完全依賴下一輪 CI。若
severe.length > 0,本輪在完成留言與結果落地後仍應回傳 1;或至少提供明確 input 控制 direct-fail,並在無法驗證 token 會觸發 CI 時預設直接 fail。🟠 警告|🔮 Mage
位置:
src/lib/review.js第 707–718 行問題描述
postOthersToIssue以並行方式送出多則 issue 留言時,issue 上的實際留言順序取決於 API 回應與資料庫寫入完成順序,不保證等於已排序的 findings 順序。最小重現:兩條建議分別位於a.js:10與a.js:20,第二個 API 較快完成,issue 會先出現第 20 行問題,再出現第 10 行問題;使用者逐檔逐行處理時順序會錯亂。修改建議
若 issue 留言順序是介面契約,逐則
await gitea.createCommentOnIssue(...)發送;若要保留並行,需在每則留言標題加入穩定序號,例如2/5,讓非同步完成不破壞閱讀順序。🔵 建議|🎼 Bard
位置:
action.yml第 22–24 行問題描述
manifest 的註解忽然奏起一整段實作細節:PAT、CI 觸發、主程式步驟 1 全擠在 input 說明旁,和同檔其他「介面用途」型註解的節奏不一致。讀者只是想知道 token 該填什麼,卻被迫聽完流程旁白。
修改建議
把 action.yml 留給介面契約;細節移到 README 或主流程文件。此處可濃縮成「建議使用可觸發 CI 的 PAT」即可。
建議寫法
🔵 建議|🎼 Bard
位置:
readme.md第 40–47 行問題描述
mermaid 圖的節點 ID 旋律走岔了:畫面標示是 3→4→5→...→8→2→9,但節點名稱卻用 S3、S4、S2 來回跳。即使流程語意想表達「步驟 2 延後」,節點 ID 與視覺順序不一致,會讓維護者在對照圖與文字時多繞一圈。
修改建議
讓節點 ID 維持閱讀順序,將真正的流程步驟放在節點文字裡。例如用 N2、N3 或 A、B 這類中性 ID,避免 S2 看起來像應該排在 S1 後面。
建議寫法
🔵 建議|🎼 Bard
位置:
src/index.js第 122–139 行問題描述
main()的 JSDoc 從函式說明變成流程章回。步驟、例外模式、issue 建立時機、相依關係、commit 規則全塞在同一段,和程式下方已存在的分段註解重複,讀起來像同一旋律被兩把琴同時彈奏。修改建議
JSDoc 保留函式職責、回傳值與關鍵模式差異即可;完整 10 步驟流程交給 README 或下方區塊註解。這會讓
main()開頭更快進入正題。🔵 建議|🎼 Bard
位置:
src/lib/diagnostics.js第 45–47 行問題描述
res這個參數名太短促,和檔內其他text、parts、stderr、stdout這些直白命名相比顯得含糊。診斷工具本該讓人少猜一點,這裡卻讓讀者先猜它是哪一種 result。修改建議
改用
result或agentResult,讓函式簽名本身就說清楚資料來源。建議寫法
🔵 建議|🎼 Bard
位置:
test/gitea.test.js第 8–8 行問題描述
fn是一個太倉促的縮寫,放在測試輔助函式裡尤其刺耳;同一行已有handler這種完整命名,fn顯得像漏拍的音符。修改建議
改成
callback或run,讓呼叫意圖更清楚,也和此專案偏完整語意的命名風格一致。建議寫法
這是不是設計錯誤,就是希望由下一輪判斷 failure 才讓工作流失敗,因此把這個問題排除
本輪 code-review-resolve 處理結果
已處理本 issue 留言中的 findings:
postSevereToIssue/postOthersToIssue改為依序送出,測試鎖定同時只送一則action.ymltoken 註解,避免把主流程細節塞在 input 說明N*,避免視覺順序與節點 ID 打架issueBuffer→pendingIssueCommentBodies、issue→trackingIssue、issueLinkComment→prIssueLinkComment、dependency 參數改為 blocked/blocking issuefn改為callback驗證:
npm test通過(10 tests / 0 failed)。本輪 findings wrapper 已回寫,
.gitea/ai-review/findings/2026-07-21-14:27:42.json目前保留 0 筆 finding。