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

Closed
opened 2026-07-21 05:49:59 +00:00 by admin · 11 comments
Owner

變更摘要

本 PR 將 ai-code-review action 分支的完整成果併入 develop,主要含四塊:

  1. 建問題模式重構(feat)create-issue: 'true' 時,審查留言(工具/diff/角色/嚴重問題/警告+建議)全部改發到追蹤 issue、不再張貼到 PR;不執行「舊留言標過時/resolve」;issue 延後到「確定有保留問題」才建立;無保留問題或無可審查變更則不建 issue、PR 也完全不留言(靜默通過);有問題時最後在 PR 回貼一則 issue 連結並補掛標籤,形成雙向關聯。
  2. 審查流程步驟調整(refactor):將「標記舊留言過時/resolve」提前到偵測 AI 工具之前,並依新順序重編所有步驟編號與說明。
  3. 修正(gitrepo):補抓淺層 checkout 的 base 歷史,避免 merge-base 計算失敗。
  4. 文件與 CI:補齊 action.ymlsrc 各模組文件、重建 readme.md,新增 .gitea/workflows/ci.yaml(多工具 code review 驗證)並啟用建問題模式。

影響範圍

範圍 說明
action 執行流程 src/index.js main() 依模式分流:留言去向、跳過 resolveOldComments、issue 延後建立、severe/others 導向 issue、有問題才在 PR 回貼連結
Gitea API src/lib/gitea.js 新增 addLabelsToIssue
留言模板 src/lib/templates.js 新增 issueLinkComment
審查核心 src/lib/review.js 新增 postSevereToIssue,移除 createIssueWithFindingssortFindingsForIssue
git base 解析 src/lib/gitrepo.js 補抓淺層 checkout 的 base 歷史
文件與 CI readme.mdaction.yml.gitea/workflows/ci.yaml.gitea/workflows/readme.md

風險與注意事項

  • 建問題模式行為明顯改變:啟用後 PR 上不再有審查留言(有問題時改為 issue + 一則連結留言;無問題時完全不留言),請確認團隊流程可接受。
  • 端對端行為需靠 CI 實測:本地僅完成語法與模組載入驗證,實際 issue/PR 互動需一次 CI 觸發確認。
  • readme.md 尚未反映「建問題模式導向 issue」的最新行為與新/移除的函式,建議後續以 doc-funcs 重建文件。
  • 各檔頭部「更新時間」時間戳仍為 2026/07/17 18:49:58,未刷新。

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

<!-- ai-code-review --> ## 變更摘要 本 PR 將 ai-code-review action 分支的完整成果併入 `develop`,主要含四塊: 1. **建問題模式重構(feat)**:`create-issue: 'true'` 時,審查留言(工具/diff/角色/嚴重問題/警告+建議)全部改發到追蹤 issue、不再張貼到 PR;不執行「舊留言標過時/resolve」;issue 延後到「確定有保留問題」才建立;**無保留問題或無可審查變更則不建 issue、PR 也完全不留言(靜默通過)**;有問題時最後在 PR 回貼一則 issue 連結並補掛標籤,形成雙向關聯。 2. **審查流程步驟調整(refactor)**:將「標記舊留言過時/resolve」提前到偵測 AI 工具之前,並依新順序重編所有步驟編號與說明。 3. **修正(gitrepo)**:補抓淺層 checkout 的 base 歷史,避免 merge-base 計算失敗。 4. **文件與 CI**:補齊 `action.yml`/`src` 各模組文件、重建 `readme.md`,新增 `.gitea/workflows/ci.yaml`(多工具 code review 驗證)並啟用建問題模式。 ## 影響範圍 | 範圍 | 說明 | | --- | --- | | action 執行流程 | `src/index.js` `main()` 依模式分流:留言去向、跳過 resolveOldComments、issue 延後建立、severe/others 導向 issue、有問題才在 PR 回貼連結 | | Gitea API | `src/lib/gitea.js` 新增 `addLabelsToIssue` | | 留言模板 | `src/lib/templates.js` 新增 `issueLinkComment` | | 審查核心 | `src/lib/review.js` 新增 `postSevereToIssue`,移除 `createIssueWithFindings`、`sortFindingsForIssue` | | git base 解析 | `src/lib/gitrepo.js` 補抓淺層 checkout 的 base 歷史 | | 文件與 CI | `readme.md`、`action.yml`、`.gitea/workflows/ci.yaml`、`.gitea/workflows/readme.md` | ## 風險與注意事項 - **建問題模式行為明顯改變**:啟用後 PR 上不再有審查留言(有問題時改為 issue + 一則連結留言;無問題時完全不留言),請確認團隊流程可接受。 - **端對端行為需靠 CI 實測**:本地僅完成語法與模組載入驗證,實際 issue/PR 互動需一次 CI 觸發確認。 - `readme.md` 尚未反映「建問題模式導向 issue」的最新行為與新/移除的函式,建議後續以 doc-funcs 重建文件。 - 各檔頭部「更新時間」時間戳仍為 `2026/07/17 18:49:58`,未刷新。 --- > 本問題由 AI Code Review 依 PR #6 的審查結果自動建立,問題明細見下方留言。
Author
Owner

