From 6c6680fd3e7b8e7f9fd3e826cbc1a45f065488a2 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Wed, 13 May 2026 01:06:11 +0000 Subject: [PATCH] feat: enhance JSON format validation with backup and reset mechanism on error --- README.md | 2 +- TODO.md | 18 +++++++++--------- app/main.js | 12 ++++++++++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 6392812..fa3047c 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ 5. 將提示詞放到 ./app/prompts 內供程式讀取 6. API Key 支援逗號分隔傳入多個,隨機順序各嘗試一次,全部失敗則 exit 1 7. 讀取 Git Diff 時排除 `.gitea/` 資料夾內的所有檔案,避免 AI 分析 workflow 設定等非業務程式碼 -8. 階段五完成後驗證 `findings.json` 與 `exclusions.json` 是否為合法 JSON 格式,驗證失敗則 exit 1 +8. 階段五完成後驗證 `findings.json` 與 `exclusions.json` 是否為合法 JSON 格式,格式錯誤時先嘗試重置為空陣列並備份原檔,修正失敗才 exit 1 # 使用說明 diff --git a/TODO.md b/TODO.md index ff6ca44..b45a78f 100644 --- a/TODO.md +++ b/TODO.md @@ -25,31 +25,31 @@ - 驗收:log 中能看到 `.gitea/ai-review/findings.json` 寫入、comment sync 的詳細訊息與順序。 - 完成 -## 階段六:記憶區 commit/push 與錯誤處理 +## 階段六:階段五後驗證 JSON 格式 +- 目標:階段五完成後驗證 `findings.json` 與 `exclusions.json` 是否為合法 JSON 格式,格式錯誤時先嘗試重置為空陣列並備份原檔,修正失敗才 exit 1。 +- 驗收:log 中能看到兩個檔案的驗證結果(成功或失敗),格式錯誤時有「嘗試修正」訊息與備份路徑,修正失敗時 workflow 狀態為失敗。 +- 完成 + +## 階段七:記憶區 commit/push 與錯誤處理 - 目標:記憶區能成功 commit/push,錯誤時有明確 log,流程結束有總結訊息。 - 驗收:log 有「persisted findings」、「commit=...」、「push=...」等訊息,錯誤時有「Runner failed: ...」等明確錯誤說明。 - 完成 -## 階段七:阻擋嚴重問題 PR(第 8 點) +## 階段八:阻擋嚴重問題 PR(第 8 點) - 目標:如果 PR 問題表格中有嚴重(critical)問題,workflow 需直接 exit 1,不讓流程成功。 - 驗收:log 中能看到「critical 問題存在,workflow 結束(exit 1)」等明確訊息,且 workflow 狀態為失敗。 - 完成 -## 階段八:API Key 輪替 +## 階段九:API Key 輪替 - 目標:所有平台的 API Key 支援逗號分隔傳入多個,隨機順序各嘗試一次,單一 Key 失敗時自動換下一個,全部失敗則 exit 1。 - 驗收:log 中能看到「key[N/M] 失敗」等訊息,換 key 後繼續執行;傳入單一 Key 時行為與原本相同;全部 Key 失敗時 log「所有 API Key 均失敗,終止流程」且 workflow 狀態為失敗。 - 完成 -## 階段九:Git Diff 排除 .gitea/ 資料夾 +## 階段十:Git Diff 排除 .gitea/ 資料夾 - 目標:讀取 Git Diff 時排除 `.gitea/` 資料夾內的所有檔案,避免 AI 分析 workflow 設定等非業務程式碼。 - 驗收:PR 中有 `.gitea/` 路徑的變更時,diff 內容不包含該路徑的區塊,AI 分析結果不含 `.gitea/` 相關問題。 - 完成 -## 階段十:階段五後驗證 JSON 格式 -- 目標:階段五完成後驗證 `findings.json` 與 `exclusions.json` 是否為合法 JSON 格式,驗證失敗則 exit 1。 -- 驗收:log 中能看到兩個檔案的驗證結果(成功或失敗),格式錯誤時有明確錯誤訊息且 workflow 狀態為失敗。 -- 完成 - --- 所有階段驗收通過。 diff --git a/app/main.js b/app/main.js index 8d552fe..a699ee6 100644 --- a/app/main.js +++ b/app/main.js @@ -110,8 +110,16 @@ async function main() { JSON.parse(fs.readFileSync(fullPath, 'utf8')); console.log(` ✅ ${relPath} JSON 格式正確`); } catch (e) { - console.error(` ❌ ${relPath} JSON 格式錯誤: ${e.message}`); - process.exit(1); + console.error(` ❌ ${relPath} JSON 格式錯誤: ${e.message},嘗試修正...`); + try { + const backupPath = fullPath + '.bak'; + fs.copyFileSync(fullPath, backupPath); + fs.writeFileSync(fullPath, '[]\n', 'utf8'); + console.log(` ✅ ${relPath} 已重置為空陣列(原檔備份至 ${relPath}.bak)`); + } catch (repairErr) { + console.error(` ❌ ${relPath} 修正失敗: ${repairErr.message}`); + process.exit(1); + } } }