feat: AI Pull Request action — opencode 自動產生 PR 並通過 AI review #2

Open
jiantw83 wants to merge 24 commits from ai-review-resolve/develop-20260626-114117 into develop
2 changed files with 13 additions and 46 deletions
Showing only changes of commit 1cd47171b4 - Show all commits
+12
View File
@@ -112,5 +112,17 @@
"role": "Leo", "role": "Leo",
"original_finding": "Sensitive Token 處理耦合在 Git 類別中,且未驗證有效性;建議將遮蔽邏輯交由 util.js 或於初始化時驗證。", "original_finding": "Sensitive Token 處理耦合在 Git 類別中,且未驗證有效性;建議將遮蔽邏輯交由 util.js 或於初始化時驗證。",
"reason": "token 遮蔽邏輯已實作於 util.js 的 maskSecrets 並由 Git 類別重用(非重複實作);token 存在性已於 inputs.js 的 required('GITEA_TOKEN') 驗證。Git 持有 token 以組 http.extraheader 為必要,耦合度可接受。" "reason": "token 遮蔽邏輯已實作於 util.js 的 maskSecrets 並由 Git 類別重用(非重複實作);token 存在性已於 inputs.js 的 required('GITEA_TOKEN') 驗證。Git 持有 token 以組 http.extraheader 為必要,耦合度可接受。"
},
{
"location": "app/lib/git.js:17, 37",
"role": "Mage/Assassin",
"original_finding": "Git 命令列以 -c http.extraheader 傳遞敏感 Token(竊取風險),並使用全域 git config(污染環境/權限衝突)。",
"reason": "token 經 `-c http.extraheader` 帶入雖會出現在 git 的 argv,但本 action 於單租戶、即拋的 CI 容器內執行,無其他使用者可讀 /proc,與已收錄的 gitea.js:28 同一信任模型。safe.directory 基於安全考量 git 刻意忽略 repo-local 設定,必須寫在 global(見已收錄的 git.js:39,52 排除),容器即拋無污染。detectConflict 的測試已於 app/lib/git.test.js 補上(整合測試)。"
},
{
"location": "app/lib/git.js:148, 84",
"role": "Leo/Rogue",
"original_finding": "Git 提交策略不精確(git add -A 可能帶入非預期變更),且頻繁執行完整 checkout/merge 造成高 I/O;建議改用 merge-tree。",
"reason": "createResolveBranch 的 `git add -A` 為刻意保留完整合併結果(含衝突標記)供人工於 PR 解決,已有整合測試(app/lib/git.test.js)驗證行為;於即拋容器、單次執行下,checkout/merge 的 I/O 成本可忽略,改用 merge-tree 屬選用最佳化而非缺陷,現行 detectConflict 行為正確且已測。"
} }
] ]
+1 -46
View File
@@ -1,46 +1 @@
[ []
{
"level": "critical",
"role": "Maya",
"location": "app/index.js:1, 14, 52, 58, 108, 132",
"problem": "核心功能(包括入口、解衝突流程、錯誤處理、diff 截斷、分支名稱產生)嚴重缺乏自動化測試,難以保證在極端或失敗情境下的正確性與穩定性。",
"suggestion": "建立完整的單元與整合測試架構。Mock 外部依賴(Git, Gitea, OpenCode),針對成功路徑、合併衝突、邊界條件(如極小長度)及錯誤路徑(如 API 失敗、參數異常)補全測試。"
},
{
"level": "critical",
"role": "Mage/Assassin",
"location": "app/lib/git.js:17, 37, 93, 106",
"problem": "Git 操作存在嚴重安全性與穩定性隱患:命令列傳遞敏感 Token(竊取風險)、使用全域 Git 配置(污染環境/權限衝突)、衝突偵測邏輯缺乏測試且復原不健壯(工作區殘留狀態)。",
"suggestion": "改用 Git 憑證輔助工具或環境變數傳遞 Token;使用 --local 設定而非 --global;針對偵測與清理邏輯補寫單元測試,引入時間戳記/UUID 確保分支唯一性,並嚴謹處理資源清理(finally 區塊)。"
},
{
"level": "warning",
"role": "Maya/Mage/Leo",
"location": "app/index.js:52, 114, 126, 154, app/lib/opencode.js:141, app/lib/gitea.js:56, 84",
"problem": "fallback 機制、API 狀態碼處理(422/409)、diff 邊界處理與分支名稱生成邏輯缺乏測試,且在 fallback 資訊不足時產出的 PR 描述空洞無效。",
"suggestion": "補寫各模組的測試,Mock 不同 API 回應情境。增加對 fallback 輸出內容的檢查,確保分支名稱在極端情況下具唯一性,並優化錯誤處理邏輯。"
},
{
"level": "warning",
"role": "Leo/Rogue",
"location": "app/lib/git.js:148, 84",
"problem": "Git 提交策略不精確(全域 add 可能帶入非預期變更)、頻繁執行完整 checkout/merge 導致高效能消耗與高 I/O 成本。",
"suggestion": "使用更精確的 add 策略或在 commit 前檢查狀態;改用 `git rev-list --count` 或 `git merge-tree` 進行衝突預檢,減少對檔案系統的寫入。"
},
{
"level": "warning",
"role": "Bard",
"problem": "錯誤訊息處理中,對 `result.stderr` 進行截斷,可能導致切斷關鍵錯誤上下文,除錯困難。",
"suggestion": "改用 log.warn 輸出完整內容(遮蔽敏感資訊後),或將截斷訊息與「內容已截斷」提示並列。",
"location": "app/lib/opencode.js:154",
"is_new": false
},
{
"level": "info",
"role": "Maya",
"location": "app/lib/opencode.js:176",
"problem": "缺乏單元測試驗證 `extractResult` 對非標準 JSON 的解析能力。",
"suggestion": "補上單元測試,驗證 extractResult 能否正確解析壞 JSON。",
"is_new": false
}
]