🤖 AI Code Review|審查工具

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

📋 變更摘要(送審 git diff)

檔案 用途 git diff 長度 最後更新時間
action.yml 定義 Action 輸入與執行入口 88 行/4025 字元 2026/07/20 17:24:18
package.json 管理專案資訊與 npm 腳本 15 行/417 字元 2026/07/21 13:46:43
readme.md 說明 Action 用法與流程 276 行/23829 字元(過長截斷送審) 2026/07/20 16:01:05
src/index.js 編排 AI 審查主流程 360 行/16219 字元(過長截斷送審) 2026/07/21 13:46:39
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/gitea.js 封裝 Gitea API 操作 130 行/5744 字元 2026/07/20 18:04:23
src/lib/gitrepo.js 封裝 git 查詢與推送操作 276 行/11234 字元 2026/07/21 13:46:39
src/lib/review.js 處理審查結果與留言邏輯 590 行/25113 字元(過長截斷送審) 2026/07/21 13:46:39
src/lib/roles.js 載入並分類審查角色 14 行/586 字元 2026/07/20 09:46:12
src/lib/templates.js 產生 PR 留言模板 165 行/5974 字元 2026/07/21 13:46:39
test/gitea.test.js 測試 Gitea API 封裝 80 行/2208 字元 2026/07/21 13:46:43
test/gitrepo.test.js 測試 git 工具函式 31 行/836 字元 2026/07/21 13:46:43
test/review.test.js 測試審查輔助邏輯 81 行/2713 字元 2026/07/21 13:46:43

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

<!-- ai-code-review --> ## 📋 變更摘要(送審 git diff) | 檔案 | 用途 | git diff 長度 | 最後更新時間 | | --- | --- | --- | --- | | `action.yml` | 定義 Action 輸入與執行入口 | 88 行/4025 字元 | 2026/07/20 17:24:18 | | `package.json` | 管理專案資訊與 npm 腳本 | 15 行/417 字元 | 2026/07/21 13:46:43 | | `readme.md` | 說明 Action 用法與流程 | 276 行/23829 字元(過長截斷送審) | 2026/07/20 16:01:05 | | `src/index.js` | 編排 AI 審查主流程 | 360 行/16219 字元(過長截斷送審) | 2026/07/21 13:46:39 | | `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/gitea.js` | 封裝 Gitea API 操作 | 130 行/5744 字元 | 2026/07/20 18:04:23 | | `src/lib/gitrepo.js` | 封裝 git 查詢與推送操作 | 276 行/11234 字元 | 2026/07/21 13:46:39 | | `src/lib/review.js` | 處理審查結果與留言邏輯 | 590 行/25113 字元(過長截斷送審) | 2026/07/21 13:46:39 | | `src/lib/roles.js` | 載入並分類審查角色 | 14 行/586 字元 | 2026/07/20 09:46:12 | | `src/lib/templates.js` | 產生 PR 留言模板 | 165 行/5974 字元 | 2026/07/21 13:46:39 | | `test/gitea.test.js` | 測試 Gitea API 封裝 | 80 行/2208 字元 | 2026/07/21 13:46:43 | | `test/gitrepo.test.js` | 測試 git 工具函式 | 31 行/836 字元 | 2026/07/21 13:46:43 | | `test/review.test.js` | 測試審查輔助邏輯 | 81 行/2713 字元 | 2026/07/21 13:46:43 | > 共 14 個檔案納入審查;另有 10 個檔案依 `.reviewignore` 排除。
Author
Owner

🛡️ 防守方登場

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

