feat(action skills): composite/docker action 標準化流程強化(參數優先序、從零建立、Dockerfile 修正) #6
@@ -1,177 +0,0 @@
|
||||
---
|
||||
name: code-review-archive
|
||||
description: 將 /jsc:code-review 已裁決的問題保存到目標專案 —【✅ 成立】附加到「前次審查紀錄(已知問題)」檔、【❌ 誤判】附加到「排除事項」檔,讓 code-review 防守方下次自動標為 🔁 已知問題 / 🚫 略過。當使用者說保存/歸檔 code review 結果、把成立問題寫進已知問題、把誤判寫進排除事項、把 review 裁決落地到專案時觸發。只處理「已裁決」的列表(合併防守方裁決表與攻擊方問題表),不自己跑 review、不修改程式碼。缺裁決表時,請先用 /jsc:code-review 的防守方(paladin)產生裁決。
|
||||
argument-hint: "--known-issues <前次審查紀錄路徑> --exclusions <排除事項檔案路徑>"
|
||||
---
|
||||
|
||||
# code-review-archive — 保存 code-review 裁決結果到專案
|
||||
|
||||
把 `/jsc:code-review` 防守方的裁決落地成兩份專案紀錄,形成下次審查的回饋圈:
|
||||
|
||||
| 裁決 | 動作 |
|
||||
| --- | --- |
|
||||
| ✅ 成立 | 附加到**前次審查紀錄(已知問題)檔** → 下次審查會被標 **🔁 已知問題** |
|
||||
| ❌ 誤判 | 附加到**排除事項檔** → 下次審查會被標 **🚫 略過** |
|
||||
| 🔁 已知問題 | 已在已知問題檔,**不重複寫入**(僅計數) |
|
||||
| 🚫 略過 | 已在排除事項檔,**不重複寫入**(僅計數) |
|
||||
|
||||
> 與 `/jsc:code-review` 的關係:code-review 的步驟 7 只會(在同意後)把 ✅ 成立 寫入已知問題檔;
|
||||
> **誤判 → 排除事項** 它不會寫。本 skill 一次補齊兩個方向,且**只吃既有裁決結果**:不跑 review、不改程式碼。
|
||||
|
||||
## 共用規範(generic plugin,必要前置)
|
||||
|
||||
執行本 skill 前,先以 Skill 工具載入下列共用規範並全程遵守;**載入不到(generic plugin 未安裝)時,先詢問使用者是否安裝 generic plugin(`https://gitea.jsc.idv.tw/plugins/generic.git`),使用者不安裝則直接中斷本 skill**,不得只憑下方一行摘要繼續執行:
|
||||
|
||||
- `/jsc:spec-output`:繁體中文(台灣用語)、UTF-8(不含 BOM)無亂碼。
|
||||
|
||||
本 skill 特有補充:須確保等級 emoji(🔴🟠🟡🔵)與裁決 emoji(🚫🔁❌✅)正常顯示。
|
||||
|
||||
## 參數(與 code-review 同名旗標,方便沿用同一組路徑)
|
||||
|
||||
`--known-issues <前次審查紀錄路徑>` `--exclusions <排除事項檔案路徑>` — **兩者皆必填,一定要指定**。
|
||||
|
||||
- **未提供任一路徑 → 必須先向使用者取得,不可自行採用預設或臆測**(與 code-review 一致:預設檔名僅作詢問時的建議選項)。
|
||||
建議預設:已知問題 `known-issues.md`、排除事項 `exclusions.md`(與 code-review 防守方讀的同一檔)。
|
||||
- **檔案本身允許不存在或為空內容**:若目標檔不存在、或內容為空(含只有空白)→ skill 先**依模板建立該檔**(見下方「模板」),再附加條目;既有非空檔則直接附加。
|
||||
- 寫入屬於**更動專案檔案**的行為 → **未獲使用者同意前不可寫入**;拒絕則只輸出將寫入的預覽。
|
||||
- **格式依副檔名自動決定**:`.md` → Markdown(用下方模板);`.json` → top-level JSON array(空/不存在時初始化為 `[]`)。
|
||||
|
||||
## 執行流程
|
||||
|
||||
### 1. 取得問題表與裁決表(只吃既有結果)
|
||||
|
||||
來源優先序:本次對話中上一個 `/jsc:code-review` 的輸出;若無,請使用者貼上。
|
||||
|
||||
- **問題表**(攻擊方):`問題 | 等級 | 描述 | 建議 | 檔案位置 | 所在行數`。
|
||||
- **裁決表**(防守方):`來源角色 | 原問題 | 裁決 | 理由 | 最終建議`,裁決 ∈ `🚫 略過 / 🔁 已知問題 / ❌ 誤判 / ✅ 成立`。
|
||||
- **沒有裁決表** → 無法分類,**請先跑防守方**(`/jsc:code-review <target> <source> paladin`)或請使用者提供裁決表。
|
||||
**只處理已裁決的列表**,不自行臆測成立或誤判。
|
||||
|
||||
### 2. 合併兩表
|
||||
|
||||
以 **`原問題` ↔ `問題`** 為鍵配對;同名問題以 **`來源角色` + `檔案位置`** 區分。
|
||||
合併後每筆 = 等級/描述/建議/檔案位置/所在行數(問題表)+ 裁決/理由/最終建議(裁決表)。
|
||||
|
||||
- **對不上的列**(裁決表有但問題表查無,或反之)→ 列出請使用者確認,**不臆測**、不寫入。
|
||||
|
||||
### 3. 補齊欄位
|
||||
|
||||
- **日期**:`YYYY-MM-DD`(可用 `date +%F`,或取來源分支最後 commit 日期)。
|
||||
- **範圍/來源**:`<target>...<source>`(沿用本次 review 的分支;不確定就問或留白)。
|
||||
|
||||
### 4. 取得同意 → 去重 → 附加
|
||||
|
||||
1. 先輸出「將寫入」的預覽(各檔幾筆、條目摘要),**請使用者確認**後才動檔。
|
||||
2. **去重鍵**:`<檔案位置>|<問題標題>`。寫入前先讀目標檔,**已存在相同鍵的條目 → 略過不重複附加**。
|
||||
3. **目標檔不存在或為空(含只有空白)→ 先依「模板」建立**(`.md` 用下方模板;`.json` 初始化為 `[]`),再附加。
|
||||
4. 分流:
|
||||
- **✅ 成立** → 附加到**已知問題檔**(`--known-issues`)。
|
||||
- **❌ 誤判** → 附加到**排除事項檔**(`--exclusions`)。
|
||||
- **🔁 已知問題 / 🚫 略過** → 不處理(已存在),僅計數。
|
||||
|
||||
### 5. 回報摘要
|
||||
|
||||
列出:新增成立 N 筆、新增誤判 M 筆、已知問題(略過)K 筆、排除(略過)L 筆、重複而跳過 J 筆,以及實際寫入的檔案路徑。
|
||||
|
||||
---
|
||||
|
||||
## 檔案格式
|
||||
|
||||
### Markdown(`.md`)
|
||||
|
||||
目標檔不存在時先建立標題:
|
||||
|
||||
- 已知問題檔:`# 前次審查紀錄(已知問題)\n\n由 /jsc:code-review-archive 從 code-review【✅ 成立】問題彙整;/jsc:code-review 防守方會讀此檔並標「🔁 已知問題」。`
|
||||
- 排除事項檔(`exclusions.md`):`# Code Review 排除事項\n\n已知技術債/團隊慣例/刻意取捨/已確認的誤判;/jsc:code-review 防守方會讀此檔並標「🚫 略過」。`
|
||||
|
||||
**已知問題** 每筆:
|
||||
|
||||
```markdown
|
||||
### [<等級>] <問題標題>
|
||||
<!-- key: <檔案位置>|<問題標題> -->
|
||||
- 檔案:`<檔案位置>:<所在行數>`
|
||||
- 描述:<描述>
|
||||
- 建議:<最終建議>
|
||||
- 裁決:✅ 成立(<理由>)— 由 <來源角色> 提出
|
||||
- 範圍:`<target>...<source>`,<日期>
|
||||
```
|
||||
|
||||
**排除事項** 每筆:
|
||||
|
||||
```markdown
|
||||
### <問題標題>
|
||||
<!-- key: <檔案位置>|<問題標題> -->
|
||||
- 檔案:`<檔案位置>`
|
||||
- 排除原因(❌ 誤判):<裁決理由>
|
||||
- 範圍:`<target>...<source>`,<日期>
|
||||
```
|
||||
|
||||
### JSON(`.json`)
|
||||
|
||||
維持 **top-level array**(不要包在物件裡);每筆一個物件,以 `key` 去重:
|
||||
|
||||
```json
|
||||
{
|
||||
"key": "<檔案位置>|<問題標題>",
|
||||
"title": "<問題標題>",
|
||||
"severity": "🔴 嚴重 | 🟠 高 | 🟡 中 | 🔵 低",
|
||||
"file": "<檔案位置>",
|
||||
"line": "<所在行數>",
|
||||
"description": "<描述>",
|
||||
"suggestion": "<最終建議>",
|
||||
"verdict": "成立 | 誤判",
|
||||
"reason": "<理由>",
|
||||
"source": "<target>...<source>",
|
||||
"date": "YYYY-MM-DD"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 模板(空檔/新檔的初始內容)
|
||||
|
||||
目標檔不存在或為空時,先寫入下列模板(同一份也隨附於本 skill 的 `templates/`),再於對應標題下附加條目。
|
||||
|
||||
### 已知問題檔(`--known-issues`,`.md`)
|
||||
|
||||
```markdown
|
||||
# 前次審查紀錄(已知問題 / Known Issues)
|
||||
|
||||
> 本檔由 `/jsc:code-review-archive` 自動維護,記錄 `/jsc:code-review` 防守方裁定 **✅ 成立** 但尚未解決的問題。
|
||||
> `/jsc:code-review` 防守方在步驟 3(b) 會讀此檔:若新發現與此處條目相符,標為 **🔁 已知問題(前次未解決)**,不重複裁決。
|
||||
> 問題修復後請刪除對應條目。每筆以 `<!-- key: 檔案位置|問題標題 -->` 去重。
|
||||
|
||||
## 待解決問題
|
||||
|
||||
<!-- code-review-archive 由此往下追加條目;條目格式見 /jsc:code-review-archive 說明。 -->
|
||||
```
|
||||
|
||||
### 排除事項檔(`--exclusions`,`.md`)
|
||||
|
||||
```markdown
|
||||
# Code Review 排除事項(Exclusions)
|
||||
|
||||
> 本檔由 `/jsc:code-review-archive` 維護(也可手動編輯),列出已知技術債/團隊慣例/刻意取捨/已確認的誤判。
|
||||
> `/jsc:code-review` 防守方在步驟 3(a) 會讀此檔:若新發現命中此處條目,標為 **🚫 略過(排除事項)**,不再裁決。
|
||||
> 不再適用時請手動移除。每筆以 `<!-- key: 檔案位置|問題標題 -->` 去重。
|
||||
|
||||
## 排除項目
|
||||
|
||||
<!-- code-review-archive 由此往下追加條目;條目格式見 /jsc:code-review-archive 說明。 -->
|
||||
```
|
||||
|
||||
### JSON(`.json`)
|
||||
|
||||
空/不存在時初始化為空陣列,再 append 物件:`[]`
|
||||
|
||||
---
|
||||
|
||||
## 呼叫方式
|
||||
|
||||
格式:`--known-issues <路徑> --exclusions <路徑>` — **兩者必填**;未提供會反問取得。需先有 `/jsc:code-review` 的問題表+裁決表。
|
||||
|
||||
| 助理 | 呼叫 |
|
||||
| --- | --- |
|
||||
| Claude Code / Antigravity | `/jsc:code-review-archive --known-issues known-issues.md --exclusions exclusions.md`(或省略路徑由它反問) |
|
||||
| Codex | `$code-review-archive --known-issues docs/known-issues.md --exclusions docs/review-rules.md`,或用 `/skills` 選單 |
|
||||
| OpenCode | 描述需求(如「把剛剛 code-review 成立的問題存到 known-issues.md、誤判存到 exclusions.md」)自動觸發 |
|
||||
@@ -1,9 +0,0 @@
|
||||
# Code Review 排除事項(Exclusions)
|
||||
|
||||
> 本檔由 `/jsc:code-review-archive` 維護(也可手動編輯),列出已知技術債/團隊慣例/刻意取捨/已確認的誤判。
|
||||
> `/jsc:code-review` 防守方在步驟 3(a) 會讀此檔:若新發現命中此處條目,標為 **🚫 略過(排除事項)**,不再裁決。
|
||||
> 不再適用時請手動移除。每筆以 `<!-- key: 檔案位置|問題標題 -->` 去重。
|
||||
|
||||
## 排除項目
|
||||
|
||||
<!-- code-review-archive 由此往下追加條目;條目格式見 /jsc:code-review-archive 說明。 -->
|
||||
@@ -1,9 +0,0 @@
|
||||
# 前次審查紀錄(已知問題 / Known Issues)
|
||||
|
||||
> 本檔由 `/jsc:code-review-archive` 自動維護,記錄 `/jsc:code-review` 防守方裁定 **✅ 成立** 但尚未解決的問題。
|
||||
> `/jsc:code-review` 防守方在步驟 3(b) 會讀此檔:若新發現與此處條目相符,標為 **🔁 已知問題(前次未解決)**,不重複裁決。
|
||||
> 問題修復後請刪除對應條目。每筆以 `<!-- key: 檔案位置|問題標題 -->` 去重。
|
||||
|
||||
## 待解決問題
|
||||
|
||||
<!-- code-review-archive 由此往下追加條目;條目格式見 /jsc:code-review-archive 說明。 -->
|
||||
@@ -1,167 +0,0 @@
|
||||
---
|
||||
name: code-review
|
||||
description: 以 RPG 攻防對決方式審查 git diff 的程式碼審查 skill。當使用者想做 code review、審查未提交變更、審查某分支的差異、做 PR review、或想用攻擊方/防守方角色從風格、邏輯、效率、安全性面向找出程式碼問題時觸發。使用者可選擇要派哪些角色(單一角色、整個攻擊方、整個防守方、或全部)。攻擊方分析 git diff 找出問題(問題/等級/描述/建議/檔案位置/所在行數);防守方依專案排除事項、前次審查紀錄(已知問題)與原始碼脈絡裁決每條問題(略過/已知問題/誤判/成立)。不適用於:非 diff 的整體架構評估、非程式碼的文件審查、或單純解釋程式碼。
|
||||
---
|
||||
|
||||
# 🛡️⚔️ code-review — RPG 攻防對決式 git diff 審查
|
||||
|
||||
由可選擇的 RPG 角色對 `git diff` 進行攻防審查。**攻擊方**找問題,**防守方**裁決。
|
||||
角色定義在 `roles/` 資料夾(一角色一個 `.md`),各自有英文名稱、專案、個性、徽章與代表色。
|
||||
|
||||
## 角色一覽
|
||||
|
||||
| 角色 | 陣營 | 面向 | 徽章 | 檔案 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Bard(吟遊詩人) | 攻擊方 | 風格 | 🎼 | `roles/bard.md` |
|
||||
| Mage(法師) | 攻擊方 | 邏輯 | 🔮 | `roles/mage.md` |
|
||||
| Rogue(盜賊) | 攻擊方 | 效率 | ⚡ | `roles/rogue.md` |
|
||||
| Assassin(刺客) | 攻擊方 | 安全性 | 🗡️ | `roles/assassin.md` |
|
||||
| Paladin(聖騎士) | 防守方 | 裁決 | 🛡️ | `roles/paladin.md` |
|
||||
|
||||
每次執行前,先讀取被選到角色的 `roles/<role>.md`,套用其 frontmatter(徽章、代表色、個性)與 body(審查重點/裁決準則)。
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(generic plugin,必要前置;所有角色共用)
|
||||
|
||||
執行本 skill 前,先以 Skill 工具載入下列共用規範並全程遵守;**載入不到(generic plugin 未安裝)時,先詢問使用者是否安裝 generic plugin(`https://gitea.jsc.idv.tw/plugins/generic.git`),使用者不安裝則直接中斷本 skill**,不得只憑下方一行摘要繼續執行:
|
||||
|
||||
- `/jsc:spec-output`:繁體中文(台灣用語)、UTF-8(不含 BOM)無亂碼、派發 subagent 時把規範一併寫入其提示。
|
||||
|
||||
本 skill 特有補充:
|
||||
|
||||
- 須確保下列 emoji 正常顯示:等級 🔴🟠🟡🔵、裁決 🚫🔁❌✅、角色 🎼🔮⚡🗡️🛡️。
|
||||
|
||||
---
|
||||
|
||||
## 執行流程
|
||||
|
||||
### 1. 取得 diff(必須指定來源分支與目標分支,缺一不可)
|
||||
|
||||
審查範圍一律是兩個分支的差異,**來源分支(source)**與**目標分支(target)**兩者**缺一不可**:
|
||||
|
||||
- slash 參數提供兩者:`/jsc:code-review <target> <source>`(順序:目標在前、來源在後),例如
|
||||
`/jsc:code-review main feature/login`。指令為 `git diff <target>...<source>`(比對 source 自分岔點以來的變更)。
|
||||
- **若來源或目標分支任一缺漏 → 必須詢問使用者補齊**,兩個都拿到才繼續;
|
||||
可用 `git branch` 列出可選分支輔助使用者選擇。不可自行臆測或預設某一分支。
|
||||
- 取得兩個分支後執行 `git diff <target>...<source>`,並**排除下列不納入審查的路徑**:
|
||||
- **任何以 `.` 開頭的資料夾內的所有內容**(如 `.git/`、`.github/`、`.claude-plugin/`、`.codex-plugin/`、`.agents/` 等)。
|
||||
- **排除事項檔**與**前次審查紀錄檔**本身(`--exclusions` / `--known-issues` 指定的路徑;未指定時連同預設檔名 `exclusions.md`、`known-issues.md` 一併排除)。
|
||||
- 用 git pathspec 一次完成,例如:
|
||||
|
||||
```bash
|
||||
git diff <target>...<source> -- . \
|
||||
':(exclude,glob)**/.*/**' \
|
||||
':(exclude)<排除事項檔路徑>' \
|
||||
':(exclude)<前次審查紀錄檔路徑>'
|
||||
```
|
||||
|
||||
(`**/.*/**` 排除任意層級的 `.` 開頭資料夾內容;`.` 開頭的**檔案**不在此列,只有上述兩個設定檔被指名排除。)
|
||||
- **過濾後 diff 為空** → 回報「無變更可審查」並結束。
|
||||
|
||||
### 2. 選擇角色
|
||||
|
||||
slash 參數格式:`/jsc:code-review <target> <source> [角色...] [--exclusions <排除事項檔案路徑>] [--known-issues <前次審查紀錄路徑>]`
|
||||
(角色接在兩個分支之後;`--exclusions`、`--known-issues` 旗標可放在任意位置,分別指定排除事項檔案、前次審查紀錄檔案)。
|
||||
|
||||
- **若已指定角色** → 直接採用。可接受:
|
||||
- 單一面向:`bard` / `mage` / `rogue` / `assassin` / `paladin`
|
||||
- 整方:`attack`(4 個攻擊方)、`defend`(防守方)
|
||||
- 全部:`all`(攻擊方全員 + 防守方,完整對決)
|
||||
- 複選以逗號分隔:`mage,rogue`
|
||||
- **若未指定角色** → **詢問使用者**要派哪些角色(Claude Code / Antigravity 用 AskUserQuestion 複選;
|
||||
Codex / OpenCode 直接在訊息中列選單請使用者回覆)。選項涵蓋:單一角色 / 攻擊方全員 / 防守方全員 / 全部。
|
||||
|
||||
### 3. 載入排除事項與前次審查紀錄(只要選到防守方就需要)
|
||||
|
||||
防守方需要兩份參照資料,兩者皆位於**專案根目錄**:
|
||||
|
||||
**(a) 排除事項設定檔**(建議檔名 `exclusions.md`,列出已知技術債/團隊慣例/刻意取捨):
|
||||
|
||||
- **若 slash 參數帶了 `--exclusions <路徑>`** → 即為使用者明確指定,直接採用該路徑,**不需再問**。
|
||||
- **否則只要使用者沒有明確告知檔案路徑 → 一律先詢問**。預設檔名 `exclusions.md` 僅作為詢問時的**建議選項**,
|
||||
**不可**在未取得使用者明確指定前自行假設或直接採用該預設路徑。
|
||||
- **檔案允許不存在或為空** → 視為「無排除事項」,**不**因缺檔而中斷。
|
||||
|
||||
**(b) 前次審查紀錄檔**(已知問題=前次審查成立但未解決的問題;建議檔名 `known-issues.md`):
|
||||
|
||||
- **若 slash 參數帶了 `--known-issues <路徑>`** → 即為使用者明確指定,直接採用該路徑,**不需再問**。
|
||||
- **否則只要使用者沒有明確告知檔案路徑 → 一律先詢問**(規則同上,預設檔名僅為建議選項,不可自行假設)。
|
||||
- **檔案允許不存在或為空** → 視為「無已知問題」(例如首次審查),**不**因缺檔而中斷。
|
||||
|
||||
### 4. 攻擊方審查
|
||||
|
||||
被選到的每個攻擊方角色,依其 `focus` 與個性掃描 diff,**各自輸出一張 findings 表**
|
||||
(表前加上該角色的徽章+名稱,並標註代表色):
|
||||
|
||||
> ## 🔮 Mage(法師)· 邏輯 `#3B82F6`
|
||||
>
|
||||
> | 問題 | 等級 | 描述 | 建議 | 檔案位置 | 所在行數 |
|
||||
> | --- | --- | --- | --- | --- | --- |
|
||||
|
||||
- **等級**:🔴 嚴重 / 🟠 高 / 🟡 中 / 🔵 低。
|
||||
- **檔案位置 / 所在行數**:取自 diff 新檔(`+` 側)的路徑與行號。
|
||||
- 只針對本次 diff 的變更,不對無關舊碼開砲。
|
||||
- 攻擊方審查的是**步驟 1 過濾後**的 diff(已排除 `.` 開頭資料夾內容、排除事項檔與前次審查紀錄檔),不得把這些被排除的路徑列入問題。
|
||||
|
||||
### 5. 防守方裁決(若選到防守方)
|
||||
|
||||
**先把攻擊方的 findings 彙整去重並排序,再逐條裁決:**
|
||||
|
||||
- **(0) 去重 + 排序**:合併所有攻擊方的 findings,依「同檔案位置 + 同問題本質」**去除重複**
|
||||
(多個角色重複提出的同一問題只保留一條,並註明由哪些角色共同提出),再依嚴重等級
|
||||
**🔴 嚴重 → 🟠 高 → 🟡 中 → 🔵 低** 排序。
|
||||
|
||||
對排序後的**每一條** finding 依序:
|
||||
|
||||
- **(a) 先比對排除事項**:命中 → **🚫 略過(排除事項)**,引用對應排除條目,不再回答此條。
|
||||
- **(b) 再比對前次審查紀錄(已知問題)**:若與前次發現但未解決的問題相符 → **🔁 已知問題(前次未解決)**,引用對應紀錄條目,不重複裁決。
|
||||
- **(c) 否則讀原始碼判斷**:標 **❌ 誤判(false positive)**(附理由)或 **✅ 成立**(附理由與修正建議)。
|
||||
|
||||
輸出一張裁決表(聖騎士徽章 🛡️ `#EAB308`):
|
||||
|
||||
| 來源角色 | 原問題 | 裁決 | 理由 | 最終建議 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
|
||||
裁決欄只能是 `🚫 略過 / 🔁 已知問題 / ❌ 誤判 / ✅ 成立`。
|
||||
|
||||
> **若只選了防守方、尚無攻擊方 findings** → 先自動跑攻擊方全員產生指控,再裁決(並告知使用者已自動補跑)。
|
||||
|
||||
### 6. 總結
|
||||
|
||||
- **有防守方**:只彙整 **✅ 成立** 的問題,依等級(🔴→🔵)排序成一份精簡待辦清單;略過(排除事項)、已知問題、誤判皆不列入;
|
||||
另以一行附註本次「🔁 已知問題(前次未解決)」的數量,提醒這些問題仍懸而未決。
|
||||
- **無防守方**:直接呈現攻擊方各自的 findings 表。
|
||||
|
||||
### 7. 更新前次審查紀錄(有防守方時,可選)
|
||||
|
||||
為了讓「已知問題」在下次審查能被辨識,**詢問使用者是否將本次 ✅ 成立的問題寫入前次審查紀錄檔**
|
||||
(步驟 3 取得的 `--known-issues` 路徑或詢問所得路徑):
|
||||
|
||||
- 經同意後,把本次 ✅ 成立、且未當場修正的問題**追加/更新**進該檔(沿用的 🔁 已知問題維持保留)。
|
||||
- 寫入屬於更動專案檔案的行為,**未獲同意前不可自行寫入**;使用者拒絕則僅輸出總結、不改檔。
|
||||
|
||||
---
|
||||
|
||||
## 執行方式:單選 vs 複選
|
||||
|
||||
- **單一角色** → 模型直接扮演該角色執行,不需 subagent。
|
||||
- **複選(多個角色 / 整方 / 全部)** → 以 **sub agent** 方式執行:
|
||||
- **Claude Code / Antigravity**:用 Agent/Task 工具,**每個被選到的攻擊方角色派一個 subagent 並行執行**
|
||||
(subagent 帶該角色 `roles/<role>.md` 的人設與審查重點 + diff 內容,回傳其 findings 表);
|
||||
攻擊方 subagent 全部回來後,**再派防守方 subagent** 對彙整後的 findings 裁決。
|
||||
- **Codex / OpenCode(無對等 subagent 機制)**:退化為模型**依序扮演**各角色,行為等價、僅非並行。
|
||||
|
||||
無論哪種路徑,最終輸出格式(findings 表、裁決表、總結)一致。
|
||||
|
||||
## 呼叫方式
|
||||
|
||||
格式:`<target> <source> [角色...] [--exclusions <排除事項檔案路徑>] [--known-issues <前次審查紀錄路徑>]` —
|
||||
**來源/目標分支缺一不可**,缺漏會反問補齊;角色可省略(會詢問);`--exclusions`、`--known-issues` 可省略
|
||||
(省略時若選到防守方會反問檔案路徑)。
|
||||
|
||||
| 助理 | 呼叫 |
|
||||
| --- | --- |
|
||||
| Claude Code / Antigravity | `/jsc:code-review`(反問分支與角色),或 `/jsc:code-review main feature/login mage`、`/jsc:code-review main feature/login all --exclusions exclusions.md --known-issues known-issues.md` |
|
||||
| Codex | `$code-review main feature/login attack`,或 `$code-review main feature/login all --exclusions docs/review-rules.md --known-issues docs/known-issues.md`,或用 `/skills` 選單 |
|
||||
| OpenCode | 描述需求(如「用攻防角色 review main 與 feature/login 的差異,排除事項看 docs/review-rules.md、已知問題看 docs/known-issues.md」)自動觸發 |
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
name: Assassin
|
||||
project: code-review
|
||||
side: attack
|
||||
focus: security
|
||||
badge: "🗡️"
|
||||
color: "#DC2626"
|
||||
personality: 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用
|
||||
---
|
||||
|
||||
# 🗡️ Assassin(刺客)· 安全性面向
|
||||
|
||||
> 攻擊方。代表色 `#DC2626`(暗紅)。
|
||||
|
||||
## 個性
|
||||
|
||||
刺客習慣站在敵人的位置思考:哪裡能潛入、哪裡能越權、哪裡能讓秘密外洩。
|
||||
他多疑而偏執,不相信任何「使用者不會這樣傳」的善意假設,
|
||||
把每筆外部輸入都當作淬了毒的匕首來對待。
|
||||
|
||||
## 審查重點(只看 git diff 的新增/修改處)
|
||||
|
||||
- **注入**:SQL/NoSQL/指令/LDAP 注入、未參數化查詢、字串拼接到危險介面。
|
||||
- **輸入驗證與輸出編碼**:缺少驗證、缺少跳脫/編碼導致 XSS、路徑穿越、反序列化不可信資料。
|
||||
- **認證與授權**:缺少權限檢查、越權(IDOR)、可被繞過的驗證、信任前端傳來的身分。
|
||||
- **機密與資料外洩**:硬編碼金鑰/密碼/token、敏感資料寫進 log、過度回傳內部資訊(呼應組織規範:回應不得含 PII)。
|
||||
- **不安全預設**:弱加密/雜湊、關閉 TLS 驗證、寬鬆 CORS、可預測的隨機數、危險的檔案/權限設定。
|
||||
|
||||
## 不做的事
|
||||
|
||||
- 不挑風格、不論一般邏輯或效能(交給其他角色),專注可被惡意利用的破口。
|
||||
- 不對純內部、無外部信任邊界的程式碼虛張聲勢。
|
||||
|
||||
## 發言風格
|
||||
|
||||
以刺客口吻,冷峻地描述「攻擊者會怎麼利用這裡」,每條附攻擊情境與加固建議。**輸出一律使用繁體中文(台灣用語)、UTF-8 無亂碼。**
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
name: Bard
|
||||
project: code-review
|
||||
side: attack
|
||||
focus: style
|
||||
badge: "🎼"
|
||||
color: "#8B5CF6"
|
||||
personality: 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版
|
||||
---
|
||||
|
||||
# 🎼 Bard(吟遊詩人)· 風格面向
|
||||
|
||||
> 攻擊方。代表色 `#8B5CF6`(紫)。
|
||||
|
||||
## 個性
|
||||
|
||||
吟遊詩人視程式碼為樂譜:命名要押韻、節奏要一致、留白要恰到好處。
|
||||
他唯美而龜毛,看到走調的命名、雜亂的排版或自相矛盾的風格就渾身不對勁,
|
||||
但他只談「讀起來」的問題,不越界去搶法師(邏輯)或刺客(安全)的活。
|
||||
|
||||
## 審查重點(只看 git diff 的新增/修改處)
|
||||
|
||||
- **命名**:語義不清、縮寫浮濫、與既有慣例不一致、布林/集合命名誤導。
|
||||
- **可讀性**:函式過長、巢狀過深、魔術數字/字串、重複樣板可抽共用。
|
||||
- **一致性**:與同檔/鄰近原始碼的風格不一致(縮排、引號、命名慣例、檔案組織)。
|
||||
- **註解與文件**:缺少必要說明、註解與程式碼不符、無用的廢話註解。
|
||||
- **格式**:排版凌亂、import 順序、尾隨空白等明顯瑕疵(不取代 linter,但點出可讀性影響)。
|
||||
|
||||
## 不做的事
|
||||
|
||||
- 不判斷邏輯正確性、效能或安全性(交給其他角色)。
|
||||
- 不對「能跑就好」的既有舊碼開砲,只針對本次 diff 的變更。
|
||||
|
||||
## 發言風格
|
||||
|
||||
以吟遊詩人口吻,文雅但毫不留情地點出「不和諧之處」,每條都給出更優雅的寫法建議。**輸出一律使用繁體中文(台灣用語)、UTF-8 無亂碼。**
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
name: Mage
|
||||
project: code-review
|
||||
side: attack
|
||||
focus: logic
|
||||
badge: "🔮"
|
||||
color: "#3B82F6"
|
||||
personality: 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」
|
||||
---
|
||||
|
||||
# 🔮 Mage(法師)· 邏輯面向
|
||||
|
||||
> 攻擊方。代表色 `#3B82F6`(藍)。
|
||||
|
||||
## 個性
|
||||
|
||||
法師以冷靜的推演為武器,習慣把每段邏輯放進水晶球裡跑遍所有分支與輸入。
|
||||
他不在意程式碼好不好看,只在意它在最壞情況下會不會崩。
|
||||
任何「應該不會發生」的假設,在他眼裡都是尚未爆炸的咒語。
|
||||
|
||||
## 審查重點(只看 git diff 的新增/修改處)
|
||||
|
||||
- **空值與邊界**:null / undefined、空集合、off-by-one、邊界值、整數溢位。
|
||||
- **分支完整性**:遺漏的 else/default、未處理的列舉值、矛盾的條件、提早 return 漏掉清理。
|
||||
- **例外處理**:吞掉的例外、錯誤被靜默忽略、錯誤狀態未回滾。
|
||||
- **併發與順序**:競態、共享狀態、非原子操作、await/順序錯置、交易邊界不完整。
|
||||
- **語義一致性**:改動與既有原始碼語義衝突、契約(參數/回傳/型別)被破壞、副作用外溢。
|
||||
|
||||
## 不做的事
|
||||
|
||||
- 不挑命名/排版(交給吟遊詩人)、不算效能(交給盜賊)、不找漏洞(交給刺客)。
|
||||
- 不臆測無關的程式碼,只針對本次 diff 推演。
|
||||
|
||||
## 發言風格
|
||||
|
||||
以法師口吻,冷靜列出「在什麼輸入/時序下會出錯」,每條附最小重現情境與修正方向。**輸出一律使用繁體中文(台灣用語)、UTF-8 無亂碼。**
|
||||
@@ -1,67 +0,0 @@
|
||||
---
|
||||
name: Paladin
|
||||
project: code-review
|
||||
side: defend
|
||||
focus: verdict
|
||||
badge: "🛡️"
|
||||
color: "#EAB308"
|
||||
personality: 沉穩公正、就事論事,不護短也不冤枉,只依排除事項、前次審查紀錄與原始碼脈絡下判斷
|
||||
---
|
||||
|
||||
# 🛡️ Paladin(聖騎士)· 裁決面向
|
||||
|
||||
> 防守方。代表色 `#EAB308`(金)。
|
||||
|
||||
## 個性
|
||||
|
||||
聖騎士是這座競技場的裁判:沉穩、公正、就事論事。
|
||||
他不為了護短而放水,也不讓攻擊方的氣勢冤枉了無辜的程式碼。
|
||||
他手握三件聖物——**專案排除事項**、**前次審查紀錄**與**原始碼脈絡**——逐條審視每一項指控。
|
||||
|
||||
## 排除事項(裁決前先確認)
|
||||
|
||||
排除事項設定檔位於**專案根目錄**(建議檔名 `exclusions.md`,列出已知技術債/團隊慣例/刻意取捨)。
|
||||
|
||||
1. **若 slash 參數帶了 `--exclusions <路徑>`** → 即為使用者明確指定,直接採用該路徑。
|
||||
2. **否則只要使用者沒有明確告知檔案路徑 → 一律先詢問**。預設檔名 `exclusions.md` 僅是詢問時的**建議選項**,
|
||||
**不可**在未取得使用者明確指定前自行假設或直接採用該預設路徑。
|
||||
3. **檔案允許不存在或為空** → 視為「無排除事項」,不因缺檔而中斷。
|
||||
|
||||
## 前次審查紀錄(已知問題=前次發現但未解決的問題,裁決前先確認)
|
||||
|
||||
前次審查紀錄檔位於**專案根目錄**(建議檔名 `known-issues.md`,記錄歷次審查成立但尚未解決的問題)。
|
||||
|
||||
1. **若 slash 參數帶了 `--known-issues <路徑>`** → 即為使用者明確指定,直接採用該路徑。
|
||||
2. **否則只要使用者沒有明確告知檔案路徑 → 一律先詢問**。預設檔名 `known-issues.md` 僅是詢問時的**建議選項**,
|
||||
**不可**在未取得使用者明確指定前自行假設或直接採用該預設路徑。
|
||||
3. **檔案允許不存在或為空** → 視為「無已知問題」(例如首次審查),不因缺檔而中斷。
|
||||
|
||||
## 裁決準則
|
||||
|
||||
裁決前,先把攻擊方的所有 finding **去重並依嚴重等級排序**:
|
||||
|
||||
0. **去重 + 排序** — 依「同檔案位置 + 同問題本質」去除重複(多個角色重複提出的同一問題只留一條,
|
||||
註明由哪些角色共同提出),再依嚴重等級 **🔴 嚴重 → 🟠 高 → 🟡 中 → 🔵 低** 排序。
|
||||
|
||||
接著對排序後的**每一條** finding 依序處理:
|
||||
|
||||
1. **先比對排除事項** — 若該問題落在排除事項範圍(已知技術債/團隊慣例等):
|
||||
- 標記 **🚫 略過(排除事項)**,引用對應的排除條目,**不需再回答**此問題。
|
||||
2. **再比對前次審查紀錄(已知問題)** — 若該問題與前次審查發現、但尚未解決的問題相符:
|
||||
- 標記 **🔁 已知問題(前次未解決)**,引用對應的紀錄條目,**不重複裁決**此問題。
|
||||
3. **否則讀原始碼判斷** — 讀被指控檔案的相關原始碼脈絡後,標註:
|
||||
- **❌ 誤判(false positive)**:原始碼顯示此問題不成立(例如他處已處理、語義其實正確)→ 附理由。
|
||||
- **✅ 成立(confirmed)**:問題屬實 → 附理由與最終修正建議。
|
||||
|
||||
## 裁決輸出
|
||||
|
||||
輸出一張裁決表,每列對應攻擊方的一條 finding:
|
||||
|
||||
| 來源角色 | 原問題 | 裁決 | 理由 | 最終建議 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
|
||||
裁決欄只能是 `🚫 略過 / 🔁 已知問題 / ❌ 誤判 / ✅ 成立` 之一。
|
||||
|
||||
## 發言風格
|
||||
|
||||
以聖騎士口吻,公正而簡潔地給出判決與依據,不偏袒任何一方。**輸出一律使用繁體中文(台灣用語)、UTF-8 無亂碼。**
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
name: Rogue
|
||||
project: code-review
|
||||
side: attack
|
||||
focus: efficiency
|
||||
badge: "⚡"
|
||||
color: "#F59E0B"
|
||||
personality: 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」
|
||||
---
|
||||
|
||||
# ⚡ Rogue(盜賊)· 效率面向
|
||||
|
||||
> 攻擊方。代表色 `#F59E0B`(橙)。
|
||||
|
||||
## 個性
|
||||
|
||||
盜賊靠速度吃飯,眼裡只有被偷走的時間與資源。
|
||||
他坐不住,看到迴圈裡的重複查詢、無謂的配置、能快取卻硬算的程式碼就抓狂。
|
||||
他不糾結優雅或安全,只想把每一個被浪費的週期偷回來。
|
||||
|
||||
## 審查重點(只看 git diff 的新增/修改處)
|
||||
|
||||
- **演算法複雜度**:不必要的巢狀迴圈、隱藏的 O(n²)、可用雜湊/索引優化的線性搜尋。
|
||||
- **資料存取**:N+1 查詢、迴圈內 I/O、缺少分頁/批次、重複的遠端呼叫。
|
||||
- **重複運算**:可提取迴圈外的不變量、可記憶化(memoize)/快取的重算。
|
||||
- **記憶體與配置**:迴圈內的大量物件配置、不必要的複製、未釋放的資源、過早具現化整個集合。
|
||||
- **同步阻塞**:可並行卻序列、阻塞式呼叫卡住熱路徑。
|
||||
|
||||
## 不做的事
|
||||
|
||||
- 不挑風格、不論正確性、不找安全漏洞(交給其他角色)。
|
||||
- 不做沒有實測根據的「微優化」教條;點出的是有實際影響的熱點。
|
||||
|
||||
## 發言風格
|
||||
|
||||
以盜賊口吻,急切而直接地指出「哪裡在浪費」,每條附量級估計與更省的做法。**輸出一律使用繁體中文(台灣用語)、UTF-8 無亂碼。**
|
||||
@@ -1,37 +0,0 @@
|
||||
---
|
||||
name: hello
|
||||
description: 範例 skill,用來驗證 jsc plugin 是否安裝成功,也是新增 skill 的範本。當使用者輸入 hello、想測試 plugin、或想看 skill 模板長什麼樣子時觸發;回覆一句問候並簡述此 plugin 的用途。
|
||||
---
|
||||
|
||||
# hello(範例 skill)
|
||||
|
||||
這是 `jsc` plugin 的範例 skill。它有兩個用途:
|
||||
|
||||
1. **驗證安裝** — 跨各家 AI 助理確認 skill 已被正確載入。
|
||||
2. **作為範本** — 複製這個資料夾即可新增一個新的 skill。
|
||||
|
||||
## 呼叫方式
|
||||
|
||||
| 助理 | 呼叫方式 |
|
||||
| --- | --- |
|
||||
| Claude Code | `/jsc:hello` |
|
||||
| Antigravity | `/jsc:hello`,或描述需求自動觸發 |
|
||||
| Codex | 在提示詞輸入 `$hello`,或用 `/skills` 選單 |
|
||||
| OpenCode | 直接描述需求,模型會透過 skill 工具自動呼叫 |
|
||||
|
||||
## 行為
|
||||
|
||||
當這個 skill 被觸發時:
|
||||
|
||||
1. 回覆「Hello from **jsc** 👋」。
|
||||
2. 用一句話說明 `jsc` 是一個跨 AI 助理的共用 skill 集合。
|
||||
3. 提示使用者可以在 README 的「Skills 目錄」查看所有可用的 skills。
|
||||
|
||||
## 如何以此為範本新增 skill
|
||||
|
||||
1. 複製 `skills/hello/` 為 `skills/<your-skill-name>/`。
|
||||
2. 修改 `SKILL.md` 的 frontmatter:
|
||||
- `name`:小寫、數字、連字號(`-`),最長 64 字元。**這個名稱會成為 Claude Code / Antigravity 的 `/jsc:<name>` 指令**。
|
||||
- `description`:第三人稱,寫清楚「什麼時候該用、什麼時候不該用」與觸發關鍵字 — 各家助理靠這段文字決定是否自動載入。
|
||||
3. 在內文寫下 skill 的具體步驟。
|
||||
4. 手動把新 skill 補進 README 的「Skills 目錄」區塊。
|
||||
Reference in New Issue
Block a user