diff --git a/skills/code-review-resolve/SKILL.md b/skills/code-review-resolve/SKILL.md index 4c64b1f..9d132bd 100644 --- a/skills/code-review-resolve/SKILL.md +++ b/skills/code-review-resolve/SKILL.md @@ -1,17 +1,17 @@ --- 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 ] [--target <目標分支>] [--pr-desc ] [--no-commit] [--no-pr] [--yes]" --- # 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 目標分支相同時才建立新工作分支 | -| 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 | | D. Push 當前分支 | 認證管理器 → 失敗改 token → 再失敗詢問使用者;**無 commit 可 push 則跳到階段 E** | | E. 發出 PR | 確定目標分支(不明必問)→ 選 PR 描述(完整/簡單/自訂)→ token 呼叫 Gitea API 建 PR → 通知並清除內文 | @@ -39,7 +39,7 @@ argument-hint: "[--issue <議題編號>] [--findings ] [--findings <路徑>] [--target <目標分支>] [--pr-desc ] [--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` 併用時,兩者的問題都納入處理。 - `--target <目標分支>`:PR 的目標分支。**省略時必須詢問使用者,不可猜測**;若需要避免把同名來源分支誤推到目標分支,可能會在階段 D 先詢問並於階段 E 沿用。 - `--pr-desc `: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 回報);議題標題/描述作為整體背景脈絡納入判斷。 4. 解析不到任何嚴重問題留言 → 回報並停止議題模式,不臆測。 -5. 議題模式下沒有 findings 檔可更新;解析出的問題直接進入 B2/B3,處理結果於 B5 回寫議題(留言+全解決時關閉),誤報仍寫入 `exclusions.json`。 +5. 議題模式下沒有現成 findings 檔可更新;解析出的問題直接進入 B2/B3,處理結果於 B5 回寫議題(留言+把待人工處理問題寫回 `findings/` 目錄後關閉議題),誤報仍寫入 `exclusions.json`。 ### B1. 讀取 findings 與 exclusions(檔案/目錄來源) @@ -274,7 +274,23 @@ source_branch="$(git rev-parse --abbrev-ref HEAD)" 議題模式所有問題處理完畢後: 1. **在議題留言回報進度**(Gitea API `POST /repos///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 curl -sS -X PATCH -H "Authorization: token ${GITEA_TOKEN}" \ @@ -283,7 +299,7 @@ source_branch="$(git rev-parse --abbrev-ref HEAD)" --data '{"state":"closed"}' ``` -3. **尚有待人工處理** → 只留言不關閉,於留言標明待處理項與原因。 + 關閉前先在步驟 1 的留言中標明各待人工處理項已寫回哪個 findings 檔與原因,確保關閉議題不會遺失待辦。 4. 誤報仍寫入 `exclusions.json`(同 B4),讓後續 review 沿用。 --- @@ -499,7 +515,7 @@ curl -sS -X POST \ 各階段執行後輸出: - **階段 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` / 無變更)。 - **階段 D**:push 成功與否、用了哪種方式(認證管理器/token/使用者指定),遠端分支名;若無 commit 可 push,說明已跳過 push 直接進入階段 E。 - **階段 E**:PR 連結/編號、目標分支、描述形式;並提醒已(或請使用者)清除對話內文以防 token 外洩。