feat: AI Pull Request action — opencode 自動產生 PR 並通過 AI review #2
@@ -0,0 +1,114 @@
|
||||
[
|
||||
{
|
||||
"level": "critical",
|
||||
"role": "Assassin",
|
||||
"location": "app/lib/gitea.js:28",
|
||||
"problem": "Gitea API 請求在 headers 中直接放入了 `this.token`。雖然這在正常情況下是必要的,但如果 `this.token` 來源於不可信的輸入且未經嚴格驗證,這將導致 token 洩漏風險(透過請求日誌或中間人攻擊)。",
|
||||
"suggestion": "在 `GiteaClient` 的所有請求方法中增加對 token 的處理,並確保在任何可能將請求細節(包含 headers)輸出到日誌的邏輯中,必須將 token 遮蔽。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "critical",
|
||||
"role": "Mage",
|
||||
"location": "app/lib/gitea.js:52",
|
||||
"problem": "1. `findOpenPull` 方法僅撈取前 50 個 PR,若數量眾多可能導致重複建立。2. `_request` 進行 `GET` 操作時,未對 API 回傳的 `json` 內容結構進行嚴格合法性驗證,可能導致執行時錯誤。",
|
||||
"suggestion": "1. 實作分頁(pagination)機制確保完整性。2. 在確保 HTTP 狀態碼為 200 後,強化對 `json` 的防禦性檢測(如檢查是否為 undefined 或預期陣列)。"
|
||||
},
|
||||
{
|
||||
"level": "critical",
|
||||
"role": "Mage",
|
||||
"location": "app/lib/git.js:154",
|
||||
"problem": "在 `createResolveBranch` 中,執行 `git add -A` 與 `git commit` 會強制提交包括未追蹤檔案在內的所有變更,可能污染分支且掩蓋衝突內容,此流程亦缺乏測試。",
|
||||
"suggestion": "僅針對衝突檔案(`--diff-filter=U`)執行 `git add`,並補上整合測試,驗證模擬衝突時,產生的分支確實包含正確的衝突標記與檔案。"
|
||||
},
|
||||
{
|
||||
"level": "critical",
|
||||
"role": "Maya",
|
||||
"location": "app/index.js:58",
|
||||
"problem": "在偵測到衝突並建立解衝突分支後,程式雖然嘗試透過 `git.createResolveBranch` 建立並 commit 衝突檔案,但後續缺乏邏輯處理衝突檔案,亦無測試驗證「自動解衝突分支是否真的被建立」以及「提交的內容是否正確」。",
|
||||
"suggestion": "應補上整合測試,模擬合併衝突,驗證 `detectConflict` 能偵測衝突,且 `createResolveBranch` 產生的分支確實包含預期的衝突檔案與 commit。"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Assassin",
|
||||
"location": "app/lib/git.js:52",
|
||||
"problem": "Git 的 `--no-tags` 參數在某些舊版 git 可能無法完全防禦標籤帶來的惡意遠端物件下載。雖然 `fetchBranches` 限制了 refspec,但使用不可信的 `remoteUrl` 進行 fetch 操作時,仍存在與 git 協定漏洞相關的風險。",
|
||||
"suggestion": "建議確保容器內的 git 版本為最新,並考慮在 fetch 前驗證 `remoteUrl` 是否為預期的 Gitea 網域,而非任意使用者輸入的網址。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Assassin",
|
||||
"location": "app/index.js:180",
|
||||
"problem": "在 `main` 函數的 catch 區塊中,直接將 `err.stack` 輸出到標準錯誤流(log.error)。如果錯誤物件中包含了敏感資訊(如 token、API 參數),這些機密將被寫入到 CI/CD 的執行日誌中,極易洩漏。",
|
||||
"suggestion": "在輸出 `err.stack` 前,必須使用類似 `maskSecrets` 的函式,過濾掉所有可能的機密資訊。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Leo",
|
||||
"location": "app/lib/opencode.js:34",
|
||||
"problem": "1. `_writeConfig` 使用 mkdtempSync 建立暫存目錄後未清理,造成空間堆積。2. `summarize` 函式重複建立零散設定檔,增加 I/O 與清理負擔。",
|
||||
"suggestion": "在程式執行完畢後的 finally 區塊中,統一實作檔案系統清理邏輯(如 fs.rmSync)以刪除暫存目錄與檔案。同時考慮設定檔重用性,減少頻繁的檔案操作。"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Mage",
|
||||
"location": "app/index.js:84",
|
||||
"problem": "在 `buildResolveBranchName` 中,處理衝突分支名稱時,雖然使用了 `safe` 函數替換特殊字元,但如果分支名稱過長,加上 `suffix`(runId)可能導致分支名稱過長而超出 Git 對 branch 名稱長度的極限(雖然通常很大,但這是不必要的風險)。",
|
||||
"suggestion": "建議對 `resolveBranch` 的總長度進行截斷,確保其不會超過 Git 的建議長度限制。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Mage",
|
||||
"location": "app/lib/opencode.js:106",
|
||||
"problem": "在 `summarize` 方法中將 `HOME` 環境變數硬編碼為 `/root`,若 Dockerfile 變更使用者,將導致無法寫入設定檔。",
|
||||
"suggestion": "建議動態獲取當前環境的使用者家目錄(如使用 `os.homedir()`),增加相容性。"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Rogue",
|
||||
"location": "app/lib/git.js:63",
|
||||
"problem": "在 `getCommitMessages` 中使用 `git log --max-count=50`,若專案歷史悠久,此數量可能不足以產生精確的 AI 摘要,且若取得數量過多則浪費處理資源。",
|
||||
"suggestion": "評估實際使用場景調整 `limit`,或改用時間區間(例如 `--since`)來抓取相關變更。"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Rogue",
|
||||
"location": "app/lib/util.js:14",
|
||||
"problem": "`run` 函式設定 `maxBuffer: 64 * 1024 * 1024` (64MB)。雖然避免了截斷,但如果 `git diff` 內容極大,這會一次性將大量文字讀入記憶體,極易引發記憶體不足 (OOM) 或過高的 GC 壓力。",
|
||||
"suggestion": "改用 stream 方式讀取 `git` 指令輸出,而非一次性載入 buffer。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Leo",
|
||||
"location": "app/lib/git.js:107",
|
||||
"problem": "detectConflict 使用固定名稱的暫存分支(__conflict_check_${target}),若程式意外中斷可能導致分支殘留,下次執行可能引發命名衝突或狀態異常。",
|
||||
"suggestion": "建議在分支名稱中加入隨機字串(如 uuid 或時間戳),並確保在 finally 區塊中有強制清理該分支的機制。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Maya",
|
||||
"location": "app/index.js:150",
|
||||
"problem": "對於 `fallbackSummary` 函數,當 opencode 產生摘要失敗時會觸發,但目前缺乏測試案例驗證在各種輸入下,fallback 的結果是否符合預期格式。",
|
||||
"suggestion": "補上單元測試,驗證 `fallbackSummary` 在不同輸入下(如為空、多行訊息、stat 為空)產生的標題與描述格式是否正確。"
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Maya",
|
||||
"location": "app/lib/opencode.js:176",
|
||||
"problem": "`extractResult` 函數處理 JSON 解析與清理邏輯,雖然複雜,但目前沒有單元測試驗證其對「LLM 容易輸出的各種非標準 JSON」的處理能力(例如字串內含未跳脫換行)。",
|
||||
"suggestion": "補上單元測試,提供幾種 LLM 常見的「壞」JSON 格式,驗證 `extractResult` 能否正確解析出 `title` 與 `description`。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Rogue",
|
||||
"location": "app/lib/git.js:95",
|
||||
"problem": "`detectConflict` 函式透過 `git merge --no-commit --no-ff` 進行完整合併測試,極其耗時且佔用大量磁碟空間。",
|
||||
"suggestion": "考慮改用 `git merge-tree` (Git 2.29+) 檢查衝突,在不觸碰工作區的情況下快速檢測。"
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user