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 32 additions and 44 deletions
Showing only changes of commit 8f5c510add - Show all commits
+30
View File
@@ -82,5 +82,35 @@
"role": "Rogue", "role": "Rogue",
"original_finding": "頻繁寫入讀取 opencode.json 設定檔造成無謂的 I/O;建議透過參數或環境變數傳入配置。", "original_finding": "頻繁寫入讀取 opencode.json 設定檔造成無謂的 I/O;建議透過參數或環境變數傳入配置。",
"reason": "summarize 每次 action 執行僅呼叫一次,並非「頻繁」;opencode 以 OPENCODE_CONFIG 指向設定檔為其官方配置介面,寫入單一小檔的 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_LENGTH180),連同前綴 `resolve-conflict/`17)與 runId 後綴,總長度約 207,遠低於 Git 的 255 上限,已滿足建議。"
},
{
"location": "app/index.js:52",
"role": "Mage",
"original_finding": "opencode 失敗時,若相關資訊皆為空,fallback 機制產出的 PR 描述將空洞無效;建議檢查輸出內容或拋錯。",
"reason": "fallbackSummary 的 title 在無 commit 時退回 `Merge <source> into <target>`description 恆包含固定結構標題(## 變更摘要、### Commits、### 變更檔案)與 `(無)` 佔位,不會產生空字串;PR 仍具基本可讀內容,非缺陷。"
},
{
"location": "app/lib/util.js:11, 13",
"role": "Bard",
"original_finding": "run 函式 Buffer 大小硬編碼,缺乏靈活性,且針對極端巨大輸入缺乏保護。",
"reason": "maxBuffer64MB)為刻意的上限保護而非預先配置;本 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 為必要,耦合度可接受。"
} }
] ]
+2 -44
View File
@@ -17,8 +17,8 @@
"level": "warning", "level": "warning",
"role": "Maya", "role": "Maya",
"location": "app/index.js:114, 126, 154", "location": "app/index.js:114, 126, 154",
"problem": "diff 截斷邏輯、fallbackSummary 邊界處理、以及分支名稱長度限制(Magic Number 180)缺乏測試或硬編碼,難以維護。", "problem": "diff 截斷邏輯、fallbackSummary 邊界處理缺乏測試。(分支名稱長度 Magic Number 已抽為具名常數 MAX_BRANCH_STEM_LENGTH。)",
"suggestion": "補上針對 truncateDiff 及 commitMessages 為空/null 時的測試案例。將長度限制抽離為具名常數(例如 `MAX_BRANCH_NAME_LENGTH`)。" "suggestion": "補上針對 truncateDiff 及 commitMessages 為空/null 時的測試案例。"
}, },
{ {
"level": "warning", "level": "warning",
@@ -27,27 +27,6 @@
"problem": "Dockerfile 中使用全域 `npm install` 存在供應鏈風險。", "problem": "Dockerfile 中使用全域 `npm install` 存在供應鏈風險。",
"suggestion": "使用 lockfile(如 `package-lock.json`)確保依賴版本一致性,並定期審查更新。" "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", "level": "warning",
"role": "Maya", "role": "Maya",
@@ -62,26 +41,5 @@
"problem": "缺乏單元測試驗證 `extractResult` 對非標準 JSON 的解析能力。", "problem": "缺乏單元測試驗證 `extractResult` 對非標準 JSON 的解析能力。",
"suggestion": "補上單元測試,驗證 extractResult 能否正確解析壞 JSON。", "suggestion": "補上單元測試,驗證 extractResult 能否正確解析壞 JSON。",
"is_new": false "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` 初始化時驗證其有效性。"
} }
] ]