diff --git a/.gitea/ai-review/findings.json b/.gitea/ai-review/findings.json index fdf6239..ecdeca3 100644 --- a/.gitea/ai-review/findings.json +++ b/.gitea/ai-review/findings.json @@ -2,38 +2,99 @@ { "level": "critical", "role": "Mage", - "location": "app/lib/git.js:154", - "problem": "在 `createResolveBranch` 中,執行 `git add -A` 與 `git commit` 會強制提交包括未追蹤檔案在內的所有變更,可能污染分支且掩蓋衝突內容,此流程亦缺乏測試。", + "location": "app/lib/git.js:147, 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。" + "location": "app/index.js:1, 58", + "problem": "核心邏輯(涉及分支操作、API 交互、AI 分析)完全缺乏自動化測試。且 `createResolveBranch` 產生的分支缺乏邏輯處理衝突檔案,亦無測試驗證分支建立及提交內容。", + "suggestion": "必須建立測試目錄,導入測試框架(如 Jest 或 Mocha),並至少為 lib/ 下的工具類與 index.js 的核心邏輯增加單元測試。應補上整合測試,驗證 detectConflict 能偵測衝突,且 createResolveBranch 產生的分支確實包含預期的衝突檔案與 commit。" }, { - "level": "info", + "level": "critical", + "role": "Maya", + "location": "app/lib/git.js:106", + "problem": "detectConflict 函式在執行 git 合併失敗後的 abort 嘗試若失敗,會導致工作區殘留錯誤狀態,且未經測試驗證。", + "suggestion": "增加測試案例來模擬 git 合併失敗與 abort 失敗的場景,確保狀態正確復原。" + }, + { + "level": "warning", + "role": "Mage", + "location": "app/lib/git.js:39, 52", + "problem": "多次使用 `git config --global` 修改全域設定,可能導致 `~/.gitconfig` 無限膨脹、污染環境或導致並行 Git 作業行為異常。", + "suggestion": "改用 `--local` 設定,或在執行 Git 指令時透過 `-c` 傳入設定,避免修改全域組態。同時限制 `safe.directory` 只針對特定的工作目錄,而非萬用字元 `*`。" + }, + { + "level": "warning", + "role": "Mage", + "location": "app/lib/opencode.js:106, 111", + "problem": "將 `HOME` 環境變數硬編碼為 `/root`;`opencode run` 設定了 5 分鐘 timeout 但未處理發生時的清理。", + "suggestion": "動態獲取當前使用者的家目錄;增加對 timeout 的特殊處理,並確保 finally 區塊正確清理所有狀態。" + }, + { + "level": "warning", "role": "Leo", - "location": "app/lib/git.js:107", - "problem": "detectConflict 使用固定名稱的暫存分支(__conflict_check_${target}),若程式意外中斷可能導致分支殘留,下次執行可能引發命名衝突或狀態異常。", - "suggestion": "建議在分支名稱中加入隨機字串(如 uuid 或時間戳),並確保在 finally 區塊中有強制清理該分支的機制。", - "is_new": true + "location": "app/lib/opencode.js:34, 46, 143", + "problem": "暫存目錄與設定檔未清理造成空間堆積;頻繁 I/O;且複雜的 JSON 解析邏輯不僅脆弱且維護成本高。", + "suggestion": "在 finally 區塊中統一實作檔案系統清理;將設定檔產生邏輯快取;優化 Prompt 嚴格要求 LLM 僅輸出標準 JSON,並使用原生 `JSON.parse`。" + }, + { + "level": "warning", + "role": "Mage", + "location": "app/index.js:84, 176", + "problem": "分支名稱長度可能超出 Git 限制,或字元替換後導致名稱無效。", + "suggestion": "確保 resolveBranch 長度不超過 Git 建議限制,並對最終產生的分支名稱進行正規化。" + }, + { + "level": "warning", + "role": "Assassin", + "location": "app/index.js:183", + "problem": "錯誤處理中的 `maskSecrets` 基於字串取代,可能無法處理所有 Token 變體導致敏感資訊洩漏。", + "suggestion": "確保 `maskSecrets` 處理所有可能的變體,並在生產環境中禁止輸出原始錯誤物件。" + }, + { + "level": "warning", + "role": "Leo", + "location": "app/index.js:7", + "problem": "函式 `main()` 承擔過多責任,違反單一職責原則。", + "suggestion": "將職責拆解,抽離衝突處理邏輯為 `ConflictManager`,並封裝 Gitea API 互動。" + }, + { + "level": "warning", + "role": "Maya", + "location": "app/index.js:114, 126", + "problem": "diff 截斷邏輯與 fallbackSummary 處理邊界情況缺乏測試。", + "suggestion": "補上針對 truncateDiff 及 commitMessages 為空/null 時的測試案例。" }, { "level": "info", "role": "Maya", "location": "app/index.js:150", - "problem": "對於 `fallbackSummary` 函數,當 opencode 產生摘要失敗時會觸發,但目前缺乏測試案例驗證在各種輸入下,fallback 的結果是否符合預期格式。", - "suggestion": "補上單元測試,驗證 `fallbackSummary` 在不同輸入下(如為空、多行訊息、stat 為空)產生的標題與描述格式是否正確。" + "problem": "缺乏測試案例驗證 fallbackSummary 的結果是否符合預期格式。", + "suggestion": "補上單元測試,驗證 fallbackSummary 在不同輸入下的產出格式。" }, { "level": "info", "role": "Maya", "location": "app/lib/opencode.js:176", - "problem": "`extractResult` 函數處理 JSON 解析與清理邏輯,雖然複雜,但目前沒有單元測試驗證其對「LLM 容易輸出的各種非標準 JSON」的處理能力(例如字串內含未跳脫換行)。", - "suggestion": "補上單元測試,提供幾種 LLM 常見的「壞」JSON 格式,驗證 `extractResult` 能否正確解析出 `title` 與 `description`。", - "is_new": true + "problem": "缺乏單元測試驗證 `extractResult` 對非標準 JSON 的解析能力。", + "suggestion": "補上單元測試,驗證 extractResult 能否正確解析壞 JSON。" + }, + { + "level": "info", + "role": "Assassin", + "location": "app/lib/opencode.js:77", + "problem": "呼叫外部指令時傳遞整個 `process.env`,導致敏感環境變數暴露。", + "suggestion": "應明確篩選並只傳遞必要環境變數。" + }, + { + "level": "info", + "role": "Rogue", + "location": "app/index.js:37", + "problem": "在 `ahead` 為 0 時,仍執行昂貴的 diff 採集與分析。", + "suggestion": "先執行 `countAheadCommits`,若 `ahead === 0` 則直接終止。" } ]