feat: 導入 AI 程式碼審查 action 並修正進入點與參數接線 #1
+21
-1
@@ -39,10 +39,30 @@ function cliArgs({ provider, model, promptFile = null, prompt = null }) {
|
|||||||
throw new Error(`不支援的 AI 助理 CLI: ${provider}`);
|
throw new Error(`不支援的 AI 助理 CLI: ${provider}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 從 CLI 輸出中抽出「真正有意義的錯誤」。
|
||||||
|
*
|
||||||
|
* 像 codex 這類 CLI 會先印出一大段 banner(workdir/model/...)與回顯的 prompt,
|
||||||
|
* 真正的失敗原因(例如 401、token 失效、額度不足)通常落在**尾端**。直接取前段
|
||||||
|
* 會被 banner/prompt 洗掉,因此改為:先抽出看起來像錯誤的行;抽不到再退取尾段。
|
||||||
|
*
|
||||||
|
* @param {string} raw - CLI 的原始輸出(stderr 或 stdout)。
|
||||||
|
* @param {number} [limit=1000] - 回傳字串長度上限。
|
||||||
|
* @returns {string} 最能說明失敗原因的片段。
|
||||||
|
*/
|
||||||
|
export function extractMeaningfulError(raw, limit = 1000) {
|
||||||
|
const text = String(raw || '').trim();
|
||||||
|
const errorLines = text
|
||||||
|
.split('\n')
|
||||||
|
admin marked this conversation as resolved
|
|||||||
|
.filter(l => /\bERROR\b|error:|unauthorized|invalidated|revoked|forbidden|\b40[13]\b|rate.?limit|quota|insufficient/i.test(l));
|
||||||
|
const picked = (errorLines.length ? errorLines.join('\n') : text).trim();
|
||||||
|
return picked.length > limit ? picked.slice(-limit) : picked;
|
||||||
|
}
|
||||||
|
|
||||||
function summarizeCliError(e) {
|
function summarizeCliError(e) {
|
||||||
const stderr = String(e.stderr || '').trim();
|
const stderr = String(e.stderr || '').trim();
|
||||||
const stdout = String(e.stdout || '').trim();
|
const stdout = String(e.stdout || '').trim();
|
||||||
return (stderr || stdout || e.message || String(e)).slice(0, 1000);
|
return extractMeaningfulError(stderr || stdout || e.message || String(e));
|
||||||
}
|
}
|
||||||
|
admin marked this conversation as resolved
admin
commented
嚴重等級:🟡 警告 **嚴重等級**:🟡 警告
**審查員**:Maya
**問題**:`runAssistantCLI()` 目前只有成功與一般失敗的測試,沒有覆蓋 timeout、`maxBuffer` 超限、以及 `opencode` 分支建立的暫存 prompt 檔在例外發生時是否確實清理。這些都是外部 CLI 整合最常出問題的失敗路徑,沒有測到就很難確定不會留下殘檔或把流程卡死。
**建議**:補 fake CLI 測試,讓子程序超時、輸出超過 `AI_ASSISTANT_MAX_BUFFER`、以及 `opencode` 在 `spawn`/`close` 前後失敗,分別斷言會回傳對應錯誤,且暫存目錄與 `prompt.md` 會被清掉。
|
|||||||
|
|
||||||
async function runAssistantCLI({ provider, command, model }, prompt) {
|
async function runAssistantCLI({ provider, command, model }, prompt) {
|
||||||
|
|||||||
Reference in New Issue
Block a user
嚴重等級:🟡 警告
審查員:Bard
問題:
cliArgs把不同提供者的參數拼湊在同一個分支裡,還讓opencode走了另一套文字輸入路線,整個 helper 的節奏忽然一分為二。讀起來像兩個介面硬塞進同一支笛子。建議:拆成各提供者各自的 argv builder,或至少把 prompt 輸入方式抽成獨立 helper,讓每個分支只處理一種責任,結構會更俐落。