Compare commits

..

7 Commits

4 changed files with 60 additions and 167 deletions
+35
View File
@@ -24,5 +24,40 @@
{ {
"location": "app/findings.js", "location": "app/findings.js",
"suggestion": "filterFalsePositivesWithAI 拋出的 Error 會被 catch 攔截並降級回傳原始 findings,不會中斷流程" "suggestion": "filterFalsePositivesWithAI 拋出的 Error 會被 catch 攔截並降級回傳原始 findings,不會中斷流程"
},
{
"role": "Rex",
"location": ".gitea/workflows/review.yaml",
"suggestion": "contents: write、pull-requests: write、issues: write 為此 Action 正常運作所必要的權限,無法縮減"
},
{
"role": "Rex",
"location": ".gitea/workflows/review.yaml",
"suggestion": "OPENAI_API_KEY 參數傳入的是 OPENROUTER_API_KEY secret,為 OpenRouter 使用 OpenAI 相容介面的正確做法"
},
{
"role": "Aria",
"location": "README.md",
"suggestion": "章節編號連續且正確,無需調整"
},
{
"role": "Maya",
"location": ".gitea/workflows/review.yaml",
"suggestion": "action.yaml 定義的參數名稱為 GEMINI_API_KEY、GEMINI_BASE_URL、GEMINI_MODEL,與 review.yaml 完全一致,無不匹配問題"
},
{
"role": "Aria",
"location": ".gitea/workflows/review.yaml",
"suggestion": "review.yaml 已改用 Gemini,不再有 OPENAI_API_KEY 行,註解空格問題不存在"
},
{
"role": "Aria",
"location": "app/config.test.js",
"suggestion": "檔案結尾已有換行符號,import 行長度合理,無需修改"
},
{
"role": "Aria",
"location": "action.yaml",
"suggestion": "action.yaml 已整理,多餘空行已移除,結構整潔"
} }
] ]
+22 -162
View File
@@ -1,38 +1,10 @@
[ [
{ {
"level": "critical", "level": "critical",
"role": "Aria", "role": "Maya",
"location": ".gitea/ai-review/exclusions.json", "location": ".gitea/workflows/review.yaml:35-37 與 action.yaml",
"suggestion": "新增的條目包含 `role` 欄位,但目前的 JSON schema 只接受 `location` `suggestion`,此欄位會導致驗證失敗,請移除或更新 schema。", "suggestion": "在 `review.yaml` 工作流程中,您嘗試傳遞 `GEMINI_API_KEY`、`GEMINI_BASE_URL` 和 `GEMINI_MODEL` 參數。然而,根據 `action.yaml` 的定義,此 Action 預期接收的是 `GOOGLE_API_KEY`、`GOOGLE_BASE_URL` `GOOGLE_MODEL`。這導致參數名稱不匹配,Action 將無法正確取得 Gemini 的設定,進而導致功能失效。請修正 `review.yaml`,將參數名稱改為 `GOOGLE_API_KEY`、`GOOGLE_BASE_URL` 和 `GOOGLE_MODEL`,以符合 `action.yaml` 中已定義的 Google 相關輸入。",
"is_new": false "is_new": true
},
{
"level": "critical",
"role": "Aria",
"location": ".gitea/ai-review/exclusions.json:12",
"suggestion": "移除 `role` 欄位,JSON schema 只接受 `location` 與 `suggestion`,保留這兩個欄位即可,避免驗證失敗。",
"is_new": false
},
{
"level": "warning",
"role": "Leo",
"location": "app/config.js:5",
"suggestion": "目前使用硬編碼的 `checks` 陣列來管理所有 LLM provider,未來若要新增或移除 provider 必須直接修改程式碼,易產生重複與維護負擔。建議將 provider 設定抽離至外部 JSON/YAML 檔或使用可擴充的資料結構,並在程式中載入,提升模組化與可維護性。",
"is_new": false
},
{
"level": "warning",
"role": "Rex",
"location": ".gitea/workflows/review.yaml:33",
"suggestion": "工作流程目前授予 contents、pullrequests、issues 三項 write 權限,過於寬鬆。建議依實際需求僅授予 read 或最小必要的 write 權限,以降低被濫用的風險。",
"is_new": false
},
{
"level": "warning",
"role": "Rex",
"location": ".gitea/workflows/review.yaml:35",
"suggestion": "將 OPENAI_API_KEY 參數改為使用正確的 secret 名稱(如 OPENROUTER_API_KEY)時,請確保工作流程文件中不會同時暴露兩個不同的 secret 名稱,以免因名稱錯誤導致金鑰未傳入或意外洩漏。",
"is_new": false
}, },
{ {
"level": "warning", "level": "warning",
@@ -41,69 +13,6 @@
"suggestion": "在 `OPENAI_API_KEY` 後的註解前應保留一個空格,以符合常見的 YAML 註解風格:`... ${{ secrets.OPENROUTER_API_KEY }} # OpenRouter 使用 OpenAI 相容介面,以 OPENAI_API_KEY 傳入`。", "suggestion": "在 `OPENAI_API_KEY` 後的註解前應保留一個空格,以符合常見的 YAML 註解風格:`... ${{ secrets.OPENROUTER_API_KEY }} # OpenRouter 使用 OpenAI 相容介面,以 OPENAI_API_KEY 傳入`。",
"is_new": false "is_new": false
}, },
{
"level": "warning",
"role": "Aria",
"location": "README.md",
"suggestion": "文件中章節編號不連續(例如 `### 2. OpenRouter` 後直接跳到 `### 3. Anthropic Claude`),建議重新編號或使用一致的標題層級,以提升可讀性與維護性。",
"is_new": false
},
{
"level": "warning",
"role": "Aria",
"location": "app/config.js",
"suggestion": "`checks` 陣列的每一行過長,超過 120 個字元,建議拆成多行並對齊欄位,以符合程式碼可讀性與行長限制的慣例。",
"is_new": false
},
{
"level": "warning",
"role": "Aria",
"location": "app/config.js",
"suggestion": "`amazonq` 那一行的空格對齊與其他項目不一致,請統一使用單一個空格分隔欄位,或使用對齊工具保持列的垂直對齊。",
"is_new": false
},
{
"level": "warning",
"role": "Leo",
"location": "app/config.js:12",
"suggestion": "目前使用硬編碼的 `checks` 陣列管理所有 LLM provider,未來若要新增或移除 provider 必須直接修改程式碼,易產生重複與維護負擔。建議將 provider 設定抽離至外部 JSON/YAML 檔或使用可擴充的資料結構,於程式中載入,以提升模組化與可維護性。",
"is_new": false
},
{
"level": "warning",
"role": "Zara",
"location": "app/config.js:12",
"suggestion": "改用映射表(Map)或物件儲存 provider 設定,並以 O(1) 方式查找符合條件的項目,減少每次呼叫時的線性掃描成本。",
"is_new": false
},
{
"level": "warning",
"role": "Rex",
"location": ".gitea/workflows/review.yaml:33-35",
"suggestion": "工作流程目前授予 contents、pullrequests、issues 三項 write 權限過於寬鬆。建議依實際需求僅授予 read 或最小必要的 write 權限,降低被濫用的風險。",
"is_new": false
},
{
"level": "warning",
"role": "Rex",
"location": ".gitea/workflows/review.yaml:33",
"suggestion": "將 OPENAI_API_KEY 參數改為使用正確的 secret 名稱(如 OPENROUTER_API_KEY)時,請確保工作流程檔案中不會同時暴露兩個不同的 secret 名稱,以免因名稱錯誤導致金鑰未傳入或意外洩漏。",
"is_new": false
},
{
"level": "warning",
"role": "Rex",
"location": "app/config.js:12",
"suggestion": "在判斷 API 金鑰是否有效時,應先檢查 key 是否為非空字串,避免空字串被誤認為有效金鑰而發送請求。可改為 `if (key && key.trim() && baseURL) …`。",
"is_new": false
},
{
"level": "warning",
"role": "Aria",
"location": ".gitea/ai-review/exclusions.json",
"suggestion": "檔案最後缺少換行符號,請在檔案結尾加入一個空白換行,以符合 POSIX 標準。",
"is_new": false
},
{ {
"level": "warning", "level": "warning",
"role": "Aria", "role": "Aria",
@@ -111,20 +20,6 @@
"suggestion": "檔案最後缺少換行符號,請在檔案結尾加入一個空白換行。", "suggestion": "檔案最後缺少換行符號,請在檔案結尾加入一個空白換行。",
"is_new": false "is_new": false
}, },
{
"level": "warning",
"role": "Aria",
"location": "app/config.js:12-13",
"suggestion": "`checks` 陣列每一行超過 120 個字元,請拆成多行並對齊欄位,以符合常見的行長限制。",
"is_new": false
},
{
"level": "warning",
"role": "Aria",
"location": "app/config.js:13",
"suggestion": "`amazonq` 那一行的空格對齊與其他項目不一致,請統一使用單一個空格分隔欄位或使用對齊工具保持列的垂直對齊。",
"is_new": false
},
{ {
"level": "warning", "level": "warning",
"role": "Aria", "role": "Aria",
@@ -132,20 +27,6 @@
"suggestion": "檔案最後缺少換行符號,請在檔案結尾加入空白換行。", "suggestion": "檔案最後缺少換行符號,請在檔案結尾加入空白換行。",
"is_new": false "is_new": false
}, },
{
"level": "warning",
"role": "Aria",
"location": "README.md:28",
"suggestion": "文件中章節編號不連續(例如 `### 2. OpenRouter` 後直接跳到 `### 3. Anthropic Claude`),請重新編號或使用自動編號方式,保持編號連續。",
"is_new": false
},
{
"level": "warning",
"role": "Aria",
"location": "README.md:42",
"suggestion": "標題層級使用不一致,部分章節使用 `### 1.`、`### 2.`,而後面的章節直接跳到 `### 3.`,建議統一使用相同層級的 Markdown 標題,並在每個標題後留一個空行以提升可讀性。",
"is_new": false
},
{ {
"level": "warning", "level": "warning",
"role": "Aria", "role": "Aria",
@@ -154,25 +35,18 @@
"is_new": false "is_new": false
}, },
{ {
"level": "info", "level": "warning",
"role": "Zara", "role": "Aria",
"location": "app/config.js", "location": ".gitea/workflows/review.yaml:36",
"suggestion": "對於未設定 API 金鑰的 provider(如 ollama),可提前返回快取的預設設定,避免每次呼叫都進行條件檢查。", "suggestion": "`secrets.GEMINI_API_KEY_1` 的命名方式建議審視。如果這是唯一的 Gemini API 金鑰,可考慮簡化為 `GEMINI_API_KEY`。若有多個金鑰,建議使用更具描述性的後綴(例如 `GEMINI_API_KEY_PRIMARY` 或 `GEMINI_API_KEY_SERVICE_A`),以提升命名清晰度與一致性。",
"is_new": false "is_new": true
}, },
{ {
"level": "info", "level": "warning",
"role": "Rex", "role": "Maya",
"location": "README.md:28", "location": "app/",
"suggestion": "文件中列出的權限說明應與實際 workflow 中的 permissions 保持一致,並提醒使用者僅在必要時授予 write 權限,避免在 CI/CD 環境中過度授權。", "suggestion": "此次變更將 AI 審查服務從 OpenRouter 切換至 Gemini。儘管 `action.yaml` 中已存在 `GOOGLE_*` 相關的輸入,但此 Git Diff 並未包含任何針對 Gemini API 整合的單元測試或整合測試。請確認現有的測試是否足以涵蓋 Gemini API 的特定行為、回應格式以及錯誤處理。若無,建議為 Gemini 整合新增專屬的整合測試,以確保其在實際運作中的穩定性與正確性,特別是針對 `https://generativelanguage.googleapis.com/v1beta` 這個 Base URL 和所選的 `GEMINI_MODEL`。",
"is_new": false "is_new": true
},
{
"level": "info",
"role": "Rex",
"location": "app/config.js:12",
"suggestion": "在取得 LLM 設定時,若 key 為空字串仍會被視為有效。建議在判斷前先檢查 key 是否為非空字串,以防止意外使用空的 API 金鑰發送請求。",
"is_new": false
}, },
{ {
"level": "info", "level": "info",
@@ -188,27 +62,6 @@
"suggestion": "`ENV_KEYS` 陣列過長,建議分行列舉,每行放置一個環境變數,以提升可讀性。", "suggestion": "`ENV_KEYS` 陣列過長,建議分行列舉,每行放置一個環境變數,以提升可讀性。",
"is_new": false "is_new": false
}, },
{
"level": "info",
"role": "Aria",
"location": "app/findings.js",
"suggestion": "錯誤訊息 `AI 回傳空陣列或非陣列` 可簡化為 `AI 回傳的結果不是有效的非空陣列`,讓訊息更清晰。",
"is_new": false
},
{
"level": "info",
"role": "Leo",
"location": "app/config.js:12",
"suggestion": "`checks` 陣列的每一行過長,超過 120 個字元,建議拆成多行並對齊欄位,以符合程式碼可讀性與行長限制的慣例。",
"is_new": false
},
{
"level": "info",
"role": "Leo",
"location": "app/findings.js:151",
"suggestion": "函式內使用 `console.log` 輸出過濾結果,可能在正式環境產生過多日誌。建議改以 logger 並提供可設定的 log level,或在非除錯模式下移除此輸出。",
"is_new": false
},
{ {
"level": "info", "level": "info",
"role": "Leo", "role": "Leo",
@@ -243,5 +96,12 @@
"location": ".gitea/workflows/review.yaml:33", "location": ".gitea/workflows/review.yaml:33",
"suggestion": "在 `OPENAI_API_KEY` 後的註解前保留一個空格,以符合常見的 YAML 註解風格:`... ${{ secrets.OPENROUTER_API_KEY }} # OpenRouter 使用 OpenAI 相容介面,以 OPENAI_API_KEY 傳入`。", "suggestion": "在 `OPENAI_API_KEY` 後的註解前保留一個空格,以符合常見的 YAML 註解風格:`... ${{ secrets.OPENROUTER_API_KEY }} # OpenRouter 使用 OpenAI 相容介面,以 OPENAI_API_KEY 傳入`。",
"is_new": false "is_new": false
},
{
"level": "info",
"role": "Zara",
"location": ".gitea/workflows/review.yaml:35-37",
"suggestion": "工作流程從 OpenRouter/OpenAI 服務切換至 Google Gemini 服務。雖然這本身不是程式碼錯誤,但不同 AI 服務提供商的 API 響應時間、吞吐量和穩定性可能存在差異。建議監控切換後 AI Code Review 步驟的執行時間,確保新配置能維持或提升效能,並留意潛在的成本變化。",
"is_new": true
} }
] ]
+3 -3
View File
@@ -33,9 +33,9 @@ jobs:
- name: AI Code Review - name: AI Code Review
uses: https://gitea.jsc.idv.tw/jiantw83/code-review@v${{ needs.version.outputs.version }} uses: https://gitea.jsc.idv.tw/jiantw83/code-review@v${{ needs.version.outputs.version }}
with: with:
OPENAI_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} # OpenRouter 使用 OpenAI 相容介面,以 OPENAI_API_KEY 傳入 GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY_1 }}
OPENAI_BASE_URL: https://openrouter.ai/api/v1 GEMINI_BASE_URL: https://generativelanguage.googleapis.com/v1beta
OPENAI_MODEL: ${{ vars.OPENROUTER_MODEL }} GEMINI_MODEL: ${{ vars.GEMINI_MODEL }}
permissions: permissions:
contents: write contents: write
pull-requests: write pull-requests: write
-2
View File
@@ -72,8 +72,6 @@ inputs:
description: 'Amazon Q Base URL' description: 'Amazon Q Base URL'
required: false required: false
runs: runs:
using: 'docker' using: 'docker'
image: 'Dockerfile' image: 'Dockerfile'