🔴 嚴重|🗡️ Assassin

位置src/index.js 第 384–405 行

問題描述

建問題模式遇到嚴重 finding 時採取 fail-open:addIssueDependency 失敗只記 WRN 後繼續,而且若 exclusions.json 沒變更就略過 commit/push,最後本輪仍回傳 0。攻擊者只要讓目標 repo 未啟用 issue dependencies、token 權限不足,或讓相依 API 不可用,就能讓「嚴重資安問題」只留下 issue 連結,CI 檢查仍是綠燈,PR 可被合併。

修改建議

嚴重問題不能依賴可選功能來阻擋。建問題模式下只要 severe.length > 0,應保證產生不可忽略的阻擋訊號:相依建立失敗時直接失敗,或一律 push [failure] 結果 commit,或本輪直接 return 1。不要在嚴重問題存在且阻擋機制失效時靜默通過。

建議寫法

if (ctx.createIssue && issue && severe.length > 0) {
  try {
    await gitea.addIssueDependency(ctx, ctx.prNumber, issue.number);
  } catch (err) {
    log('建問題', 'ERR', `有嚴重問題但無法設定 PR 相依:${err.message}。`);
    return 1;
  }
}
<!-- ai-code-review --> ### 🔴 嚴重|🗡️ Assassin **位置**:`src/index.js` 第 384–405 行 **問題描述** 建問題模式遇到嚴重 finding 時採取 fail-open:`addIssueDependency` 失敗只記 WRN 後繼續,而且若 `exclusions.json` 沒變更就略過 commit/push,最後本輪仍回傳 0。攻擊者只要讓目標 repo 未啟用 issue dependencies、token 權限不足,或讓相依 API 不可用,就能讓「嚴重資安問題」只留下 issue 連結,CI 檢查仍是綠燈,PR 可被合併。 **修改建議** 嚴重問題不能依賴可選功能來阻擋。建問題模式下只要 `severe.length > 0`,應保證產生不可忽略的阻擋訊號:相依建立失敗時直接失敗,或一律 push `[failure]` 結果 commit,或本輪直接 `return 1`。不要在嚴重問題存在且阻擋機制失效時靜默通過。 **建議寫法** ``` if (ctx.createIssue && issue && severe.length > 0) { try { await gitea.addIssueDependency(ctx, ctx.prNumber, issue.number); } catch (err) { log('建問題', 'ERR', `有嚴重問題但無法設定 PR 相依:${err.message}。`); return 1; } } ```
Author
Owner

🟠 警告|🧰 Leo

位置src/lib/review.js 第 13–78 行

問題描述

agentFailureDetailredactSecrets 是新增的診斷/遮罩邏輯,但只透過 review.__test 這類測試後門暴露。這會把「內部函式」變成半公開 API:未來維護者看到 module.exports.__test.agentFailureDetail 時,很難判斷外部能不能依賴它,也容易在重構時誤傷測試或保留不該存在的匯出面。

修改建議

把診斷格式化拆到專門的小模組,例如 src/lib/agent-diagnostics.js,正式匯出 agentFailureDetail,由 review.js 和測試共同使用;或改成測試公開行為,不直接測內部私有函式。不要讓 production export 混入 __test 命名空間。

<!-- ai-code-review --> ### 🟠 警告|🧰 Leo **位置**:`src/lib/review.js` 第 13–78 行 **問題描述** `agentFailureDetail` 與 `redactSecrets` 是新增的診斷/遮罩邏輯,但只透過 `review.__test` 這類測試後門暴露。這會把「內部函式」變成半公開 API:未來維護者看到 `module.exports.__test.agentFailureDetail` 時,很難判斷外部能不能依賴它,也容易在重構時誤傷測試或保留不該存在的匯出面。 **修改建議** 把診斷格式化拆到專門的小模組,例如 `src/lib/agent-diagnostics.js`,正式匯出 `agentFailureDetail`,由 `review.js` 和測試共同使用;或改成測試公開行為,不直接測內部私有函式。不要讓 production export 混入 `__test` 命名空間。
Author
Owner

🟠 警告|🔮 Mage

位置src/index.js 第 235–238 行

問題描述

