chore(ai-review 狀態): 更新 findings.json 與 exclusions.json
CI / AI Code Review (pull_request) Failing after 39s
CI / AI Code Review (pull_request) Failing after 39s
已解決 5 條(critical x1、warning x2、info x2:抽常數、提升 regex、補邊界測試),5 條判定為誤報寫入 exclusions(過度收緊 regex、迴圈測試已帶訊息、總長度冗餘、片段建議互相衝突、mock 過早抽離),findings 清空。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
5e8d58b5f9
commit
fcb1dc4525
@@ -70,5 +70,35 @@
|
||||
"role": "Leo",
|
||||
"original_finding": "在測試中使用 monkey-patch 直接覆蓋 process.stdout.write 或 process.stderr.write 是極度危險的模式,可能導致狀態污染;建議重構 logger 使其支援依賴注入。",
|
||||
"reason": "攔截已於 finally 還原原本的 write,無狀態污染,且為 Node 測試 stdout/stderr 輸出的標準作法;logger 僅是寫入 stdout/stderr 的薄封裝,為其引入依賴注入框架屬過度設計。已將兩個攔截輔助合併為單一 captureStream。"
|
||||
},
|
||||
{
|
||||
"location": "app/config.js:63",
|
||||
"role": "Mage",
|
||||
"original_finding": "正規表達式 ^[A-Za-z0-9._-]+$ 仍允許以點號開頭或結尾的名稱(如 .foo 或 foo.)。建議調整為點號只能存在於中間。",
|
||||
"reason": "路徑穿越風險來自 .、.. 與額外斜線,皆已明確排除;前/後綴點號非穿越向量,且禁止會誤拒如 .github 這類合法 repo 名稱。"
|
||||
},
|
||||
{
|
||||
"location": "app/test/config.test.js:65",
|
||||
"role": "Bard",
|
||||
"original_finding": "for...of 迴圈測試將多種錯誤案例綁在同一個測試名稱下,失敗時難以辨識是哪一種格式。建議拆分或加入描述性訊息。",
|
||||
"reason": "迴圈內 assert.throws 已帶入第三引數描述訊息(應拒絕:<repo>),失敗時可定位具體案例;逐案拆成獨立 test 屬純風格偏好。"
|
||||
},
|
||||
{
|
||||
"location": "app/config.js:62",
|
||||
"role": "Mage",
|
||||
"original_finding": "parts.every 僅檢查單一區段長度,未對 owner/repo 總長度做限制。建議分割前先限制 value 總長度。",
|
||||
"reason": "已限定恰兩段且每段 <= MAX_REPO_NAME_LENGTH,總長度已被間接上限;再加總長度檢查為冗餘。"
|
||||
},
|
||||
{
|
||||
"location": "app/releases.js:68",
|
||||
"role": "Assassin",
|
||||
"original_finding": "將未經清洗的 API 回應片段納入 Error,若 API 返回敏感資訊可能導致外洩。建議僅含概括描述或先脫敏。",
|
||||
"reason": "此片段為前一輪審查明確要求加入以利除錯;release 清單 API 的非 JSON 回應通常為錯誤頁/代理訊息而非機密資料,且片段已截斷。兩輪建議互相衝突,維持可偵錯性。"
|
||||
},
|
||||
{
|
||||
"location": "app/test/releases.test.js:33",
|
||||
"role": "Bard",
|
||||
"original_finding": "jsonResponse 輔助函式定義在測試檔內,建議統一抽離至 app/test/support/mock.js 集中管理。",
|
||||
"reason": "目前僅 releases.test.js 單一測試檔使用,「若未來」屬臆測性需求,為單一消費者提前抽出共用模組屬過度設計。"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,76 +1 @@
|
||||
[
|
||||
{
|
||||
"level": "critical",
|
||||
"role": "Mage",
|
||||
"location": "app/config.js:63",
|
||||
"problem": "在 `assertRepository` 函數中,`part !== '.' && part !== '..'` 的檢查雖然能防止路徑穿越,但正規表達式 `^[A-Za-z0-9._-]+$` 仍然允許 `.` 開頭或結尾的檔案名稱(例如 `.foo` 或 `foo.`),這在某些檔案系統中可能導致意外行為或被視為隱藏檔案,且未明確禁止僅由 `.` 組成的名稱(儘管後面有手動排除)。",
|
||||
"suggestion": "建議調整正規表達式,禁止名稱以點號開頭或結尾,例如使用 `/^[A-Za-z0-9_-]+([.][A-Za-z0-9_-]+)*$/` 來確保點號只能存在於中間。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "critical",
|
||||
"role": "Maya",
|
||||
"location": "app/config.js:62",
|
||||
"problem": "新增的 `assertRepository` 函數對 `GITEA_REPOSITORY` 的檢查邏輯並未測試到所有邊界條件,例如:包含特殊字元(非字母數字點下底線連字號)、極長字串段(> 100 字元)、以及完全空白的 `value`。",
|
||||
"suggestion": "請在 `app/test/config.test.js` 中增加針對非法字元、超過 100 字元的字串段,以及空字串的測試案例,確保 `assertRepository` 的防禦性功能完全被驗證。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Bard",
|
||||
"location": "app/test/config.test.js:65",
|
||||
"problem": "測試檔案中的迴圈測試(for...of)將多種不同的錯誤案例綁在同一個測試名稱下,一旦其中一個案例失敗,難以快速辨識具體是哪一種格式導致驗證失效。",
|
||||
"suggestion": "建議將其拆分為獨立的測試案例,或在 `assert.throws` 中加入更具描述性的訊息。"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Leo",
|
||||
"location": "app/config.js:63",
|
||||
"problem": "在 `assertRepository` 函式中使用了硬編碼的 `100` 作為長度限制,這是一個魔術數字,難以維護且無法從環境配置中調整。",
|
||||
"suggestion": "建議將 `100` 抽離為常數(例如 `MAX_REPO_NAME_LENGTH`),提高可維護性。"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Mage",
|
||||
"location": "app/config.js:62",
|
||||
"problem": "在 `assertRepository` 中,`parts.every` 僅檢查了單一區段長度,未對總體長度(`owner/repo`)做任何限制。",
|
||||
"suggestion": "建議在分割前,先對 `value` 的總長度進行合理範圍的限制。"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Rogue",
|
||||
"location": "app/config.js:65",
|
||||
"problem": "在 `every` 迴圈中重複宣告與編譯 Regex `/^[A-Za-z0-9._-]+$/`,若該函數被頻繁呼叫,將造成無謂的 CPU 與記憶體浪費。",
|
||||
"suggestion": "將 Regex 移至函數外層宣告為常數。"
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Assassin",
|
||||
"location": "app/releases.js:68",
|
||||
"problem": "將未經清洗的 API 回應片段直接納入 `Error` 物件,若 API 返回敏感資訊(內部路徑、堆疊追蹤、使用者資料),可能導致敏感資訊外洩。",
|
||||
"suggestion": "錯誤報告應僅包含概括性的描述,若必須包含內容片段,務必先對片段進行內容脫敏或格式化處理。"
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Bard",
|
||||
"location": "app/config.js:63",
|
||||
"problem": "正規表達式 `/^[A-Za-z0-9._-]+$/` 描述稍顯冗長,且未利用字元類別的特性,略顯不夠優雅。",
|
||||
"suggestion": "考慮簡化寫法,或確保該格式驗證邏輯與專案其他地方一致並抽取為常數。"
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Leo",
|
||||
"location": "app/releases.js:67",
|
||||
"problem": "硬編碼了截斷字串長度 `200`,這是一個魔術數字,若未來需要調整截斷長度以容納更多偵錯資訊或減少輸出,維護者需要直接修改此處邏輯。",
|
||||
"suggestion": "建議定義一個具名的常數(例如 `API_ERROR_SNIPPET_LENGTH`),讓此數字具備語意,且未來調整時只需改動一處。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Bard",
|
||||
"location": "app/test/releases.test.js:33",
|
||||
"problem": "與 `config.test.js` 相比,這裡的 `jsonResponse` 輔助函式定義在測試檔案上方,風格雖然簡潔,但若未來有更多測試檔案需要類似的 mock 工具,建議統一抽離至 `test/support/` 之類的資料夾中,保持測試主體清爽。",
|
||||
"suggestion": "建立 `app/test/support/mock.js` 將這類常用的測試輔助函式集中管理。",
|
||||
"is_new": true
|
||||
}
|
||||
]
|
||||
[]
|
||||
|
||||
Reference in New Issue
Block a user