feat(ai-review 統計): 將統計改為新舊問題分列
This commit is contained in:
+19
-4
@@ -3,7 +3,7 @@ import { GITEA_REPOSITORY, PR_NUMBER, PR_HEAD_BRANCH, PR_BASE_BRANCH, getLLMConf
|
||||
import { loadRoles, getRoleIntro } from './roles.js';
|
||||
import { getPRDiff, postComment, getCommitMessageBySha, getBotReviewOutcome, shouldSkipBotCommit } from './gitea.js';
|
||||
import { analyzeWithRole, loadOldFindings, mergeFindings, sortByLevel, deduplicateWithAI, loadExclusions, applyExclusions, filterFalsePositivesWithAI } from './findings.js';
|
||||
import { saveFindings, postFindingsReview } from './comments.js';
|
||||
import { saveFindings, postFindingsReview, formatFindingsStats } from './comments.js';
|
||||
import { cloneRepo, commitAndPush, getRepoState } from './git.js';
|
||||
import { validateJSONArrayFile, ensureJSONArrayFileExists } from './json.js';
|
||||
import { runPreflight } from './preflight.js';
|
||||
@@ -11,6 +11,11 @@ import { section, step, line, ok, warn, error } from './log.js';
|
||||
|
||||
const WORKSPACE = process.env.GITHUB_WORKSPACE || '/workspace';
|
||||
|
||||
function logFindingsStats(label, findings) {
|
||||
line(`${label}:`);
|
||||
for (const row of formatFindingsStats(findings).split('\n')) line(row);
|
||||
}
|
||||
|
||||
async function main() {
|
||||
section('AI Code Review Pipeline');
|
||||
step('Step1', 'Pipeline 啟動');
|
||||
@@ -82,6 +87,7 @@ async function main() {
|
||||
}
|
||||
}
|
||||
ok(`Step3 完成: 新 findings 總計 ${newFindings.length} 筆`);
|
||||
logFindingsStats('Step3 統計', newFindings);
|
||||
|
||||
step('Step4', 'Findings 合併與語意去重');
|
||||
let repoDir;
|
||||
@@ -95,25 +101,34 @@ async function main() {
|
||||
line(`repo 狀態: branch=${repoState.branch || 'detached'} commit=${repoState.shortSha || 'unknown'} commit_time=${repoState.commitTime || 'unknown'} path=${repoState.repoDir}`);
|
||||
}
|
||||
const oldFindings = loadOldFindings(repoDir || WORKSPACE);
|
||||
logFindingsStats('Step4 舊 findings 統計', oldFindings);
|
||||
logFindingsStats('Step4 新 findings 統計', newFindings);
|
||||
const mergedFindings = mergeFindings(oldFindings, newFindings);
|
||||
ok(`Step4 merged findings total=${mergedFindings.length}`);
|
||||
logFindingsStats('Step4 合併後統計', mergedFindings);
|
||||
const deduped = await deduplicateWithAI(mergedFindings);
|
||||
logFindingsStats('Step4 AI 去重後統計', deduped);
|
||||
const sorted = sortByLevel(deduped);
|
||||
ok(`Step4 去重完成: ${mergedFindings.length} -> ${sorted.length} 筆 (critical=${sorted.filter(f=>f.level==='critical').length} warning=${sorted.filter(f=>f.level==='warning').length} info=${sorted.filter(f=>f.level==='info').length})`);
|
||||
ok(`Step4 去重完成: ${mergedFindings.length} -> ${sorted.length} 筆`);
|
||||
logFindingsStats('Step4 排序後統計', sorted);
|
||||
|
||||
step('Step5', 'AI 排除問題過濾');
|
||||
const exclusions = loadExclusions(repoDir || WORKSPACE, repoState, WORKSPACE);
|
||||
const ruleFiltered = applyExclusions(sorted, exclusions);
|
||||
logFindingsStats('Step5 規則排除後統計', ruleFiltered);
|
||||
const filtered = await filterFalsePositivesWithAI(ruleFiltered, exclusions);
|
||||
logFindingsStats('Step5 AI 誤報過濾後統計', filtered);
|
||||
ok(`Step5 完成: findings total=${filtered.length}`);
|
||||
|
||||
step('Step6', 'Findings 寫入與 Review 發布');
|
||||
const reviewDir = repoDir || WORKSPACE;
|
||||
saveFindings(WORKSPACE, filtered, reviewDir);
|
||||
try {
|
||||
const newFindings = filtered.filter(f => f.is_new !== false);
|
||||
logFindingsStats('Step6 儲存 findings 統計', filtered);
|
||||
logFindingsStats('Step6 review summary 統計', filtered);
|
||||
logFindingsStats('Step6 review comments 統計', filtered);
|
||||
await postFindingsReview(filtered, {
|
||||
summaryFindings: newFindings,
|
||||
summaryFindings: filtered,
|
||||
commentFindings: filtered,
|
||||
});
|
||||
ok('Step6 完成');
|
||||
|
||||
Reference in New Issue
Block a user