feat: add JSON format validation for findings and exclusions after processing

This commit is contained in:
2026-05-13 01:02:33 +00:00
parent 37cf5f82fa
commit 49a02ebb6b
5 changed files with 39 additions and 1 deletions
+22 -1
View File
@@ -1,4 +1,6 @@
import { GITEA_REPOSITORY, PR_NUMBER, PR_HEAD_BRANCH, PR_BASE_BRANCH, getLLMConfig } from './config.js';
import fs from 'fs';
import path from 'path';
import { GITEA_REPOSITORY, PR_NUMBER, PR_HEAD_BRANCH, PR_BASE_BRANCH, getLLMConfig, FINDINGS_PATH, EXCLUSIONS_PATH } from './config.js';
import { loadRoles, getRoleIntro } from './roles.js';
import { getPRDiff, postComment } from './gitea.js';
import { analyzeWithRole, loadOldFindings, mergeFindings, sortByLevel, deduplicateWithAI, loadExclusions, applyExclusions, filterFalsePositivesWithAI } from './findings.js';
@@ -60,6 +62,7 @@ async function main() {
// Step3: 讀取舊 findings,合併去重(含 AI 語意去重)
console.log('\n🔀 Step3: Findings 合併');
// Clone repo 以讀取舊 findings 與排除清單
let repoDir;
try {
repoDir = cloneRepo(WORKSPACE);
@@ -77,6 +80,7 @@ async function main() {
// Step4: 讀取排除問題檔案,過濾 PR 問題表格,並請 AI 判斷誤報
console.log('\n🚫 Step4: AI 排除問題過濾');
// 輸入至 findings 用於 AI 誤報過濾,exclusions 同時作為已知誤報參考
const exclusions = loadExclusions(repoDir || WORKSPACE);
const ruleFiltered = applyExclusions(sorted, exclusions);
const filtered = await filterFalsePositivesWithAI(ruleFiltered, exclusions);
@@ -94,6 +98,23 @@ async function main() {
console.log(` ⚠️ comment 發布失敗(繼續執行): ${e.message}`);
}
// Step5b: 驗證 findings.json 與 exclusions.json 為合法 JSON
console.log('\n🔎 Step5b: JSON 格式驗證');
for (const relPath of [FINDINGS_PATH, EXCLUSIONS_PATH]) {
const fullPath = path.join(repoDir || WORKSPACE, relPath);
if (!fs.existsSync(fullPath)) {
console.log(` ⚠️ ${relPath} 不存在,跳過驗證`);
continue;
}
try {
JSON.parse(fs.readFileSync(fullPath, 'utf8'));
console.log(`${relPath} JSON 格式正確`);
} catch (e) {
console.error(`${relPath} JSON 格式錯誤: ${e.message}`);
process.exit(1);
}
}
// Step6: commit/push findings.json 到來源分支
console.log('\n💾 Step6: 記憶區 Commit/Push');
await commitAndPush(WORKSPACE);