@@ -1,17 +1,17 @@
---
---
name : code-review-resolve
name : code-review-resolve
description : 解決新版 AI Code Review 的 findings( `.gitea/ai-review/findings/` 目錄下每次 review 一個 wrapper 物件 JSON,含 `findings`/`excluded` 陣列、中文 severity),或指定 Gitea 議題編號(建問題模式,從議題標題/描述/留言解析嚴重問題為 findings);先同步 git(fetch → 檢查目前分支的遠端分支是否存在;存在則留在目前分支 pull 更新,不存在則切換到 develop/ master 後 pull 更新;只有來源分支與 PR 目標分支相同時才建立新的工作分支;必要時嘗試解衝突),再依嚴重度(嚴重/警告/建議)逐條修復;可判斷為誤報者寫入 `.gitea/ai-review/exclusions.json`,已解決或已登記為誤報的 finding 逐檔就地自來源 wrapper 移除;議題模式修復後於議題留言進度、全解決時 關閉議題;接著可將工作區變更依 conventional commit 類型分類提交、push 當前分支,並透過 Gitea API 對指定目標分支開 PR。當使用者說解決 findings、處理 AI review 問題、依議題編號修 code review 問題、修掉 `.gitea/ai-review` 問題、依嚴重度修復後分類提交,或要分類 commit 並 push/開 PR 時觸發。不適用於:產生 findings、單純 code review 不修改、只保存裁決紀錄,或只要不分類的單一 commit。
description : 解決新版 AI Code Review 的 findings( `.gitea/ai-review/findings/` 目錄下每次 review 一個 wrapper 物件 JSON,含 `findings`/`excluded` 陣列、中文 severity),或指定 Gitea 議題編號(建問題模式,從議題標題/描述/留言解析嚴重問題為 findings);先同步 git(fetch → 檢查目前分支的遠端分支是否存在;存在則留在目前分支 pull 更新,不存在則切換到 develop/ master 後 pull 更新;只有來源分支與 PR 目標分支相同時才建立新的工作分支;必要時嘗試解衝突),再依嚴重度(嚴重/警告/建議)逐條修復;可判斷為誤報者寫入 `.gitea/ai-review/exclusions.json`,已解決或已登記為誤報的 finding 逐檔就地自來源 wrapper 移除;議題模式修復後於議題留言進度、把待人工處理問題寫回 findings 目錄後 關閉議題;接著可將工作區變更依 conventional commit 類型分類提交、push 當前分支,並透過 Gitea API 對指定目標分支開 PR。當使用者說解決 findings、處理 AI review 問題、依議題編號修 code review 問題、修掉 `.gitea/ai-review` 問題、依嚴重度修復後分類提交,或要分類 commit 並 push/開 PR 時觸發。不適用於:產生 findings、單純 code review 不修改、只保存裁決紀錄,或只要不分類的單一 commit。
argument-hint : "[--issue <議題編號>] [--findings <findings 檔或目錄路徑>] [--target <目標分支>] [--pr-desc <full|simple|自訂文字>] [--no-commit] [--no-pr] [--yes]"
argument-hint : "[--issue <議題編號>] [--findings <findings 檔或目錄路徑>] [--target <目標分支>] [--pr-desc <full|simple|自訂文字>] [--no-commit] [--no-pr] [--yes]"
---
---
# code-review-resolve — 解決 AI review findings、分類提交、push 並開 PR
# code-review-resolve — 解決 AI review findings、分類提交、push 並開 PR
五階段 skill:先執行 **git 同步 ** ( `git fetch` → 確認目前分支的遠端分支是否存在;存在則留在目前分支 `git pull` 更新,不存在則切換到 `develop` ,再退而 `master` 後 `git pull` 更新;只有來源分支與 PR 目標分支相同時才建立新的工作分支;必要時告知並嘗試解衝突),再**逐條處理**問題來源——預設讀 `.gitea/ai-review/findings/` 目錄下每次 review 產生的 wrapper 物件 JSON(取其 `findings` 陣列),或帶 `--issue <議題編號>` 時從 Gitea 議題標題/描述/留言解析嚴重問題;成立問題修復後自來源 wrapper 逐檔就地移除,可判斷為誤報者寫入 `.gitea/ai-review/exclusions.json` 後也可移除(議題模式改在議題留言進度、全解決時 關閉議題),接著**必須盤點並處理工作區的所有變更**,再依 conventional commit 類型分門別類 commit,然後 **push 當前分支 ** ,最後**透過 Gitea API 發 PR**。
五階段 skill:先執行 **git 同步 ** ( `git fetch` → 確認目前分支的遠端分支是否存在;存在則留在目前分支 `git pull` 更新,不存在則切換到 `develop` ,再退而 `master` 後 `git pull` 更新;只有來源分支與 PR 目標分支相同時才建立新的工作分支;必要時告知並嘗試解衝突),再**逐條處理**問題來源——預設讀 `.gitea/ai-review/findings/` 目錄下每次 review 產生的 wrapper 物件 JSON(取其 `findings` 陣列),或帶 `--issue <議題編號>` 時從 Gitea 議題標題/描述/留言解析嚴重問題;成立問題修復後自來源 wrapper 逐檔就地移除,可判斷為誤報者寫入 `.gitea/ai-review/exclusions.json` 後也可移除(議題模式改在議題留言進度、把待人工處理問題寫回 findings 目錄後 關閉議題),接著**必須盤點並處理工作區的所有變更**,再依 conventional commit 類型分門別類 commit,然後 **push 當前分支 ** ,最後**透過 Gitea API 發 PR**。
| 階段 | 動作 |
| 階段 | 動作 |
| --- | --- |
| --- | --- |
| A. Git 同步 | `git fetch` → 當前分支不在遠端則切換 develop(再退而 master)→ `git pull` /必要時解衝突 → 只有來源分支與 PR 目標分支相同時才建立新工作分支 |
| A. Git 同步 | `git fetch` → 當前分支不在遠端則切換 develop(再退而 master)→ `git pull` /必要時解衝突 → 只有來源分支與 PR 目標分支相同時才建立新工作分支 |
| B. 解決問題 | 讀 `.gitea/ai-review/findings/*.json` ( wrapper 物件,取 `findings` )或 `--issue` 議題留言 / `exclusions.json` → 依等級 🔴嚴重→🟠警告→🔵建議 逐條修復或判斷誤報 → 已解決者逐檔就地自來源 wrapper 移除,誤報寫入 `exclusions.json` ;議題模式回寫議題(留言+全解決 關閉);**無待處理問題則跳到階段 D** |
| B. 解決問題 | 讀 `.gitea/ai-review/findings/*.json` ( wrapper 物件,取 `findings` )或 `--issue` 議題留言 / `exclusions.json` → 依等級 🔴嚴重→🟠警告→🔵建議 逐條修復或判斷誤報 → 已解決者逐檔就地自來源 wrapper 移除,誤報寫入 `exclusions.json` ;議題模式回寫議題(留言+待人工處理寫回 findings 後 關閉);**無待處理問題則跳到階段 D** |
| C. 分類提交 | 必須分析並涵蓋工作區所有變更(已修改/新增/刪除/改名,含已暫存與未暫存、未追蹤檔、findings/exclusions 更新)→ 依 feat/fix/docs/style/refactor/perf/test/chore/revert 分組 → 各組一個 commit |
| C. 分類提交 | 必須分析並涵蓋工作區所有變更(已修改/新增/刪除/改名,含已暫存與未暫存、未追蹤檔、findings/exclusions 更新)→ 依 feat/fix/docs/style/refactor/perf/test/chore/revert 分組 → 各組一個 commit |
| D. Push 當前分支 | 認證管理器 → 失敗改 token → 再失敗詢問使用者;**無 commit 可 push 則跳到階段 E** |
| D. Push 當前分支 | 認證管理器 → 失敗改 token → 再失敗詢問使用者;**無 commit 可 push 則跳到階段 E** |
| E. 發出 PR | 確定目標分支(不明必問)→ 選 PR 描述(完整/簡單/自訂)→ token 呼叫 Gitea API 建 PR → 通知並清除內文 |
| E. 發出 PR | 確定目標分支(不明必問)→ 選 PR 描述(完整/簡單/自訂)→ token 呼叫 Gitea API 建 PR → 通知並清除內文 |
@@ -39,7 +39,7 @@ argument-hint: "[--issue <議題編號>] [--findings <findings 檔或目錄路
格式:`[--issue <議題編號>] [--findings <路徑>] [--target <目標分支>] [--pr-desc <full|simple|自訂文字>] [--no-commit] [--no-pr] [--yes]`
格式:`[--issue <議題編號>] [--findings <路徑>] [--target <目標分支>] [--pr-desc <full|simple|自訂文字>] [--no-commit] [--no-pr] [--yes]`
- `--issue <議題編號>` :**議題模式**——問題來源改為指定的 Gitea 議題(對應 code-review 的建問題模式)。帶此參數時走階段 B0:讀議題標題/描述/全部留言,把符合嚴重問題留言格式的內容解析成 findings,逐條修復;修復後於階段 B5 在議題留言進度、全部解決時 關閉議題。此模式**不讀 `findings/` 目錄**(除非同時明確帶 `--findings` )。需要 `GITEA_TOKEN` 與可解析的 `origin` repo 座標。
- `--issue <議題編號>` :**議題模式**——問題來源改為指定的 Gitea 議題(對應 code-review 的建問題模式)。帶此參數時走階段 B0:讀議題標題/描述/全部留言,把符合嚴重問題留言格式的內容解析成 findings,逐條修復;修復後於階段 B5 在議題留言進度、把待人工處理問題寫回 `findings/` 目錄後 關閉議題。此模式**不讀 `findings/` 目錄**(除非同時明確帶 `--findings` )。需要 `GITEA_TOKEN` 與可解析的 `origin` repo 座標。
- `--findings <路徑>` : findings 來源路徑。**省略時預設讀目錄 `.gitea/ai-review/findings/` 下所有 `*.json` (每個檔為新版 wrapper 物件,取其 `findings` 陣列合併)**(相對於工作目錄根)。指定路徑時:目錄則讀該目錄所有 `*.json` ;單一檔則讀該檔(同為 wrapper 物件)。與 `--issue` 併用時,兩者的問題都納入處理。
- `--findings <路徑>` : findings 來源路徑。**省略時預設讀目錄 `.gitea/ai-review/findings/` 下所有 `*.json` (每個檔為新版 wrapper 物件,取其 `findings` 陣列合併)**(相對於工作目錄根)。指定路徑時:目錄則讀該目錄所有 `*.json` ;單一檔則讀該檔(同為 wrapper 物件)。與 `--issue` 併用時,兩者的問題都納入處理。
- `--target <目標分支>` :PR 的目標分支。**省略時必須詢問使用者,不可猜測**;若需要避免把同名來源分支誤推到目標分支,可能會在階段 D 先詢問並於階段 E 沿用。
- `--target <目標分支>` :PR 的目標分支。**省略時必須詢問使用者,不可猜測**;若需要避免把同名來源分支誤推到目標分支,可能會在階段 D 先詢問並於階段 E 沿用。
- `--pr-desc <full|simple|自訂文字>` : PR 描述形式。`full` =完整版(重新分析 diff 總結)、`simple` =簡單版(逐條列 commit 訊息)、或直接給自訂文字;省略時預設 `full` ,不要為描述形式中斷詢問。
- `--pr-desc <full|simple|自訂文字>` : PR 描述形式。`full` =完整版(重新分析 diff 總結)、`simple` =簡單版(逐條列 commit 訊息)、或直接給自訂文字;省略時預設 `full` ,不要為描述形式中斷詢問。
@@ -221,7 +221,7 @@ source_branch="$(git rev-parse --abbrev-ref HEAD)"
逐則映射為 ` { reviewer, severity, file, startLine, endLine, problem, suggestion, suggestedCode }`,並記住來源留言 id(供 B5 回報);議題標題/描述作為整體背景脈絡納入判斷。
逐則映射為 ` { reviewer, severity, file, startLine, endLine, problem, suggestion, suggestedCode }`,並記住來源留言 id(供 B5 回報);議題標題/描述作為整體背景脈絡納入判斷。
4. 解析不到任何嚴重問題留言 → 回報並停止議題模式,不臆測。
4. 解析不到任何嚴重問題留言 → 回報並停止議題模式,不臆測。
5. 議題模式下沒有 findings 檔可更新;解析出的問題直接進入 B2/B3,處理結果於 B5 回寫議題(留言+全解決時關閉 ),誤報仍寫入 ` exclusions.json`。
5. 議題模式下沒有現成 findings 檔可更新;解析出的問題直接進入 B2/B3,處理結果於 B5 回寫議題(留言+把待人工處理問題寫回 ` findings/ ` 目錄後關閉議題 ),誤報仍寫入 ` exclusions.json`。
### B1. 讀取 findings 與 exclusions(檔案/目錄來源)
### B1. 讀取 findings 與 exclusions(檔案/目錄來源)
@@ -274,7 +274,23 @@ source_branch="$(git rev-parse --abbrev-ref HEAD)"
議題模式所有問題處理完畢後:
議題模式所有問題處理完畢後:
1. **在議題留言回報進度**( Gitea API ` POST /repos/<owner>/<repo>/issues/<編號>/comments`, body 以 UTF-8 JSON 檔帶入、token 不 echo):以表格逐條列出結果(✅ 已解決 / 🚫 誤報已寫入 exclusions / ⏭️ 待人工處理 + 原因)。
1. **在議題留言回報進度**( Gitea API ` POST /repos/<owner>/<repo>/issues/<編號>/comments`, body 以 UTF-8 JSON 檔帶入、token 不 echo):以表格逐條列出結果(✅ 已解決 / 🚫 誤報已寫入 exclusions / ⏭️ 待人工處理 + 原因)。
2. **全部問題都已解決或已登記誤報**(無 ⏭️ 待人工處理)→ 關閉議題 :
2. **把「待人工處理」的問題寫回 findings**:若有任何 ⏭️ 待人工處理 的問題,將它們寫成一個**新的 wrapper 物件檔**到目錄 ` .gitea/ai-review/findings/ `(檔名用台北時間戳,如 ` 2026-07-20-14:30:15.json `),格式同本階段開頭的 findings wrapper,讓後續 review/ ` resolve ` 可追蹤 :
` ``json
{
"generatedAt": "<台北時間>",
"commitSha": "<目前 HEAD sha>",
"prNumber": null,
"tool": { "name": "code-review-resolve", "version": "<版本或工具預設>", "model": "<模型或工具預設>" },
"findings": [ { "id": "F001", "reviewer": "...", "severity": "嚴重|警告|建議", "file": "...", "startLine": 1, "endLine": 1, "problem": "...", "suggestion": "...", "suggestedCode": "" } ],
"excluded": []
}
` ``
- ` findings` 帶入所有待人工處理的問題(欄位沿用 B0 從議題留言解析出的 ` reviewer`/ ` severity`/ ` file`/ ` startLine`/ ` endLine`/ ` problem`/ ` suggestion`/ ` suggestedCode`,並補流水號 ` id`);` excluded` 固定為 ` []`。
- 無待人工處理時**不建立**此檔。
- 此新檔屬工作區變更,會在階段 C 一併分類提交(歸 ` chore`)。UTF-8(不含 BOM)、結尾保留一個換行。
3. **關閉議題(一律關閉)**:問題已全部分流為 ✅ 已修復 / 🚫 誤報寫入 exclusions / ⏭️ 待人工處理已寫回 findings 追蹤,因此收尾時關閉該議題:
` ``bash
` ``bash
curl -sS -X PATCH -H "Authorization: token ${GITEA_TOKEN}" \
curl -sS -X PATCH -H "Authorization: token ${GITEA_TOKEN}" \
@@ -283,7 +299,7 @@ source_branch="$(git rev-parse --abbrev-ref HEAD)"
--data '{"state":"closed"}'
--data '{"state":"closed"}'
` ``
` ``
3. **尚有待人工處理** → 只留言不關閉,於 留言標明待處理項與原因 。
關閉前先在步驟 1 的 留言中 標明各待人工處理項已寫回哪個 findings 檔與原因,確保關閉議題不會遺失待辦 。
4. 誤報仍寫入 ` exclusions.json`(同 B4),讓後續 review 沿用。
4. 誤報仍寫入 ` exclusions.json`(同 B4),讓後續 review 沿用。
---
---
@@ -499,7 +515,7 @@ curl -sS -X POST \
各階段執行後輸出:
各階段執行後輸出:
- **階段 A**: git fetch / pull 是否成功、當前分支是否存在於遠端(不存在時切到 develop/master 的結果)、若來源分支與目標分支同名是否已建立新工作分支、是否發生衝突、衝突是否已解決或仍需人工處理。
- **階段 A**: git fetch / pull 是否成功、當前分支是否存在於遠端(不存在時切到 develop/master 的結果)、若來源分支與目標分支同名是否已建立新工作分支、是否發生衝突、衝突是否已解決或仍需人工處理。
- **階段 B**:問題來源(findings 目錄或議題 ` #N `)、已解決 N 條(依等級分佈)、誤報寫入 exclusions M 條、待人工處理 K 條(列出原因)、來源 findings 檔保留/移除筆數與 ` exclusions.json` 新增筆數;議題模式另報已在議題留言、是否 關閉議題;若無待處理問題,說明已跳過階段 C 直接進入階段 D。
- **階段 B**:問題來源(findings 目錄或議題 ` #N `)、已解決 N 條(依等級分佈)、誤報寫入 exclusions M 條、待人工處理 K 條(列出原因)、來源 findings 檔保留/移除筆數與 ` exclusions.json` 新增筆數;議題模式另報已在議題留言、待人工處理問題寫回哪個 findings 檔、以及已 關閉議題;若無待處理問題,說明已跳過階段 C 直接進入階段 D。
- **階段 C**:建立了哪幾個 commit(type+訊息+檔數),或為何略過(` --no-commit` / 無變更)。
- **階段 C**:建立了哪幾個 commit(type+訊息+檔數),或為何略過(` --no-commit` / 無變更)。
- **階段 D**:push 成功與否、用了哪種方式(認證管理器/token/使用者指定),遠端分支名;若無 commit 可 push,說明已跳過 push 直接進入階段 E。
- **階段 D**:push 成功與否、用了哪種方式(認證管理器/token/使用者指定),遠端分支名;若無 commit 可 push,說明已跳過 push 直接進入階段 E。
- **階段 E**:PR 連結/編號、目標分支、描述形式;並提醒已(或請使用者)清除對話內文以防 token 外洩。
- **階段 E**:PR 連結/編號、目標分支、描述形式;並提醒已(或請使用者)清除對話內文以防 token 外洩。