createIssueAndFlushBufferedCommentsPromise.all 同時送出暫存的工具、diff、攻擊方、防守方留言。這些留言有明確流程順序,但 HTTP 請求完成順序不保證一致。最小重現:issueBuffer 依序為 [工具, diff, 攻擊方, 防守方],若 diff 留言 API 延遲較高,Gitea 上可能先出現防守方登場再出現 diff 摘要,導致追蹤 issue 的審查脈絡錯序。

修改建議

對有順序語義的情境留言改成逐筆 await。若後續 finding 明細真的不要求順序,再只對那些留言批次並行。

建議寫法

for (const body of issueBuffer) {
  await gitea.createCommentOnIssue(ctx, issue.number, body);
}
issueBuffer.length = 0;
<!-- ai-code-review --> ### 🟠 警告|🔮 Mage **位置**:`src/index.js` 第 235–238 行 **問題描述** `createIssueAndFlushBufferedComments` 用 `Promise.all` 同時送出暫存的工具、diff、攻擊方、防守方留言。這些留言有明確流程順序,但 HTTP 請求完成順序不保證一致。最小重現:issueBuffer 依序為 `[工具, diff, 攻擊方, 防守方]`,若 diff 留言 API 延遲較高,Gitea 上可能先出現防守方登場再出現 diff 摘要,導致追蹤 issue 的審查脈絡錯序。 **修改建議** 對有順序語義的情境留言改成逐筆 `await`。若後續 finding 明細真的不要求順序,再只對那些留言批次並行。 **建議寫法** ``` for (const body of issueBuffer) { await gitea.createCommentOnIssue(ctx, issue.number, body); } issueBuffer.length = 0; ```
Author
Owner

🔵 建議|🎼 Bard

位置src/lib/review.js 第 17–17 行

問題描述

INPUT_LIMIT 這個名字像一顆沒有調性的音符:它和 PER_FILE_DIFF_LIMITTOTAL_DIFF_LIMIT 並列在模組頂層,卻沒有說明自己只服務於 agent 失敗診斷。讀者掃過常數區時,會誤以為它是某種通用輸入上限。

修改建議

將名稱收束到實際用途,和旁邊的 AGENT_DIAGNOSTIC_OUTPUT_LIMIT 保持同一旋律,例如 AGENT_DIAGNOSTIC_INPUT_LIMIT

建議寫法

const AGENT_DIAGNOSTIC_INPUT_LIMIT = 2_000;
<!-- ai-code-review --> ### 🔵 建議|🎼 Bard **位置**:`src/lib/review.js` 第 17–17 行 **問題描述** `INPUT_LIMIT` 這個名字像一顆沒有調性的音符:它和 `PER_FILE_DIFF_LIMIT`、`TOTAL_DIFF_LIMIT` 並列在模組頂層,卻沒有說明自己只服務於 agent 失敗診斷。讀者掃過常數區時,會誤以為它是某種通用輸入上限。 **修改建議** 將名稱收束到實際用途,和旁邊的 `AGENT_DIAGNOSTIC_OUTPUT_LIMIT` 保持同一旋律,例如 `AGENT_DIAGNOSTIC_INPUT_LIMIT`。 **建議寫法** ``` const AGENT_DIAGNOSTIC_INPUT_LIMIT = 2_000; ```
Author
Owner

🔵 建議|🎼 Bard

位置src/lib/review.js 第 31–31 行

問題描述

註解說「遮罩單行診斷文字」,但函式實際會接收任意文字、壓平換行與控制字元後再遮罩。這句說明比實作窄,讓文件的拍點稍微搶在程式前面。

修改建議

改成描述「將診斷文字正規化為單行並遮罩」,讓註解與實作同拍。

建議寫法

* 將診斷文字正規化為單行並遮罩其中的機密與控制字元,避免寫進 CI log 時外洩。
<!-- ai-code-review --> ### 🔵 建議|🎼 Bard **位置**:`src/lib/review.js` 第 31–31 行 **問題描述** 註解說「遮罩單行診斷文字」,但函式實際會接收任意文字、壓平換行與控制字元後再遮罩。這句說明比實作窄,讓文件的拍點稍微搶在程式前面。 **修改建議** 改成描述「將診斷文字正規化為單行並遮罩」,讓註解與實作同拍。 **建議寫法** ``` * 將診斷文字正規化為單行並遮罩其中的機密與控制字元,避免寫進 CI log 時外洩。 ```
Author
Owner

🟠 警告|🧪 Maya

位置src/index.js 第 409–414 行

問題描述

