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

Closed
opened 2026-07-21 06:42:39 +00:00 by admin · 11 comments
Owner

變更摘要

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

  • 修正建問題模式嚴重 finding 的 fail-open 風險:有嚴重問題時仍提交 findings 檔,確保產生 [failure] 結果 commit,由下一輪 CI 快速回報失敗;即使 Gitea 問題相依 API 不支援,也不會只留下 issue 而缺少失敗檢查。
  • createIssueAndFlushBufferedComments 改回依序寫入暫存情境留言,保留工具、diff、攻擊方、防守方等流程順序。
  • 攻擊方沒有 findings 時直接略過防守方裁決,避免空列表仍進入防守方流程。
  • 將 AI CLI 失敗診斷與機密遮罩抽成正式 src/lib/diagnostics.js 模組,移除 review.__test 測試後門。
  • 新增 resultFilesToCommit 純函式與測試,鎖定建問題模式嚴重/非嚴重結果檔提交規則。
  • 關閉 issue #26:解析出的 6 筆 finding 已全部處理並留言回報。
  • 回寫 findings wrapper:本輪再移除 3 筆已處理 findings;目前剩餘 37 筆,無嚴重等級。

既有本分支重點

  • 強化 resolveMergeBase / commitAndPushFindings 的分支 ref 驗證,拒絕空值、路徑穿越與不合法 git branch 名稱。
  • 調整 pushWithCredential,以 Gitea server origin 建立 extraheader scope,並驗證 push remote 與 server origin 相符。
  • 調整 AI CLI 失敗診斷:預設只輸出 exit code / signal / timeout,不再把 stderr/stdout 片段寫入長期 CI log;debug 模式才輸出遮罩後片段。
  • 修正 Authorization: Bearer ... 遮罩規則,避免只遮到 Bearer 而留下 token 本體。
  • 修正 issueFindingComment JSDoc,明確涵蓋嚴重、警告與建議的共用 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。

風險與注意事項

  • 建問題模式的嚴重問題現在會把 findings 檔提交到分支,用於產生 failure 結果 commit;這會讓嚴重問題明細同時存在於 issue 與 findings 檔。
  • 剩餘 findings 未在本輪硬改,主要包含 README 深連結、手動時間戳、流程步驟編號與若干命名/文件維護性問題。

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

<!-- ai-code-review --> ## 變更摘要 本分支持續處理 AI Code Review findings,最新推送新增以下修正: - 修正建問題模式嚴重 finding 的 fail-open 風險:有嚴重問題時仍提交 findings 檔,確保產生 `[failure]` 結果 commit,由下一輪 CI 快速回報失敗;即使 Gitea 問題相依 API 不支援,也不會只留下 issue 而缺少失敗檢查。 - `createIssueAndFlushBufferedComments` 改回依序寫入暫存情境留言,保留工具、diff、攻擊方、防守方等流程順序。 - 攻擊方沒有 findings 時直接略過防守方裁決,避免空列表仍進入防守方流程。 - 將 AI CLI 失敗診斷與機密遮罩抽成正式 `src/lib/diagnostics.js` 模組,移除 `review.__test` 測試後門。 - 新增 `resultFilesToCommit` 純函式與測試,鎖定建問題模式嚴重/非嚴重結果檔提交規則。 - 關閉 issue #26:解析出的 6 筆 finding 已全部處理並留言回報。 - 回寫 findings wrapper:本輪再移除 3 筆已處理 findings;目前剩餘 37 筆,無嚴重等級。 ## 既有本分支重點 - 強化 `resolveMergeBase` / `commitAndPushFindings` 的分支 ref 驗證,拒絕空值、路徑穿越與不合法 git branch 名稱。 - 調整 `pushWithCredential`,以 Gitea server origin 建立 extraheader scope,並驗證 push remote 與 server origin 相符。 - 調整 AI CLI 失敗診斷:預設只輸出 exit code / signal / timeout,不再把 stderr/stdout 片段寫入長期 CI log;debug 模式才輸出遮罩後片段。 - 修正 `Authorization: Bearer ...` 遮罩規則,避免只遮到 `Bearer` 而留下 token 本體。 - 修正 `issueFindingComment` JSDoc,明確涵蓋嚴重、警告與建議的共用 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。 ## 風險與注意事項 - 建問題模式的嚴重問題現在會把 findings 檔提交到分支,用於產生 failure 結果 commit;這會讓嚴重問題明細同時存在於 issue 與 findings 檔。 - 剩餘 findings 未在本輪硬改,主要包含 README 深連結、手動時間戳、流程步驟編號與若干命名/文件維護性問題。 --- > 本問題由 AI Code Review 依 PR #6 的審查結果自動建立,問題明細見下方留言。
Author
Owner

🤖 AI Code Review|審查工具

