Compare commits

..

4 Commits

Author SHA1 Message Date
jiantw83 35150cae8a chore: expand bot check diagnostics 2026-05-15 14:30:39 +00:00
AI Review Bot e216ca08c5 chore: update ai-review findings [ai-review-bot] 2026-05-15 14:26:45 +00:00
jiantw83 888bf0b359 test: add bot check debug logs 2026-05-15 14:25:08 +00:00
AI Review Bot 59e942f24b chore: update ai-review findings [ai-review-bot] 2026-05-15 14:20:01 +00:00
2 changed files with 48 additions and 8 deletions
+7
View File
@@ -6,6 +6,13 @@
"suggestion": "由於 `GITEA_TOKEN` 現在被設定為 `required: true` 且移除了 `secrets.GITEA_TOKEN` 的 fallback 機制,這是一個關鍵性的行為變更。請務必新增整合測試 (integration tests) 來驗證以下情境:\n1. 當 `inputs.GITEA_TOKEN` 未提供時,Action 應如預期般失敗。\n2. 當 `inputs.GITEA_TOKEN` 有提供時,Action 應能正常執行。\n這將確保新的輸入要求和邏輯變更不會導致意外的行為或破壞現有工作流程。",
"is_new": false
},
{
"level": "critical",
"role": "Leo",
"location": "action.yaml:12",
"suggestion": "建議將 `GITEA_TOKEN` 的環境變數設定改回 `GITEA_TOKEN: ${{ inputs.GITEA_TOKEN || secrets.GITEA_TOKEN }}`。目前將其設定為 `required: true` 並移除 `secrets.GITEA_TOKEN` 的 fallback 機制,會導致現有依賴 `secrets.GITEA_TOKEN` 的工作流程中斷,並降低配置的彈性。如果目的是強制透過 `inputs` 傳遞,應在文件明確說明此重大變更及其原因。",
"is_new": false
},
{
"level": "warning",
"role": "Leo",
+41 -8
View File
@@ -6,6 +6,13 @@ const httpsAgent = GITEA_SKIP_TLS_VERIFY ? new https.Agent({ rejectUnauthorized:
const headers = () => ({ Authorization: `token ${GITEA_TOKEN}`, 'Content-Type': 'application/json' });
const api = (path) => `${GITEA_SERVER_URL.replace(/\/$/, '')}/api/v1${path}`;
function extractCommitMessage(payload) {
return payload?.message
|| payload?.commit?.message
|| payload?.commit?.commit?.message
|| '';
}
/**
* 取得 PR 的 Git Diff 內容,已自動排除 .gitea/ 資料夾。
*/
@@ -33,8 +40,11 @@ export async function getCommitMessageBySha(sha) {
timeout: 30000,
httpsAgent,
});
return resp.data?.message || '';
} catch {
const message = extractCommitMessage(resp.data);
console.log(` 🔎 bot-check: commit api sha=${sha} keys=${Object.keys(resp.data || {}).join(',') || 'empty'} message=${message ? 'found' : 'empty'}`);
return message;
} catch (e) {
console.log(` ⚠️ bot-check: 讀取 commit sha=${sha} 失敗: ${e.message}`);
return '';
}
}
@@ -48,18 +58,41 @@ export async function getBranchHeadCommitMessage(branch = PR_HEAD_BRANCH) {
httpsAgent,
});
const sha = resp.data?.commit?.id || resp.data?.commit?.sha || '';
console.log(` 🔎 bot-check: branch api branch=${branch} keys=${Object.keys(resp.data || {}).join(',') || 'empty'} sha=${sha || 'empty'} message=${extractCommitMessage(resp.data?.commit) ? 'found' : 'empty'}`);
return await getCommitMessageBySha(sha);
} catch {
} catch (e) {
console.log(` ⚠️ bot-check: 讀取 branch=${branch} head commit 失敗: ${e.message}`);
return '';
}
}
export async function shouldSkipBotCommit({ sha = PR_HEAD_SHA || process.env.GITHUB_SHA, branch = PR_HEAD_BRANCH } = {}) {
const candidates = [
await getCommitMessageBySha(sha),
await getBranchHeadCommitMessage(branch),
].filter(Boolean);
return candidates.some(message => message.includes('[ai-review-bot]'));
console.log(` 🔎 bot-check: start PR_HEAD_SHA=${PR_HEAD_SHA || 'empty'} GITHUB_SHA=${process.env.GITHUB_SHA || 'empty'} sha=${sha || 'empty'} branch=${branch || 'empty'}`);
const shaMessage = await getCommitMessageBySha(sha);
if (sha) {
console.log(` 🔎 bot-check: sha=${sha} message=${shaMessage ? 'found' : 'empty'}`);
if (shaMessage.includes('[ai-review-bot]')) {
console.log(' ✅ bot-check: matched commit sha marker');
return true;
}
} else {
console.log(' 🔎 bot-check: skip sha lookup because sha is empty');
}
const branchMessage = await getBranchHeadCommitMessage(branch);
if (branch) {
console.log(` 🔎 bot-check: branch=${branch} head_message=${branchMessage ? 'found' : 'empty'}`);
if (branchMessage.includes('[ai-review-bot]')) {
console.log(' ✅ bot-check: matched branch head marker');
return true;
}
} else {
console.log(' 🔎 bot-check: skip branch lookup because branch is empty');
}
console.log(' ️ bot-check: no [ai-review-bot] marker found');
return false;
}
/**