本輪審查改成無論是否有嚴重問題都回傳 0,失敗改靠 [failure] 結果 commit 的下一輪快速回報;這是會直接影響 CI 狀態的行為,但目前沒有測試驗證 severe.length > 0 時本輪仍回傳 0、commit 訊息帶 failure,且下一輪讀到 failure bot commit 才回傳 1。

修改建議

請補主流程測試把兩段行為分開驗證:第一段模擬本輪產生嚴重 finding,斷言 commitFindings/commitAndPushFindings 收到 failure 訊息且 main() 回傳 0;第二段模擬 latestCommitSubject() 回傳含 [ai-review-bot][failure] 的 commit subject,斷言 main() 回傳 1。

<!-- ai-code-review --> ### 🟠 警告|🧪 Maya **位置**:`src/index.js` 第 409–414 行 **問題描述** 本輪審查改成無論是否有嚴重問題都回傳 0,失敗改靠 `[failure]` 結果 commit 的下一輪快速回報;這是會直接影響 CI 狀態的行為,但目前沒有測試驗證 `severe.length > 0` 時本輪仍回傳 0、commit 訊息帶 failure,且下一輪讀到 failure bot commit 才回傳 1。 **修改建議** 請補主流程測試把兩段行為分開驗證:第一段模擬本輪產生嚴重 finding,斷言 `commitFindings`/`commitAndPushFindings` 收到 failure 訊息且 `main()` 回傳 0;第二段模擬 `latestCommitSubject()` 回傳含 `[ai-review-bot][failure]` 的 commit subject,斷言 `main()` 回傳 1。
Member

code-review-resolve 處理結果

結果 問題 處理
已解決 嚴重:建問題模式嚴重 finding 可能 fail-open 有嚴重問題時,建問題模式也會提交 findings 檔產生 [failure] 結果 commit;即使問題相依 API 不支援,也會由下一輪 CI 快速回報失敗。
已解決 review.__test 測試後門 已將診斷與遮罩邏輯抽出為正式 src/lib/diagnostics.js 模組,測試改用正式匯出。
已解決 暫存情境留言使用 Promise.all 可能打亂流程順序 createIssueAndFlushBufferedComments 已改回依序寫入,保留工具、diff、角色等情境留言順序。
已解決 INPUT_LIMIT 命名與用途不清 已改為 AGENT_DIAGNOSTIC_INPUT_LIMIT 並移到 diagnostics 模組。
已解決 redactSecrets 註解描述過窄 已更新為遮罩「診斷文字」並說明會壓平控制字元。
已解決 failure 結果 commit 行為缺測 已新增 resultFilesToCommit 測試,覆蓋建問題模式嚴重/非嚴重情境。

本 issue 解析出的 6 筆 finding 已全部處理;無只來自 issue 的待人工項目需要寫回 findings。

## code-review-resolve 處理結果 | 結果 | 問題 | 處理 | | --- | --- | --- | | ✅ 已解決 | 嚴重:建問題模式嚴重 finding 可能 fail-open | 有嚴重問題時,建問題模式也會提交 findings 檔產生 `[failure]` 結果 commit;即使問題相依 API 不支援,也會由下一輪 CI 快速回報失敗。 | | ✅ 已解決 | `review.__test` 測試後門 | 已將診斷與遮罩邏輯抽出為正式 `src/lib/diagnostics.js` 模組,測試改用正式匯出。 | | ✅ 已解決 | 暫存情境留言使用 `Promise.all` 可能打亂流程順序 | `createIssueAndFlushBufferedComments` 已改回依序寫入,保留工具、diff、角色等情境留言順序。 | | ✅ 已解決 | `INPUT_LIMIT` 命名與用途不清 | 已改為 `AGENT_DIAGNOSTIC_INPUT_LIMIT` 並移到 diagnostics 模組。 | | ✅ 已解決 | `redactSecrets` 註解描述過窄 | 已更新為遮罩「診斷文字」並說明會壓平控制字元。 | | ✅ 已解決 | failure 結果 commit 行為缺測 | 已新增 `resultFilesToCommit` 測試,覆蓋建問題模式嚴重/非嚴重情境。 | 本 issue 解析出的 6 筆 finding 已全部處理;無只來自 issue 的待人工項目需要寫回 findings。
Sign in to join this conversation.
No labels
2 Participants
Notifications
Due Date
No due date set.
Reference: node-actions/ai-code-review#26