Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 234a8a829f | |||
| b164fe855e | |||
| 16cb1966f0 | |||
| 8d3f5e3a45 | |||
| 85ff61e98f | |||
| 4bace91d3d | |||
| e541cee83f | |||
| 95802c422b | |||
| bf7b8f843b | |||
| e88e586ac6 | |||
| 6921ca05ec | |||
| 8046708f00 | |||
| 58fdbdd965 |
@@ -24,5 +24,50 @@
|
||||
{
|
||||
"location": "app/findings.js",
|
||||
"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 已整理,多餘空行已移除,結構整潔"
|
||||
}
|
||||
{
|
||||
"role": "Maya",
|
||||
"location": "app/",
|
||||
"suggestion": "LLM 整合測試需要真實 API key 與網路,不適合加入單元測試。llm.js 使用統一 OpenAI 相容介面,Gemini 透過相同介面呼叫,無特殊格式差異,現有測試已涵蓋 config/findings/git 邏輯"
|
||||
},
|
||||
{
|
||||
"role": "Leo",
|
||||
"location": "app/config.test.js",
|
||||
"suggestion": "import 語句長度合理,無需拆分為多行"
|
||||
}
|
||||
]
|
||||
|
||||
+17
-108
@@ -1,45 +1,10 @@
|
||||
[
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Rex",
|
||||
"location": ".gitea/workflows/review.yaml:33",
|
||||
"suggestion": "工作流程目前授予 contents、pull‑requests、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",
|
||||
"role": "Aria",
|
||||
"location": ".gitea/workflows/review.yaml:33",
|
||||
"suggestion": "在 `OPENAI_API_KEY` 後的註解前應保留一個空格,以符合常見的 YAML 註解風格:`... ${{ secrets.OPENROUTER_API_KEY }} # OpenRouter 使用 OpenAI 相容介面,以 OPENAI_API_KEY 傳入`。",
|
||||
"is_new": false
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Aria",
|
||||
"location": "README.md",
|
||||
"suggestion": "文件中章節編號不連續(例如 `### 2. OpenRouter` 後直接跳到 `### 3. Anthropic Claude`),建議重新編號或使用一致的標題層級,以提升可讀性與維護性。",
|
||||
"is_new": false
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Rex",
|
||||
"location": ".gitea/workflows/review.yaml:33-35",
|
||||
"suggestion": "工作流程目前授予 contents、pull‑requests、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": "critical",
|
||||
"role": "Maya",
|
||||
"location": "app/",
|
||||
"suggestion": "此次變更將 AI 審查服務從 OpenRouter 切換至 Gemini,涉及不同的 API 端點、請求/回應格式及錯誤處理機制。儘管 `action.yaml` 已配置 Gemini 相關參數,但 Git Diff 中未見針對 Gemini API 整合的單元測試或整合測試。雖然 LLM 整合測試可能不適合傳統的單元測試(因需真實 API key),但這不應排除建立專屬的整合測試。現有測試可能僅涵蓋 `config/findings/git` 的通用邏輯,不足以全面驗證與 Gemini 服務的特定互動,例如請求建構、回應解析、特定錯誤碼處理及邊界條件。強烈建議為 Gemini 整合新增專屬的整合測試,以確保其在實際運作中的穩定性與正確性。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
@@ -50,79 +15,23 @@
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Aria",
|
||||
"location": "app/config.test.js",
|
||||
"suggestion": "檔案最後缺少換行符號,請在檔案結尾加入空白換行。",
|
||||
"is_new": false
|
||||
"role": "Leo",
|
||||
"location": ".gitea/ai-review/findings.json",
|
||||
"suggestion": "`findings.json` 中重新出現關於 `app/config.test.js` 檔案結尾換行符號及匯入語句長度的警告/資訊,但 `exclusions.json` 卻明確指出這些問題已解決或無需修改。這種矛盾會導致審查流程混亂,降低 AI 審查系統的可靠性。建議釐清並統一 AI 審查的設定或排除規則,確保其一致性,避免重複提出已處理或被排除的問題。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"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",
|
||||
"role": "Aria",
|
||||
"location": "action.yaml:72-99",
|
||||
"suggestion": "大量移除的輸入欄位留下多行空白與註解,請整理檔案結構,移除不必要的空行與註解,保持檔案整潔。",
|
||||
"is_new": false
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Aria",
|
||||
"location": "app/config.test.js",
|
||||
"suggestion": "匯入語句過長,建議改寫為多行匯入,例如:\n```js\nimport {\n describe,\n it,\n beforeEach,\n afterEach\n} from 'node:test';\n```",
|
||||
"is_new": false
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Aria",
|
||||
"location": "app/config.test.js",
|
||||
"suggestion": "`ENV_KEYS` 陣列過長,建議分行列舉,每行放置一個環境變數,以提升可讀性。",
|
||||
"is_new": false
|
||||
"role": "Maya",
|
||||
"location": "app/comments.js:24",
|
||||
"suggestion": "`saveFindings` 函數在寫入 `findings.json` 時新增了換行符號。請確認現有的測試是否已涵蓋此輸出格式的變更,確保測試能夠精確驗證檔案內容,包括結尾的換行符號。若無,建議更新或新增測試案例以確保此行為被正確驗證。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Leo",
|
||||
"location": "app/config.test.js:1",
|
||||
"suggestion": "匯入語句過長,建議改寫為多行匯入,以提升可讀性,例如:\n```js\nimport {\n describe,\n it,\n beforeEach,\n afterEach\n} from 'node:test';\n```",
|
||||
"is_new": false
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Leo",
|
||||
"location": "app/config.test.js:9",
|
||||
"suggestion": "`ENV_KEYS` 陣列過長,建議分行列舉,每行放置一個環境變數,以提升可讀性與維護性。",
|
||||
"is_new": false
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Aria",
|
||||
"location": "app/config.test.js:1",
|
||||
"suggestion": "匯入語句過長,建議改寫為多行匯入,例如:\n```js\nimport {\n describe,\n it,\n beforeEach,\n afterEach\n} from 'node:test';\n```",
|
||||
"is_new": false
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Aria",
|
||||
"location": "app/config.test.js:7",
|
||||
"suggestion": "`ENV_KEYS` 陣列過長,建議每行放置一個環境變數,分行列舉以提升可讀性。",
|
||||
"is_new": false
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Aria",
|
||||
"location": ".gitea/workflows/review.yaml:33",
|
||||
"suggestion": "在 `OPENAI_API_KEY` 後的註解前保留一個空格,以符合常見的 YAML 註解風格:`... ${{ secrets.OPENROUTER_API_KEY }} # OpenRouter 使用 OpenAI 相容介面,以 OPENAI_API_KEY 傳入`。",
|
||||
"is_new": false
|
||||
"location": ".gitea/workflows/review.yaml",
|
||||
"suggestion": "工作流程已從 OpenRouter/OpenAI 服務切換至 Google Gemini 服務。不同 AI 服務提供商的 API 響應時間、吞吐量和穩定性可能存在差異。建議在切換後監控 AI Code Review 步驟的執行時間,確保新配置能維持或提升效能,並留意潛在的成本變化,以利長期維護與優化。",
|
||||
"is_new": true
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
@@ -33,9 +33,9 @@ jobs:
|
||||
- name: AI Code Review
|
||||
uses: https://gitea.jsc.idv.tw/jiantw83/code-review@v${{ needs.version.outputs.version }}
|
||||
with:
|
||||
OPENAI_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} # OpenRouter 使用 OpenAI 相容介面,以 OPENAI_API_KEY 傳入
|
||||
OPENAI_BASE_URL: https://openrouter.ai/api/v1
|
||||
OPENAI_MODEL: ${{ vars.OPENROUTER_MODEL }}
|
||||
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY_1 }}
|
||||
GEMINI_BASE_URL: https://generativelanguage.googleapis.com/v1beta
|
||||
GEMINI_MODEL: ${{ vars.GEMINI_MODEL }}
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
@@ -72,8 +72,6 @@ inputs:
|
||||
description: 'Amazon Q Base URL'
|
||||
required: false
|
||||
|
||||
|
||||
|
||||
runs:
|
||||
using: 'docker'
|
||||
image: 'Dockerfile'
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@ function buildTable(findings) {
|
||||
export function saveFindings(workspace, findings) {
|
||||
const fullPath = path.join(workspace, FINDINGS_PATH);
|
||||
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
||||
fs.writeFileSync(fullPath, JSON.stringify(findings, null, 2), 'utf8');
|
||||
fs.writeFileSync(fullPath, JSON.stringify(findings, null, 2) + '\n', 'utf8');
|
||||
console.log(` ✅ findings 寫入: ${fullPath} (${findings.length} 筆)`);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user