feat(codex-response): 整合 Codex issue 回覆 action #2

Merged
jiantw83 merged 10 commits from ai-review-resolve/develop-20260624-154546 into develop 2026-06-24 16:07:50 +00:00
2 changed files with 25 additions and 65 deletions
Showing only changes of commit 03857bc7c9 - Show all commits
+24
View File
@@ -16,5 +16,29 @@
"role": "Leo",
"original_finding": "建議將與 Gitea API 互動的邏輯封裝成一個獨立的 shell script 或另一個獨立的 Action,使此 composite action 的 `runs` 階段更清晰,專注於流程編排而非細節實作。",
"reason": "此 action 的核心職責就是產生 AI 回覆並留言到 Gitea issue;目前 inline API 呼叫很短且已包含 URL 驗證、空回覆檢查與 JSON escaping,額外拆成 script/action 對此小型 composite action 並非必要修復。"
},
{
"location": "action.yml:96",
"role": "Maya",
"original_finding": "應補上測試案例,驗證當 `GITEA_SERVER_URL` 輸入為非預期格式、空白或惡意字串時,系統是否能正確攔截並處理。",
"reason": "目前 action 已以白名單與空值檢查在執行期攔截非預期 Gitea URL;此 repository 沒有既有測試框架,為單一 composite action 額外建立 mock runner 測試超出本次修復範圍。"
},
{
"location": "action.yml:109",
"role": "Maya",
"original_finding": "建議模擬 `curl` 接收到不同 HTTP 錯誤代碼的情境,驗證 Workflow 是否會正確執行失敗並留下相應錯誤訊息。",
"reason": "curl 已使用 --fail-with-body,非 2xx 會使 workflow 失敗並輸出 API body;此 repository 沒有既有測試框架可模擬 HTTP 狀態碼,新增完整 mock 測試不屬於目前 action 修復的最小範圍。"
},
{
"location": "action.yml:85",
"role": "Maya",
"original_finding": "建議在測試案例中模擬 `steps.codex` 輸出為空字串,以驗證是否確實會以錯誤狀態結束 Workflow。",
"reason": "空回覆已在 action 內以 [ -z \"$RESPONSE\" ] 明確失敗;此 repository 沒有既有測試框架,無法在不新增大型 mock harness 的情況下驗證 steps.codex output。"
},
{
"location": "action.yml:80",
"role": "Rogue",
"original_finding": "直接使用 bash 的字串操作功能進行 URL 清理,對於 API 請求,應考慮將所有邏輯合併為單一腳本區塊,避免多次呼叫外部進程(如 `jq`)。建議可以直接利用 curl 的 --json 選項(若版本支援)或更直接的處理方式減少對外部依賴的 fork。",
"reason": "此處保留 jq 是為了正確處理多行與特殊字元的 JSON escaping,避免手寫 JSON 或依賴 runner curl 版本的 --json 支援;安全與相容性優先於移除單一外部程序。"
}
]
+1 -65
View File
@@ -1,65 +1 @@
[
{
"level": "critical",
"role": "Maya",
"location": "action.yml:61",
"problem": "在建立 Prompt 的步驟中,完全沒有針對 `ISSUE_TITLE`、`ISSUE_BODY` 或 `COMMENT_BODY` 為空的情況進行測試或驗證,這可能導致產生的 Prompt 語意不清或格式錯誤。",
"suggestion": "建議加入 bash 檢查,若這些必要的輸入欄位為空,應明確拋出錯誤或提供預設內容,確保 Prompt 產生的結構完整。",
"is_new": true
},
{
"level": "critical",
"role": "Maya",
"location": "action.yml:96",
"problem": "檢查 Gitea Server URL 是否支援僅依賴於 `case` 比對,缺乏對無效輸入(如惡意網址或錯誤格式)的邊界測試。",
"suggestion": "應補上測試案例,驗證當 `GITEA_SERVER_URL` 輸入為非預期格式、空白或惡意字串時,系統是否能正確攔截並處理。",
"is_new": true
},
{
"level": "critical",
"role": "Maya",
"location": "action.yml:109",
"problem": "`curl` 執行 API 呼叫時,若 API 回傳非 2xx 狀態碼(例如 401 Unauthorized, 404 Not Found, 403 Forbidden),雖然使用 `--fail-with-body`,但缺乏對應這些錯誤狀態的測試案例以確保流程處理符合預期。",
"suggestion": "建議模擬 `curl` 接收到不同 HTTP 錯誤代碼的情境,驗證 Workflow 是否會正確執行失敗並留下相應錯誤訊息。",
"is_new": true
},
{
"level": "warning",
"role": "Bard",
"location": "action.yml:58",
"problem": "在建立 Prompt 的步驟中,shell 腳本內混用了多種輸出方式(`printf` 與 `echo`),節奏不統一,且 `printf` 參數過多導致排版顯得瑣碎。",
"suggestion": "建議統一使用 `cat <<EOF` 來組織長文本,會比多個 `printf` 更加流暢易讀。",
"is_new": true
},
{
"level": "warning",
"role": "Maya",
"location": "action.yml:85",
"problem": "當 `steps.codex` 回覆內容為空時,雖然有檢查並退出,但該測試案例(Codex 產生空回應)未被明確驗證。",
"suggestion": "建議在測試案例中模擬 `steps.codex` 輸出為空字串,以驗證是否確實會以錯誤狀態結束 Workflow。",
"is_new": true
},
{
"level": "warning",
"role": "Rogue",
"location": "action.yml:80",
"problem": "在處理 `gitea_server_url` 時使用了 `printf` 與管道與 `curl`,但在這之前已經在 bash shell 中處理了變數,這裡存在一個不必要的 fork 與潛在的效能損耗。",
"suggestion": "直接使用 bash 的字串操作功能進行 URL 清理,對於 API 請求,應考慮將所有邏輯合併為單一腳本區塊,避免多次呼叫外部進程(如 `jq`)。建議可以直接利用 curl 的 --json 選項(若版本支援)或更直接的處理方式減少對外部依賴的 fork。"
},
{
"level": "info",
"role": "Bard",
"location": "action.yml:104",
"problem": "在 `curl` 命令中,`--data @-` 搭配 `jq` 處理 JSON 的寫法雖然功能正確,但混雜了太多的處理邏輯在同一行,降低了可讀性。",
"suggestion": "建議將 `jq` 處理與 `curl` 的呼叫分開,或者在 `run` 腳本中先將變數準備好,讓最終的 `curl` 命令更簡潔。",
"is_new": true
},
{
"level": "info",
"role": "Rogue",
"location": "action.yml:61",
"problem": "使用 `shopt -s extglob` 進行字串處理是正確的,但頻繁的 `printf` 呼叫在 shell 中會產生多次子行程,對於大型 issue body,這會消耗不必要的 CPU 時間。",
"suggestion": "將多次 `printf` 合併為單一的 `printf` 呼叫,或者改用單一的 `cat <<EOF` 區塊,這樣可以大幅減少 shell 進程的 fork 次數,提升執行速度。",
"is_new": true
}
]
[]