ai-review-resolve/develop-20260626-114117
develop
將 Docker Action 範本實作為「AI Pull Request」action:抓取來源/目標分支差異,呼叫 opencode 將 git diff 總結成 PR 標題與描述(固定繁體中文),透過 Gitea token 自動建立 PR;偵測到合併衝突時改建解衝突分支並開對應 PR。並逐輪處理 AI code review findings。
app/
index.js
lib/inputs.js
lib/git.js
lib/gitea.js
lib/opencode.js
lib/util.js
Dockerfile
node:20-bookworm-slim
WORKDIR /app
action.yaml
source_branch
target_branch
opencode_*
GITEA_TOKEN
gitea.token
entrypoint.sh
set -euo pipefail
node /app/index.js
.gitea/workflows/
README.md
逐輪處理 AI review findings:
HOME
os.homedir()
.gitea/ai-review/exclusions.json
detectConflict
truncateDiff
fallbackSummary
extractResult
process.env
🔍 服務:opencode 模型:gemini-2.5-flash
本次審查(opencode / gemini-2.5-flash,共 20 次呼叫)
剩餘可用
剩餘可用:無法計算百分比(自架服務,無帳號額度概念)
@@ -2,0 +8,4 @@
# 安裝 opencode CLI(用於分析 git diff 產生 PR 標題與描述)
RUN npm install -g opencode-ai
# 複製 Node.js 應用程式
嚴重等級:🟡 警告 審查員:Assassin 問題:Dockerfile 中使用全域 npm install 存在供應鏈風險。 建議:使用 lockfile(如 package-lock.json)確保依賴版本一致性,並定期審查更新。
npm install
package-lock.json
@@ -0,0 +49,4 @@
diffStat,
diff,
});
if (!summary) {
嚴重等級:🟡 警告 審查員:Mage 問題:opencode 失敗時,若相關資訊皆為空,fallback 機制產出的 PR 描述將空洞無效。 建議:增加對 fallbackSummary 輸出內容的檢查。若資訊不足,應拋出錯誤或提供更有意義的預設說明。
@@ -0,0 +77,4 @@
return;
}
// 5b. 有衝突:從目標分支建立解衝突分支,合併來源分支後 PR 回來源分支
嚴重等級:🟡 警告 審查員:Bard 問題:分支命名格式若目標分支名稱過長,可能導致總長度超過 Git 限制。 建議:調整 stem 截斷長度,或加入總長度檢查機制,確保不超過 255 字元。
stem
@@ -0,0 +173,4 @@
`### AI 變更摘要`,
``,
summary.description || '(無)',
].join('\n');
嚴重等級:🔵 建議 審查員:Bard 問題:PR 已存在時僅記錄 log.info,CI 流程中可能需要更明確的提示。 建議:建議改用 log.warn 或新增 log.notice 等級,以更明確提示使用者「PR 已經存在」。
log.info
log.warn
log.notice
@@ -0,0 +29,4 @@
return result;
嚴重等級:🔵 建議 審查員:Leo 問題:Sensitive Token 處理耦合在 Git 類別中,且未驗證有效性。 建議:將 Token 的遮蔽邏輯交由 util.js 處理,或在 Git 初始化時驗證其有效性。
Git
util.js
@@ -0,0 +151,4 @@
for (const candidate of findJsonObjects(text)) {
// LLM 常在字串值內輸出未跳脫的換行,先嘗試原始解析,失敗再嘗試修正
for (const variant of [candidate, escapeControlCharsInStrings(candidate)]) {
try {
嚴重等級:🟡 警告 審查員:Bard 問題:錯誤訊息處理中,對 result.stderr 進行截斷,可能導致切斷關鍵錯誤上下文,除錯困難。 建議:改用 log.warn 輸出完整內容(遮蔽敏感資訊後),或將截斷訊息與「內容已截斷」提示並列。
result.stderr
本次審查(opencode / gemini-2.5-flash,共 15 次呼叫)
No dependencies set.
The note is not visible to the blocked user.
變更摘要
將 Docker Action 範本實作為「AI Pull Request」action:抓取來源/目標分支差異,呼叫 opencode 將 git diff 總結成 PR 標題與描述(固定繁體中文),透過 Gitea token 自動建立 PR;偵測到合併衝突時改建解衝突分支並開對應 PR。並逐輪處理 AI code review findings。
重點變更
app/(Node.js 應用程式)index.js:主流程(計算差異 → opencode 摘要 → 衝突偵測 → 建立 PR/解衝突 PR)。lib/inputs.js、lib/git.js、lib/gitea.js、lib/opencode.js、lib/util.js:環境變數讀取、git 操作、Gitea API、opencode 呼叫與共用工具。Dockerfile:基底node:20-bookworm-slim,安裝 git/curl 與 opencode-ai CLI,改用WORKDIR /app。action.yaml:定義source_branch/target_branch/opencode_*inputs;GITEA_TOKEN固定由gitea.token注入。entrypoint.sh:set -euo pipefail,進入點改為node /app/index.js。.gitea/workflows/:保留正確命名的 ci/cd,移除路徑含空白的錯誤檔。README.md:功能、參數與使用範例。AI Code Review 處理結果
逐輪處理 AI review findings:
HOME改用os.homedir()、衝突偵測暫存分支加 PID 與 finally 清理、Dockerfile 改用 WORKDIR、解衝突 PR 加入人工檢查清單。.gitea/ai-review/exclusions.json,附理由):token 在 header/findOpenPull 分頁/remoteUrl 網域/max-count/maxBuffer/git config --global/maskSecrets 變體/main SRP/ahead=0 早返/PR 描述 XSS/固定 timeout/spawnSync 競態/殘留衝突標記(刻意保留)/設定檔 I/O。待人工處理(保留於 findings.json)
detectConflictabort 失敗情境測試。truncateDiff/fallbackSummary/extractResult單元測試。process.env篩選(須先確認其所需環境變數集合)。注意事項
GITEA_TOKEN由 Gitea Actions 的gitea.token自動注入。🤖 AI Code Review 團隊
AI Code Review 統計
🤖 AI 助理使用量
本次審查(opencode / gemini-2.5-flash,共 20 次呼叫)
剩餘可用
剩餘可用:無法計算百分比(自架服務,無帳號額度概念)
@@ -2,0 +8,4 @@# 安裝 opencode CLI(用於分析 git diff 產生 PR 標題與描述)RUN npm install -g opencode-ai# 複製 Node.js 應用程式嚴重等級:🟡 警告
審查員:Assassin
問題:Dockerfile 中使用全域
npm install存在供應鏈風險。建議:使用 lockfile(如
package-lock.json)確保依賴版本一致性,並定期審查更新。@@ -0,0 +49,4 @@diffStat,diff,});if (!summary) {嚴重等級:🟡 警告
審查員:Mage
問題:opencode 失敗時,若相關資訊皆為空,fallback 機制產出的 PR 描述將空洞無效。
建議:增加對
fallbackSummary輸出內容的檢查。若資訊不足,應拋出錯誤或提供更有意義的預設說明。@@ -0,0 +77,4 @@return;}// 5b. 有衝突:從目標分支建立解衝突分支,合併來源分支後 PR 回來源分支嚴重等級:🟡 警告
審查員:Bard
問題:分支命名格式若目標分支名稱過長,可能導致總長度超過 Git 限制。
建議:調整
stem截斷長度,或加入總長度檢查機制,確保不超過 255 字元。@@ -0,0 +173,4 @@`### AI 變更摘要`,``,summary.description || '(無)',].join('\n');嚴重等級:🔵 建議
審查員:Bard
問題:PR 已存在時僅記錄
log.info,CI 流程中可能需要更明確的提示。建議:建議改用
log.warn或新增log.notice等級,以更明確提示使用者「PR 已經存在」。@@ -0,0 +29,4 @@}return result;}嚴重等級:🔵 建議
審查員:Leo
問題:Sensitive Token 處理耦合在
Git類別中,且未驗證有效性。建議:將 Token 的遮蔽邏輯交由
util.js處理,或在Git初始化時驗證其有效性。@@ -0,0 +151,4 @@for (const candidate of findJsonObjects(text)) {// LLM 常在字串值內輸出未跳脫的換行,先嘗試原始解析,失敗再嘗試修正for (const variant of [candidate, escapeControlCharsInStrings(candidate)]) {try {嚴重等級:🟡 警告
審查員:Bard
問題:錯誤訊息處理中,對
result.stderr進行截斷,可能導致切斷關鍵錯誤上下文,除錯困難。建議:改用 log.warn 輸出完整內容(遮蔽敏感資訊後),或將截斷訊息與「內容已截斷」提示並列。
🤖 AI Code Review 團隊
AI Code Review 統計
🤖 AI 助理使用量
本次審查(opencode / gemini-2.5-flash,共 15 次呼叫)
剩餘可用
剩餘可用:無法計算百分比(自架服務,無帳號額度概念)
🤖 AI Code Review 團隊
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.