項目 內容
工具 codex
版本 codex-cli 0.144.6
模型 gpt-5.5
審查 commit d424447d1502f49538fcb3093d23b5ac7bfa16c5
Run Job #67
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 | `d424447d1502f49538fcb3093d23b5ac7bfa16c5` | | Run Job | [#67](https://gitea.jsc.idv.tw/node-actions/ai-code-review/actions/runs/1636) | ```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 14:39:42
package.json 管理套件資訊與測試指令 15 行/417 字元 2026/07/21 13:46:43
readme.md 說明專案用途與使用流程 280 行/23916 字元(過長截斷送審) 2026/07/21 14:39:42
src/index.js 編排 AI Code Review 主流程 370 行/16802 字元(過長截斷送審) 2026/07/21 14:39:42
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 產生安全的失敗診斷摘要 78 行/2924 字元 2026/07/21 14:39:42
src/lib/gitea.js 封裝 Gitea API 操作 130 行/5824 字元 2026/07/21 14:39:42
src/lib/gitrepo.js 封裝 git 差異與推送操作 276 行/11234 字元 2026/07/21 13:46:39
src/lib/review.js 處理審查資料與結果流程 541 行/23177 字元(過長截斷送審) 2026/07/21 14:39:42
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 分支安全檢查 31 行/836 字元 2026/07/21 13:46:43
test/review.test.js 測試審查與診斷邏輯 106 行/3424 字元 2026/07/21 14:39:42

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

<!-- ai-code-review --> ## 📋 變更摘要(送審 git diff) | 檔案 | 用途 | git diff 長度 | 最後更新時間 | | --- | --- | --- | --- | | `action.yml` | 定義 Action 參數與執行入口 | 86 行/3883 字元 | 2026/07/21 14:39:42 | | `package.json` | 管理套件資訊與測試指令 | 15 行/417 字元 | 2026/07/21 13:46:43 | | `readme.md` | 說明專案用途與使用流程 | 280 行/23916 字元(過長截斷送審) | 2026/07/21 14:39:42 | | `src/index.js` | 編排 AI Code Review 主流程 | 370 行/16802 字元(過長截斷送審) | 2026/07/21 14:39:42 | | `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` | 產生安全的失敗診斷摘要 | 78 行/2924 字元 | 2026/07/21 14:39:42 | | `src/lib/gitea.js` | 封裝 Gitea API 操作 | 130 行/5824 字元 | 2026/07/21 14:39:42 | | `src/lib/gitrepo.js` | 封裝 git 差異與推送操作 | 276 行/11234 字元 | 2026/07/21 13:46:39 | | `src/lib/review.js` | 處理審查資料與結果流程 | 541 行/23177 字元(過長截斷送審) | 2026/07/21 14:39:42 | | `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 分支安全檢查 | 31 行/836 字元 | 2026/07/21 13:46:43 | | `test/review.test.js` | 測試審查與診斷邏輯 | 106 行/3424 字元 | 2026/07/21 14:39:42 | > 共 15 個檔案納入審查;另有 11 個檔案依 `.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

🔴 嚴重|🗡️ 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。不要把阻擋機制失效降級成純警告。

<!-- ai-code-review --> ### 🔴 嚴重|🗡️ 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。不要把阻擋機制失效降級成純警告。
Author
Owner

🟠 警告|🔮 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 且標題為「已建立追蹤問題」的留言。

<!-- ai-code-review --> ### 🟠 警告|🔮 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` 且標題為「已建立追蹤問題」的留言。
Author
Owner

🔵 建議|🎼 Bard

位置src/lib/diagnostics.js 第 55–63 行

問題描述

agentFailureDetail 裡的 stderrstdout 區塊幾乎同譜重奏:取值、slice、redact、判斷、push 只差欄位名。這種重複雖小,卻讓後續若要調整遮罩或長度時容易改一半走調。

修改建議

建議抽出小 helper,例如 appendRedactedOutput(parts, label, value),讓 stderr/stdout 共用同一段處理節奏。

<!-- ai-code-review --> ### 🔵 建議|🎼 Bard **位置**:`src/lib/diagnostics.js` 第 55–63 行 **問題描述** `agentFailureDetail` 裡的 `stderr` 與 `stdout` 區塊幾乎同譜重奏:取值、slice、redact、判斷、push 只差欄位名。這種重複雖小,卻讓後續若要調整遮罩或長度時容易改一半走調。 **修改建議** 建議抽出小 helper,例如 `appendRedactedOutput(parts, label, value)`,讓 stderr/stdout 共用同一段處理節奏。
Author
Owner

🔵 建議|🎼 Bard

位置src/lib/gitrepo.js 第 139–160 行

問題描述

runFetchtryMergeBasefirstErrorstrategies 夾在 resolveMergeBase 主旋律中,使這個函式同時負責驗證、fetch 策略編排、診斷文字組裝與錯誤包裝。即使邏輯可行,閱讀節奏已偏密,維護者很難一眼分辨「主要流程」與「補救策略」。

修改建議

建議將 fetch 策略與診斷收集抽成小函式,例如 fetchAndRecordresolveMergeBaseWithStrategies,讓 resolveMergeBase 保留高階流程:驗證 baseRef → fetch base → 嘗試 merge-base → 補抓歷史。

<!-- ai-code-review --> ### 🔵 建議|🎼 Bard **位置**:`src/lib/gitrepo.js` 第 139–160 行 **問題描述** `runFetch`、`tryMergeBase`、`firstError`、`strategies` 夾在 `resolveMergeBase` 主旋律中,使這個函式同時負責驗證、fetch 策略編排、診斷文字組裝與錯誤包裝。即使邏輯可行,閱讀節奏已偏密,維護者很難一眼分辨「主要流程」與「補救策略」。 **修改建議** 建議將 fetch 策略與診斷收集抽成小函式,例如 `fetchAndRecord`、`resolveMergeBaseWithStrategies`,讓 `resolveMergeBase` 保留高階流程:驗證 baseRef → fetch base → 嘗試 merge-base → 補抓歷史。
Author
Owner

🔵 建議|🎼 Bard

位置src/lib/gitrepo.js 第 317–346 行

問題描述

pushWithCredential 的 JSDoc 已經很完整,但正文註解再次長篇解釋 checkout token、PAT、extraheader 清空等細節;文件與程式內註解重複奏同一段旋律,反而稀釋真正需要看的程式碼。

修改建議

保留 JSDoc 的背景說明,函式內註解縮成操作提示即可,例如只說明「先清空 checkout extraheader,再注入本次 PAT header」。

<!-- ai-code-review --> ### 🔵 建議|🎼 Bard **位置**:`src/lib/gitrepo.js` 第 317–346 行 **問題描述** `pushWithCredential` 的 JSDoc 已經很完整,但正文註解再次長篇解釋 checkout token、PAT、extraheader 清空等細節;文件與程式內註解重複奏同一段旋律,反而稀釋真正需要看的程式碼。 **修改建議** 保留 JSDoc 的背景說明,函式內註解縮成操作提示即可,例如只說明「先清空 checkout extraheader,再注入本次 PAT header」。
Author
Owner

🔴 嚴重|🗡️ 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。不要把阻擋機制失效降級成純警告。

如果新建議題失敗,則改用原本的檔案處理流程

> <!-- ai-code-review --> > ### 🔴 嚴重|🗡️ 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。不要把阻擋機制失效降級成純警告。 如果新建議題失敗,則改用原本的檔案處理流程
Member

本輪 code-review-resolve 處理結果

等級 位置 處理結果
🔴 嚴重 src/index.js 已修正:建問題模式建立/寫入追蹤 issue 失敗時,改把暫存留言回發 PR 並沿用原 findings 檔流程;若有嚴重問題但未成功產生 [failure] 結果 commit,主流程直接回傳 1,避免 fail-open。
🟠 警告 src/index.js 已修正:建問題模式新增 PR 追蹤 issue 連結前,先標註舊的追蹤 issue 連結為過時,避免多次審查留下互相矛盾的舊連結。
🔵 建議 src/lib/diagnostics.js 已修正:抽出 appendRedactedOutput,讓 stderr/stdout 共用遮罩與限長流程。
🔵 建議 src/lib/gitrepo.js 已修正:精簡 pushWithCredential 正文註解,保留 JSDoc 背景說明。
🔵 建議 src/lib/gitrepo.js ⏭️ 保留於 findings:resolveMergeBase 的較大型抽象拆分屬維護性重構,未在本輪硬改。

驗證:npm test 通過(11 tests / 0 failed),git diff --check 通過。

來源 wrapper 已回寫:.gitea/ai-review/findings/2026-07-21-14:42:39.json 目前保留 1 筆待後續處理 finding。

## 本輪 code-review-resolve 處理結果 | 等級 | 位置 | 處理結果 | | --- | --- | --- | | 🔴 嚴重 | `src/index.js` | ✅ 已修正:建問題模式建立/寫入追蹤 issue 失敗時,改把暫存留言回發 PR 並沿用原 findings 檔流程;若有嚴重問題但未成功產生 `[failure]` 結果 commit,主流程直接回傳 1,避免 fail-open。 | | 🟠 警告 | `src/index.js` | ✅ 已修正:建問題模式新增 PR 追蹤 issue 連結前,先標註舊的追蹤 issue 連結為過時,避免多次審查留下互相矛盾的舊連結。 | | 🔵 建議 | `src/lib/diagnostics.js` | ✅ 已修正:抽出 `appendRedactedOutput`,讓 stderr/stdout 共用遮罩與限長流程。 | | 🔵 建議 | `src/lib/gitrepo.js` | ✅ 已修正:精簡 `pushWithCredential` 正文註解,保留 JSDoc 背景說明。 | | 🔵 建議 | `src/lib/gitrepo.js` | ⏭️ 保留於 findings:`resolveMergeBase` 的較大型抽象拆分屬維護性重構,未在本輪硬改。 | 驗證:`npm test` 通過(11 tests / 0 failed),`git diff --check` 通過。 來源 wrapper 已回寫:`.gitea/ai-review/findings/2026-07-21-14:42:39.json` 目前保留 1 筆待後續處理 finding。
Sign in to join this conversation.
No labels
2 Participants
Notifications
Due Date
No due date set.
Reference: node-actions/ai-code-review#28