diff --git a/.gitea/ai-review/exclusions.json b/.gitea/ai-review/exclusions.json index e757b9d..18c0e17 100644 --- a/.gitea/ai-review/exclusions.json +++ b/.gitea/ai-review/exclusions.json @@ -82,5 +82,35 @@ "role": "Rogue", "original_finding": "頻繁寫入讀取 opencode.json 設定檔造成無謂的 I/O;建議透過參數或環境變數傳入配置。", "reason": "summarize 每次 action 執行僅呼叫一次,並非「頻繁」;opencode 以 OPENCODE_CONFIG 指向設定檔為其官方配置介面,寫入單一小檔的 I/O 可忽略。" + }, + { + "location": "app/index.js:80", + "role": "Bard", + "original_finding": "分支命名格式若目標分支名稱過長,可能導致總長度超過 Git 限制;建議確保不超過 255 字元。", + "reason": "buildResolveBranchName 已將主體截斷至 MAX_BRANCH_STEM_LENGTH(180),連同前綴 `resolve-conflict/`(17)與 runId 後綴,總長度約 207,遠低於 Git 的 255 上限,已滿足建議。" + }, + { + "location": "app/index.js:52", + "role": "Mage", + "original_finding": "opencode 失敗時,若相關資訊皆為空,fallback 機制產出的 PR 描述將空洞無效;建議檢查輸出內容或拋錯。", + "reason": "fallbackSummary 的 title 在無 commit 時退回 `Merge into `,description 恆包含固定結構標題(## 變更摘要、### Commits、### 變更檔案)與 `(無)` 佔位,不會產生空字串;PR 仍具基本可讀內容,非缺陷。" + }, + { + "location": "app/lib/util.js:11, 13", + "role": "Bard", + "original_finding": "run 函式 Buffer 大小硬編碼,缺乏靈活性,且針對極端巨大輸入缺乏保護。", + "reason": "maxBuffer(64MB)為刻意的上限保護而非預先配置;本 action 於即拋容器內執行,將其抽為環境變數只增配置面而無實益。等同已收錄的 util.js:14 排除(同一機制)。" + }, + { + "location": "app/index.js:176", + "role": "Bard", + "original_finding": "PR 已存在時僅記錄 log.info,CI 流程中可能需要更明確的提示;建議改用 log.warn 或 log.notice。", + "reason": "「PR 已存在」是冪等重跑下的正常且預期結果,log.info 語意正確;改為 warn 會在正常流程中產生誤導性警告雜訊,屬偏好而非缺陷。" + }, + { + "location": "app/lib/git.js:32", + "role": "Leo", + "original_finding": "Sensitive Token 處理耦合在 Git 類別中,且未驗證有效性;建議將遮蔽邏輯交由 util.js 或於初始化時驗證。", + "reason": "token 遮蔽邏輯已實作於 util.js 的 maskSecrets 並由 Git 類別重用(非重複實作);token 存在性已於 inputs.js 的 required('GITEA_TOKEN') 驗證。Git 持有 token 以組 http.extraheader 為必要,耦合度可接受。" } ] diff --git a/.gitea/ai-review/findings.json b/.gitea/ai-review/findings.json index 01f4c6a..1a7ff6f 100644 --- a/.gitea/ai-review/findings.json +++ b/.gitea/ai-review/findings.json @@ -17,8 +17,8 @@ "level": "warning", "role": "Maya", "location": "app/index.js:114, 126, 154", - "problem": "diff 截斷邏輯、fallbackSummary 邊界處理、以及分支名稱長度限制(Magic Number 180)缺乏測試或硬編碼,難以維護。", - "suggestion": "補上針對 truncateDiff 及 commitMessages 為空/null 時的測試案例。將長度限制抽離為具名常數(例如 `MAX_BRANCH_NAME_LENGTH`)。" + "problem": "diff 截斷邏輯、fallbackSummary 邊界處理缺乏測試。(分支名稱長度 Magic Number 已抽為具名常數 MAX_BRANCH_STEM_LENGTH。)", + "suggestion": "補上針對 truncateDiff 及 commitMessages 為空/null 時的測試案例。" }, { "level": "warning", @@ -27,27 +27,6 @@ "problem": "Dockerfile 中使用全域 `npm install` 存在供應鏈風險。", "suggestion": "使用 lockfile(如 `package-lock.json`)確保依賴版本一致性,並定期審查更新。" }, - { - "level": "warning", - "role": "Bard", - "location": "app/lib/opencode.js:154", - "problem": "錯誤訊息處理中,對 `result.stderr` 進行截斷,可能導致切斷關鍵錯誤上下文,除錯困難。", - "suggestion": "改用 log.warn 輸出完整內容(遮蔽敏感資訊後),或將截斷訊息與「內容已截斷」提示並列。" - }, - { - "level": "warning", - "role": "Bard", - "location": "app/index.js:80", - "problem": "分支命名格式若目標分支名稱過長,可能導致總長度超過 Git 限制。", - "suggestion": "調整 `stem` 截斷長度,或加入總長度檢查機制,確保不超過 255 字元。" - }, - { - "level": "warning", - "role": "Mage", - "location": "app/index.js:52", - "problem": "opencode 失敗時,若相關資訊皆為空,fallback 機制產出的 PR 描述將空洞無效。", - "suggestion": "增加對 `fallbackSummary` 輸出內容的檢查。若資訊不足,應拋出錯誤或提供更有意義的預設說明。" - }, { "level": "warning", "role": "Maya", @@ -62,26 +41,5 @@ "problem": "缺乏單元測試驗證 `extractResult` 對非標準 JSON 的解析能力。", "suggestion": "補上單元測試,驗證 extractResult 能否正確解析壞 JSON。", "is_new": false - }, - { - "level": "info", - "role": "Bard", - "location": "app/lib/util.js:11, 13", - "problem": "Buffer 大小硬編碼,缺乏靈活性,且針對極端巨大輸入缺乏保護。", - "suggestion": "將 buffer 大小作為常數定義或透過環境變數傳入,並在呼叫 `run` 前增加對輸入內容的檢查。" - }, - { - "level": "info", - "role": "Bard", - "location": "app/index.js:176", - "problem": "PR 已存在時僅記錄 `log.info`,CI 流程中可能需要更明確的提示。", - "suggestion": "建議改用 `log.warn` 或新增 `log.notice` 等級,以更明確提示使用者「PR 已經存在」。" - }, - { - "level": "info", - "role": "Leo", - "location": "app/lib/git.js:32", - "problem": "Sensitive Token 處理耦合在 `Git` 類別中,且未驗證有效性。", - "suggestion": "將 Token 的遮蔽邏輯交由 `util.js` 處理,或在 `Git` 初始化時驗證其有效性。" } ]