feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #30

Closed
opened 2026-07-21 08:30:12 +00:00 by admin · 11 comments
Owner

變更摘要

本分支持續處理 AI Code Review findings,最新推送新增以下修正:

  • 修正建問題模式追蹤 issue 建立/寫入失敗時的降級路徑:改把暫存留言回發 PR,後續走原本 PR 留言與 findings 檔流程。
  • 強化嚴重 finding 的阻擋保證:若未成功產生 [failure] 結果 commit,主流程直接回傳 1,避免嚴重問題 fail-open。
  • 建問題模式新增 PR 追蹤 issue 連結前,會先把舊追蹤 issue 連結標註為過時,避免 PR 上累積多個互相矛盾的 issue 入口。
  • 抽出 appendRedactedOutput,統一 agentFailureDetail 的 stderr/stdout 遮罩與限長處理。
  • 精簡 pushWithCredential 正文註解,避免和 JSDoc 重複。
  • 新增 resolveOldIssueLinkComments 單元測試。
  • 回寫 findings wrapper:本輪移除 4 筆已解決 findings;目前剩餘 30 筆,皆為警告/建議。

影響範圍

  • src/index.js:建問題模式 fallback、failure commit 保證、舊追蹤連結處理。
  • src/lib/review.js:新增舊追蹤 issue 連結標註 helper。
  • src/lib/diagnostics.js:共用失敗輸出附加 helper。
  • src/lib/gitrepo.js:推送註解整理。
  • test/review.test.js:新增舊追蹤連結標註測試。
  • .gitea/ai-review/findings/*.json:移除本輪已處理 findings。

驗證

  • npm test 通過:11 tests / 0 failed。
  • git diff --check 通過。

風險與注意事項

  • 建問題模式若追蹤 issue 建立後、部分留言寫入失敗,降級流程會把暫存情境留言改發到 PR;遠端可能仍留下部分完成的 issue,需要人工依 PR 上最新結果判斷。
  • 剩餘 findings 未在本輪硬改,包含 README 深連結、手動時間戳、merge-base / push 流程測試與較大的主流程抽象拆分。

本問題由 AI Code Review 依 PR #6 的審查結果自動建立,問題明細見下方留言。

<!-- ai-code-review --> ## 變更摘要 本分支持續處理 AI Code Review findings,最新推送新增以下修正: - 修正建問題模式追蹤 issue 建立/寫入失敗時的降級路徑:改把暫存留言回發 PR,後續走原本 PR 留言與 findings 檔流程。 - 強化嚴重 finding 的阻擋保證:若未成功產生 `[failure]` 結果 commit,主流程直接回傳 1,避免嚴重問題 fail-open。 - 建問題模式新增 PR 追蹤 issue 連結前,會先把舊追蹤 issue 連結標註為過時,避免 PR 上累積多個互相矛盾的 issue 入口。 - 抽出 `appendRedactedOutput`,統一 `agentFailureDetail` 的 stderr/stdout 遮罩與限長處理。 - 精簡 `pushWithCredential` 正文註解,避免和 JSDoc 重複。 - 新增 `resolveOldIssueLinkComments` 單元測試。 - 回寫 findings wrapper:本輪移除 4 筆已解決 findings;目前剩餘 30 筆,皆為警告/建議。 ## 影響範圍 - `src/index.js`:建問題模式 fallback、failure commit 保證、舊追蹤連結處理。 - `src/lib/review.js`:新增舊追蹤 issue 連結標註 helper。 - `src/lib/diagnostics.js`:共用失敗輸出附加 helper。 - `src/lib/gitrepo.js`:推送註解整理。 - `test/review.test.js`:新增舊追蹤連結標註測試。 - `.gitea/ai-review/findings/*.json`:移除本輪已處理 findings。 ## 驗證 - `npm test` 通過:11 tests / 0 failed。 - `git diff --check` 通過。 ## 風險與注意事項 - 建問題模式若追蹤 issue 建立後、部分留言寫入失敗,降級流程會把暫存情境留言改發到 PR;遠端可能仍留下部分完成的 issue,需要人工依 PR 上最新結果判斷。 - 剩餘 findings 未在本輪硬改,包含 README 深連結、手動時間戳、merge-base / push 流程測試與較大的主流程抽象拆分。 --- > 本問題由 AI Code Review 依 PR #6 的審查結果自動建立,問題明細見下方留言。
Author
Owner

🤖 AI Code Review|審查工具

項目 內容
工具 codex
版本 codex-cli 0.144.6
模型 gpt-5.5
審查 commit 43ad2b56d27429aa3c812522dc1d4fedce4a9b76
Run Job #75
flowchart LR
    A[整理 git diff] --> B[⚔️ 攻擊方找問題]
    B --> C[🛡️ 防守方裁決]
    C --> D[保存 findings]
    D --> E[留言到 PR]
<!-- ai-code-review --> ## 🤖 AI Code Review|審查工具 | 項目 | 內容 | | --- | --- | | 工具 | `codex` | | 版本 | `codex-cli 0.144.6` | | 模型 | `gpt-5.5` | | 審查 commit | `43ad2b56d27429aa3c812522dc1d4fedce4a9b76` | | Run Job | [#75](https://gitea.jsc.idv.tw/node-actions/ai-code-review/actions/runs/1644) | ```mermaid flowchart LR A[整理 git diff] --> B[⚔️ 攻擊方找問題] B --> C[🛡️ 防守方裁決] C --> D[保存 findings] D --> E[留言到 PR] ```
Author
Owner

📋 變更摘要(送審 git diff)

檔案 用途 git diff 長度 最後更新時間
action.yml 定義 Action 參數與執行入口 86 行/3883 字元 2026/07/21 16:26:30
package.json 管理套件資訊與測試指令 15 行/417 字元 2026/07/21 13:46:43
readme.md 說明專案功能與使用流程 280 行/23916 字元(過長截斷送審) 2026/07/21 14:39:42
src/index.js 編排 AI 審查主流程 428 行/19279 字元(過長截斷送審) 2026/07/21 15:57:53
src/lib/agents.js 偵測並執行 AI CLI 工具 14 行/503 字元 2026/07/20 09:46:12
src/lib/context.js 載入 workflow 執行環境 15 行/769 字元 2026/07/20 17:24:18
src/lib/diagnostics.js 整理並遮罩失敗診斷 89 行/3096 字元 2026/07/21 15:57:53
src/lib/gitea.js 封裝 Gitea API 操作 130 行/5824 字元 2026/07/21 14:39:42
src/lib/gitref.js 驗證安全的 git 分支名稱 39 行/1098 字元 2026/07/21 16:26:30
src/lib/gitrepo.js 封裝 git 差異與提交操作 231 行/9499 字元 2026/07/21 16:26:30
src/lib/review.js 處理審查邏輯與結果 576 行/24543 字元(過長截斷送審) 2026/07/21 15:57:53
src/lib/roles.js 載入並分類審查角色 14 行/586 字元 2026/07/20 09:46:12
src/lib/templates.js 產生 PR 留言模板 165 行/5978 字元 2026/07/21 14:39:42
test/gitea.test.js 測試 Gitea API 封裝 80 行/2220 字元 2026/07/21 14:39:42
test/gitrepo.test.js 測試 git 分支與倉庫邏輯 32 行/866 字元 2026/07/21 16:26:30
test/review.test.js 測試審查與診斷流程 143 行/4469 字元 2026/07/21 15:57:53

共 16 個檔案納入審查;另有 13 個檔案依 .reviewignore 排除。

<!-- ai-code-review --> ## 📋 變更摘要(送審 git diff) | 檔案 | 用途 | git diff 長度 | 最後更新時間 | | --- | --- | --- | --- | | `action.yml` | 定義 Action 參數與執行入口 | 86 行/3883 字元 | 2026/07/21 16:26:30 | | `package.json` | 管理套件資訊與測試指令 | 15 行/417 字元 | 2026/07/21 13:46:43 | | `readme.md` | 說明專案功能與使用流程 | 280 行/23916 字元(過長截斷送審) | 2026/07/21 14:39:42 | | `src/index.js` | 編排 AI 審查主流程 | 428 行/19279 字元(過長截斷送審) | 2026/07/21 15:57:53 | | `src/lib/agents.js` | 偵測並執行 AI CLI 工具 | 14 行/503 字元 | 2026/07/20 09:46:12 | | `src/lib/context.js` | 載入 workflow 執行環境 | 15 行/769 字元 | 2026/07/20 17:24:18 | | `src/lib/diagnostics.js` | 整理並遮罩失敗診斷 | 89 行/3096 字元 | 2026/07/21 15:57:53 | | `src/lib/gitea.js` | 封裝 Gitea API 操作 | 130 行/5824 字元 | 2026/07/21 14:39:42 | | `src/lib/gitref.js` | 驗證安全的 git 分支名稱 | 39 行/1098 字元 | 2026/07/21 16:26:30 | | `src/lib/gitrepo.js` | 封裝 git 差異與提交操作 | 231 行/9499 字元 | 2026/07/21 16:26:30 | | `src/lib/review.js` | 處理審查邏輯與結果 | 576 行/24543 字元(過長截斷送審) | 2026/07/21 15:57:53 | | `src/lib/roles.js` | 載入並分類審查角色 | 14 行/586 字元 | 2026/07/20 09:46:12 | | `src/lib/templates.js` | 產生 PR 留言模板 | 165 行/5978 字元 | 2026/07/21 14:39:42 | | `test/gitea.test.js` | 測試 Gitea API 封裝 | 80 行/2220 字元 | 2026/07/21 14:39:42 | | `test/gitrepo.test.js` | 測試 git 分支與倉庫邏輯 | 32 行/866 字元 | 2026/07/21 16:26:30 | | `test/review.test.js` | 測試審查與診斷流程 | 143 行/4469 字元 | 2026/07/21 15:57:53 | > 共 16 個檔案納入審查;另有 13 個檔案依 `.reviewignore` 排除。
Author
Owner

⚔️ 攻擊方登場

角色 面向 個性
🗡️ Assassin 安全性(security) 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用
🎼 Bard 風格(style) 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版
🧰 Leo 可維護性(maintainability) 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來
🔮 Mage 邏輯(logic) 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」
🧪 Maya 測試(testing) 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑
Rogue 效率(efficiency) 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」
<!-- ai-code-review --> ## ⚔️ 攻擊方登場 | 角色 | 面向 | 個性 | | --- | --- | --- | | 🗡️ **Assassin** | 安全性(security) | 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用 | | 🎼 **Bard** | 風格(style) | 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版 | | 🧰 **Leo** | 可維護性(maintainability) | 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來 | | 🔮 **Mage** | 邏輯(logic) | 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」 | | 🧪 **Maya** | 測試(testing) | 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑 | | ⚡ **Rogue** | 效率(efficiency) | 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」 |
Author
Owner

🛡️ 防守方登場

角色 面向 個性
🛡️ Paladin 裁決(verdict) 沉穩公正、就事論事,不護短也不冤枉,只依排除事項與原始碼脈絡裁定問題成立與否
<!-- ai-code-review --> ## 🛡️ 防守方登場 | 角色 | 面向 | 個性 | | --- | --- | --- | | 🛡️ **Paladin** | 裁決(verdict) | 沉穩公正、就事論事,不護短也不冤枉,只依排除事項與原始碼脈絡裁定問題成立與否 |
Author
Owner

🔴 嚴重|🔮 Mage

位置src/index.js 第 134–139 行

問題描述

這裡把「本輪審查」改成即使找到嚴重 finding 也回傳 0,並依賴後續 [ai-review-bot][failure] 結果 commit 觸發下一輪才讓檢查失敗。最小重現情境:PR 內有 1 條嚴重問題,但 commitFindings() 因分支保護、token 無 push 權限、遠端競態或 PAT 無法觸發 CI 而回傳 false;本輪仍成功結束,且沒有下一輪 failure commit 可被步驟 1 讀到,嚴重問題就被靜默放行。未驗證「結果 commit 一定成功且一定觸發下一輪」這個假設時,它就是流程成敗判定的單點失效。

修改建議

嚴重 finding 已確認後,若 failure 結果 commit/push 沒有成功產生,就應在本輪直接回傳 1;只有在確認 failure commit 已成功推送時,才可把失敗狀態交給下一輪快速回報。也就是:severe.length > 0 && !resultCommitPushed 必須阻擋。

建議寫法

const result = severe.length === 0 ? 'success' : 'failure';
let pushed = false;
if (filesToCommit.length > 0) {
  pushed = commitFindings({ cwd, ctx, files: filesToCommit, result });
}

if (severe.length > 0 && !pushed) {
  log('收尾', 'ERR', '已有嚴重問題,但 failure 結果 commit 未成功產生;本輪直接以失敗收場。');
  return 1;
}

return 0;
<!-- ai-code-review --> ### 🔴 嚴重|🔮 Mage **位置**:`src/index.js` 第 134–139 行 **問題描述** 這裡把「本輪審查」改成即使找到嚴重 finding 也回傳 0,並依賴後續 `[ai-review-bot][failure]` 結果 commit 觸發下一輪才讓檢查失敗。最小重現情境:PR 內有 1 條嚴重問題,但 `commitFindings()` 因分支保護、token 無 push 權限、遠端競態或 PAT 無法觸發 CI 而回傳 false;本輪仍成功結束,且沒有下一輪 failure commit 可被步驟 1 讀到,嚴重問題就被靜默放行。未驗證「結果 commit 一定成功且一定觸發下一輪」這個假設時,它就是流程成敗判定的單點失效。 **修改建議** 嚴重 finding 已確認後,若 failure 結果 commit/push 沒有成功產生,就應在本輪直接回傳 1;只有在確認 failure commit 已成功推送時,才可把失敗狀態交給下一輪快速回報。也就是:`severe.length > 0 && !resultCommitPushed` 必須阻擋。 **建議寫法** ``` const result = severe.length === 0 ? 'success' : 'failure'; let pushed = false; if (filesToCommit.length > 0) { pushed = commitFindings({ cwd, ctx, files: filesToCommit, result }); } if (severe.length > 0 && !pushed) { log('收尾', 'ERR', '已有嚴重問題,但 failure 結果 commit 未成功產生;本輪直接以失敗收場。'); return 1; } return 0; ```
Author
Owner

🟠 警告|🔮 Mage

位置src/index.js 第 201–209 行

問題描述

createIssueAndFlushBufferedComments() 先建立 trackingIssue,再逐則寫入暫存留言;但只要其中一則留言失敗,外層 catch 會呼叫 fallbackToPrComments(),把整批 pendingIssueCommentBodies 全部改貼回 PR。最小重現情境:追蹤 issue 建立成功,第一則工具留言也成功寫入 issue,第二則 diff 留言 API 回 500;流程降級後 PR 會收到全部暫存留言,而已建立的 issue 仍殘留第一則留言、沒有後續 finding、也可能沒有 PR 連結或相依關係。這會留下部分成功、部分降級的不一致狀態。

修改建議

flush 時應在每則留言成功後立刻從 pending 佇列移除,並明確處理「issue 已建立但 flush 失敗」的狀態:要嘛繼續沿用已建立 issue 並讓後續失敗冒泡,要嘛在降級前補一則 PR 診斷/連結並避免重貼已成功寫入 issue 的留言。

建議寫法

while (pendingIssueCommentBodies.length > 0) {
  const body = pendingIssueCommentBodies[0];
  await gitea.createCommentOnIssue(ctx, trackingIssue.number, body);
  pendingIssueCommentBodies.shift();
}
<!-- ai-code-review --> ### 🟠 警告|🔮 Mage **位置**:`src/index.js` 第 201–209 行 **問題描述** `createIssueAndFlushBufferedComments()` 先建立 `trackingIssue`,再逐則寫入暫存留言;但只要其中一則留言失敗,外層 catch 會呼叫 `fallbackToPrComments()`,把整批 `pendingIssueCommentBodies` 全部改貼回 PR。最小重現情境:追蹤 issue 建立成功,第一則工具留言也成功寫入 issue,第二則 diff 留言 API 回 500;流程降級後 PR 會收到全部暫存留言,而已建立的 issue 仍殘留第一則留言、沒有後續 finding、也可能沒有 PR 連結或相依關係。這會留下部分成功、部分降級的不一致狀態。 **修改建議** flush 時應在每則留言成功後立刻從 pending 佇列移除,並明確處理「issue 已建立但 flush 失敗」的狀態:要嘛繼續沿用已建立 issue 並讓後續失敗冒泡,要嘛在降級前補一則 PR 診斷/連結並避免重貼已成功寫入 issue 的留言。 **建議寫法** ``` while (pendingIssueCommentBodies.length > 0) { const body = pendingIssueCommentBodies[0]; await gitea.createCommentOnIssue(ctx, trackingIssue.number, body); pendingIssueCommentBodies.shift(); } ```
Author
Owner

🔵 建議|🎼 Bard

位置action.yml 第 3–3 行

問題描述

手動維護的「更新時間」已與本次檔案標示的最後更新時間不同步;樂譜開頭的拍號一錯,讀者後面每段註解都會多一分懷疑。同樣的不協調也出現在 readme.mdsrc/index.js 的 banner/文件時間。

修改建議

移除這類容易走調的手動時間戳,或改由發布流程自動產生。若一定要保留,請讓所有檔案的時間標示與本次變更一致。

<!-- ai-code-review --> ### 🔵 建議|🎼 Bard **位置**:`action.yml` 第 3–3 行 **問題描述** 手動維護的「更新時間」已與本次檔案標示的最後更新時間不同步;樂譜開頭的拍號一錯,讀者後面每段註解都會多一分懷疑。同樣的不協調也出現在 `readme.md` 與 `src/index.js` 的 banner/文件時間。 **修改建議** 移除這類容易走調的手動時間戳,或改由發布流程自動產生。若一定要保留,請讓所有檔案的時間標示與本次變更一致。
Author
Owner

🔵 建議|🎼 Bard

位置src/index.js 第 199–199 行

問題描述

createIssueAndFlushBufferedComments 這個名稱把「建立 issue」與「flush 暫存留言」兩個實作細節硬串在一起,像一句過長的歌詞;呼叫點讀起來偏機械,沒有清楚表達業務意圖。

修改建議

改成較語意化的命名,例如 openTrackingIssuecreateTrackingIssueWithContext,讓讀者先理解目的,再從函式內容看見 flush 的細節。

<!-- ai-code-review --> ### 🔵 建議|🎼 Bard **位置**:`src/index.js` 第 199–199 行 **問題描述** `createIssueAndFlushBufferedComments` 這個名稱把「建立 issue」與「flush 暫存留言」兩個實作細節硬串在一起,像一句過長的歌詞;呼叫點讀起來偏機械,沒有清楚表達業務意圖。 **修改建議** 改成較語意化的命名,例如 `openTrackingIssue` 或 `createTrackingIssueWithContext`,讓讀者先理解目的,再從函式內容看見 flush 的細節。
Author
Owner

🔵 建議|🧪 Maya

位置src/lib/gitref.js 第 12–24 行

問題描述

assertSafeBranchRef 目前只測了一個正常分支與一個 ../../ 路徑穿越案例;但這個函式承擔 refspec 安全邊界,新增的空值、前後斜線、反斜線、以及 git check-ref-format 拒絕的格式都沒有案例。邊界沒被驗證時,未來調整條件很容易放過不合法 ref。

修改建議

補上表格測試,至少涵蓋空字串、純空白、/feature、feature/、feature\x、feature..x、feature.lock、feature@{x},並斷言錯誤訊息能區分「不安全」與「不合法 git 分支名稱」。

<!-- ai-code-review --> ### 🔵 建議|🧪 Maya **位置**:`src/lib/gitref.js` 第 12–24 行 **問題描述** assertSafeBranchRef 目前只測了一個正常分支與一個 ../../ 路徑穿越案例;但這個函式承擔 refspec 安全邊界,新增的空值、前後斜線、反斜線、以及 git check-ref-format 拒絕的格式都沒有案例。邊界沒被驗證時,未來調整條件很容易放過不合法 ref。 **修改建議** 補上表格測試,至少涵蓋空字串、純空白、/feature、feature/、feature\\x、feature..x、feature.lock、feature@{x},並斷言錯誤訊息能區分「不安全」與「不合法 git 分支名稱」。
Author
Owner

🔴 嚴重|🔮 Mage

位置src/index.js 第 134–139 行

問題描述

這裡把「本輪審查」改成即使找到嚴重 finding 也回傳 0,並依賴後續 [ai-review-bot][failure] 結果 commit 觸發下一輪才讓檢查失敗。最小重現情境:PR 內有 1 條嚴重問題,但 commitFindings() 因分支保護、token 無 push 權限、遠端競態或 PAT 無法觸發 CI 而回傳 false;本輪仍成功結束,且沒有下一輪 failure commit 可被步驟 1 讀到,嚴重問題就被靜默放行。未驗證「結果 commit 一定成功且一定觸發下一輪」這個假設時,它就是流程成敗判定的單點失效。

修改建議

嚴重 finding 已確認後,若 failure 結果 commit/push 沒有成功產生,就應在本輪直接回傳 1;只有在確認 failure commit 已成功推送時,才可把失敗狀態交給下一輪快速回報。也就是:severe.length > 0 && !resultCommitPushed 必須阻擋。

建議寫法

const result = severe.length === 0 ? 'success' : 'failure';
let pushed = false;
if (filesToCommit.length > 0) {
  pushed = commitFindings({ cwd, ctx, files: filesToCommit, result });
}

if (severe.length > 0 && !pushed) {
  log('收尾', 'ERR', '已有嚴重問題,但 failure 結果 commit 未成功產生;本輪直接以失敗收場。');
  return 1;
}

return 0;

如果沒有權限,不管有沒有嚴重問題,都讓工作流失敗

> <!-- ai-code-review --> > ### 🔴 嚴重|🔮 Mage > > **位置**:`src/index.js` 第 134–139 行 > > **問題描述** > > 這裡把「本輪審查」改成即使找到嚴重 finding 也回傳 0,並依賴後續 `[ai-review-bot][failure]` 結果 commit 觸發下一輪才讓檢查失敗。最小重現情境:PR 內有 1 條嚴重問題,但 `commitFindings()` 因分支保護、token 無 push 權限、遠端競態或 PAT 無法觸發 CI 而回傳 false;本輪仍成功結束,且沒有下一輪 failure commit 可被步驟 1 讀到,嚴重問題就被靜默放行。未驗證「結果 commit 一定成功且一定觸發下一輪」這個假設時,它就是流程成敗判定的單點失效。 > > **修改建議** > > 嚴重 finding 已確認後,若 failure 結果 commit/push 沒有成功產生,就應在本輪直接回傳 1;只有在確認 failure commit 已成功推送時,才可把失敗狀態交給下一輪快速回報。也就是:`severe.length > 0 && !resultCommitPushed` 必須阻擋。 > > **建議寫法** > > ``` > const result = severe.length === 0 ? 'success' : 'failure'; > let pushed = false; > if (filesToCommit.length > 0) { > pushed = commitFindings({ cwd, ctx, files: filesToCommit, result }); > } > > if (severe.length > 0 && !pushed) { > log('收尾', 'ERR', '已有嚴重問題,但 failure 結果 commit 未成功產生;本輪直接以失敗收場。'); > return 1; > } > > return 0; > ``` 如果沒有權限,不管有沒有嚴重問題,都讓工作流失敗
Member

處理結果

已處理本 issue 的 5 筆 findings:

項目 處理
嚴重:結果 commit/push 失敗會 fail-open 已改為只要需要推送結果檔但未成功 commit/push,就直接讓本輪 workflow 失敗;包含人工補充的「沒有權限時不論嚴重與否都失敗」。
警告:追蹤 issue flush 部分成功後降級會重貼 已改為每成功寫入一則 pending 留言就立刻移出佇列,降級時不再重貼已成功寫入 issue 的留言。
建議:手動更新時間不同步 已同步 action.yml、readme.md、啟動 banner 的更新時間。
建議:createIssueAndFlushBufferedComments 命名偏實作細節 已改名為 openTrackingIssue,呼叫點改以追蹤 issue 目的命名。
建議:assertSafeBranchRef 邊界測試不足 已補空值、前後斜線、反斜線、..、git 不合法 ref 等測試。

驗證

  • npm test:15 tests / 0 failed
  • git diff --check:通過

回寫

已自 findings wrapper 移除本 issue 對應 5 筆 finding,並同步移除本輪修正涵蓋的舊時間戳 finding。
目前本地剩餘 findings:27 筆(警告 18、建議 9)。

<!-- ai-review-resolve --> ## 處理結果 已處理本 issue 的 5 筆 findings: | 項目 | 處理 | | --- | --- | | 嚴重:結果 commit/push 失敗會 fail-open | 已改為只要需要推送結果檔但未成功 commit/push,就直接讓本輪 workflow 失敗;包含人工補充的「沒有權限時不論嚴重與否都失敗」。 | | 警告:追蹤 issue flush 部分成功後降級會重貼 | 已改為每成功寫入一則 pending 留言就立刻移出佇列,降級時不再重貼已成功寫入 issue 的留言。 | | 建議:手動更新時間不同步 | 已同步 action.yml、readme.md、啟動 banner 的更新時間。 | | 建議:createIssueAndFlushBufferedComments 命名偏實作細節 | 已改名為 openTrackingIssue,呼叫點改以追蹤 issue 目的命名。 | | 建議:assertSafeBranchRef 邊界測試不足 | 已補空值、前後斜線、反斜線、..、git 不合法 ref 等測試。 | ## 驗證 - npm test:15 tests / 0 failed - git diff --check:通過 ## 回寫 已自 findings wrapper 移除本 issue 對應 5 筆 finding,並同步移除本輪修正涵蓋的舊時間戳 finding。 目前本地剩餘 findings:27 筆(警告 18、建議 9)。
Sign in to join this conversation.
No labels
2 Participants
Notifications
Due Date
No due date set.
Reference: node-actions/ai-code-review#30