優化 Step2:改用 skill RPG 攻防腳色系統(新增 Mage 邏輯角色、Step3/4 套 Paladin 裁決人設) #14

Merged
jiantw83 merged 8 commits from feat/optimize-step2 into develop 2026-06-16 09:04:09 +00:00
Member

變更摘要

將 AI Code Review 的 Step2 攻防腳色,由原本 5 個功能型審查員(Aria/Rex/Zara/Leo/Maya,定義於 .yaml)改為以 skill code-review 的 RPG 攻防腳色為主(定義於 .md,含 side/focus/badge/color/personality + 審查重點本文)。

  • 攻擊方 6 名🎼 Bard(風格)、🔮 Mage(邏輯,新增)、 Rogue(效率)、🗡️ Assassin(安全)、🧰 Leo(可維護性)、🧪 Maya(測試)。
  • 防守方 🛡️ Paladin(裁決):不產 findings,其裁決人設套用到 Step3 去重與 Step4 誤報過濾的 prompt。

影響範圍

  • findings 的 role 欄位值改為新腳色名,且一律以腳色定義的 name 為準(不再信任 LLM 自填)。
  • 腳色名稱對應:Aria→Bard、Rex→Assassin、Zara→Rogue;新增 Mage;Leo/Maya 保留。
  • 角色介紹 comment 表改為顯示「徽章+面向」。
  • Step3/4 過濾 prompt 改為 🛡️ Paladin 聖騎士裁決口吻(流程不變)。

重點檔案/模組

  • app/roles.js:載入器由讀 .yaml 改為讀 .md(frontmatter + 本文);新增 parseRoleFile / loadRole / buildAnalysisPromptloadRoles 只回傳攻擊方。
  • app/findings.jsanalyzeWithRole 改用組裝後的 prompt 並鎖定 role 名;Step3/4 prompt 套上 Paladin 人設。
  • app/prompts/roles/:新增 7 個 .md(bard/mage/rogue/assassin/leo/maya/paladin),刪除 5 個舊 .yaml
  • app/roles.test.js:新增腳色載入器測試(8 例)。
  • app/comments.test.js:補 postNewCriticalComments 的空陣列與「多筆 critical 混合降級」測試(2 例)。
  • .gitea/ai-review/exclusions.json:舊腳色名遷移;findings.json:清空為 []

風險/注意事項

  • exclusions.json 既有以舊 role 名鎖定的排除條目已同步遷移(Aria→Bard、Rex→Assassin、Zara→Rogue),避免排除失效導致舊誤報再現。
  • 全套單元測試 134 例通過
  • 容器打包:Dockerfile COPY app/ 已涵蓋新 .md 腳色檔,無需額外調整。
## 變更摘要 將 AI Code Review 的 Step2 攻防腳色,由原本 5 個功能型審查員(Aria/Rex/Zara/Leo/Maya,定義於 `.yaml`)改為**以 skill `code-review` 的 RPG 攻防腳色為主**(定義於 `.md`,含 `side/focus/badge/color/personality` + 審查重點本文)。 - **攻擊方 6 名**:🎼 Bard(風格)、🔮 Mage(邏輯,**新增**)、⚡ Rogue(效率)、🗡️ Assassin(安全)、🧰 Leo(可維護性)、🧪 Maya(測試)。 - **防守方 🛡️ Paladin(裁決)**:不產 findings,其裁決人設套用到 Step3 去重與 Step4 誤報過濾的 prompt。 ## 影響範圍 - findings 的 `role` 欄位值改為新腳色名,且一律以腳色定義的 `name` 為準(不再信任 LLM 自填)。 - 腳色名稱對應:Aria→Bard、Rex→Assassin、Zara→Rogue;新增 Mage;Leo/Maya 保留。 - 角色介紹 comment 表改為顯示「徽章+面向」。 - Step3/4 過濾 prompt 改為 🛡️ Paladin 聖騎士裁決口吻(流程不變)。 ## 重點檔案/模組 - `app/roles.js`:載入器由讀 `.yaml` 改為讀 `.md`(frontmatter + 本文);新增 `parseRoleFile` / `loadRole` / `buildAnalysisPrompt`,`loadRoles` 只回傳攻擊方。 - `app/findings.js`:`analyzeWithRole` 改用組裝後的 prompt 並鎖定 `role` 名;Step3/4 prompt 套上 Paladin 人設。 - `app/prompts/roles/`:新增 7 個 `.md`(bard/mage/rogue/assassin/leo/maya/paladin),刪除 5 個舊 `.yaml`。 - `app/roles.test.js`:新增腳色載入器測試(8 例)。 - `app/comments.test.js`:補 `postNewCriticalComments` 的空陣列與「多筆 critical 混合降級」測試(2 例)。 - `.gitea/ai-review/exclusions.json`:舊腳色名遷移;`findings.json`:清空為 `[]`。 ## 風險/注意事項 - `exclusions.json` 既有以舊 role 名鎖定的排除條目已同步遷移(Aria→Bard、Rex→Assassin、Zara→Rogue),避免排除失效導致舊誤報再現。 - 全套單元測試 **134 例通過**。 - 容器打包:Dockerfile `COPY app/` 已涵蓋新 `.md` 腳色檔,無需額外調整。
jiantw83 added 3 commits 2026-06-16 08:45:04 +00:00
Owner

🤖 AI Code Review 團隊

👤 角色 🎯 面向 🧠 個性
🗡️ Assassin security 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用
🎼 Bard style 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版
🧰 Leo maintainability 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來
🔮 Mage logic 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」
🧪 Maya testing 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑
Rogue efficiency 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」

🔍 服務:gemini 模型:gemini-2.5-flash

## 🤖 AI Code Review 團隊 | 👤 角色 | 🎯 面向 | 🧠 個性 | |--------|--------|--------| | **🗡️ Assassin** | security | 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用 | | **🎼 Bard** | style | 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版 | | **🧰 Leo** | maintainability | 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來 | | **🔮 Mage** | logic | 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」 | | **🧪 Maya** | testing | 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑 | | **⚡ Rogue** | efficiency | 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」 | > 🔍 服務:gemini 模型:gemini-2.5-flash
Owner

🔍 新發現問題(2 筆)

等級 審查員 位置 建議
🟡 警告 Mage app/roles.js:60 buildAnalysisPrompt 函式中,role.focus 屬性被直接用於字串模板。若角色定義檔中缺少 focus 欄位,此處將會顯示為 負責「undefined」面向,導致生成的提示語義不完整。建議在引用前檢查 role.focus 是否存在,或提供一個預設值,例如:`負責「${role.focus
🟡 警告 Mage app/roles.js:77 getRoleIntro 函式中,r.focusr.personality 屬性被直接用於生成 Markdown 表格。若角色定義檔中缺少這些欄位,表格中將會顯示 undefined,影響可讀性與呈現品質。建議在引用前檢查這些屬性是否存在,並提供一個空字串或預設值,例如:`
## 🔍 新發現問題(2 筆) | 等級 | 審查員 | 位置 | 建議 | |------|--------|------|------| | 🟡 警告 | Mage | app/roles.js:60 | 在 `buildAnalysisPrompt` 函式中,`role.focus` 屬性被直接用於字串模板。若角色定義檔中缺少 `focus` 欄位,此處將會顯示為 `負責「undefined」面向`,導致生成的提示語義不完整。建議在引用前檢查 `role.focus` 是否存在,或提供一個預設值,例如:`負責「${role.focus || '未定義'}」面向`。 | | 🟡 警告 | Mage | app/roles.js:77 | 在 `getRoleIntro` 函式中,`r.focus` 和 `r.personality` 屬性被直接用於生成 Markdown 表格。若角色定義檔中缺少這些欄位,表格中將會顯示 `undefined`,影響可讀性與呈現品質。建議在引用前檢查這些屬性是否存在,並提供一個空字串或預設值,例如:`| **${badge}${r.name}** | ${r.focus || ''} | ${r.personality || ''} |`。 |
admin reviewed 2026-06-16 08:46:12 +00:00
app/roles.js Outdated
@@ -13,0 +27,4 @@
/**
* 載入攻擊方角色Step2 產生 findings 依檔名排序
* 防守方 Paladin不在此列裁決邏輯由去重/誤報過濾流程承擔
*/
Owner

等級🔴 嚴重
審查員:Mage
建議:在 parseRoleFile 函式中,yaml.load(match[1]) 若遇到格式錯誤的 YAML 內容,會拋出未捕捉的例外,導致應用程式崩潰。應加入 try-catch 區塊來處理此潛在錯誤,確保即使角色定義檔有誤,系統也能穩定運行,例如回傳一個錯誤物件或記錄錯誤並跳過該檔案。

**等級**:🔴 嚴重 **審查員**:Mage **建議**:在 `parseRoleFile` 函式中,`yaml.load(match[1])` 若遇到格式錯誤的 YAML 內容,會拋出未捕捉的例外,導致應用程式崩潰。應加入 `try-catch` 區塊來處理此潛在錯誤,確保即使角色定義檔有誤,系統也能穩定運行,例如回傳一個錯誤物件或記錄錯誤並跳過該檔案。
admin reviewed 2026-06-16 08:46:13 +00:00
app/roles.js Outdated
@@ -13,0 +27,4 @@
/**
* 載入攻擊方角色Step2 產生 findings 依檔名排序
* 防守方 Paladin不在此列裁決邏輯由去重/誤報過濾流程承擔
*/
Owner

等級🔴 嚴重
審查員:Rogue
建議:「loadRole」函式每次被呼叫時,都會重新讀取並解析所有角色檔案。這會造成不必要的同步檔案 I/O 與 CPU 浪費,尤其當此函式被頻繁呼叫時,會嚴重阻塞事件迴圈。建議將「readRoleFiles()」的結果快取起來,讓「loadRole」直接從記憶體中查詢,避免重複讀取磁碟。

**等級**:🔴 嚴重 **審查員**:Rogue **建議**:「loadRole」函式每次被呼叫時,都會重新讀取並解析所有角色檔案。這會造成不必要的同步檔案 I/O 與 CPU 浪費,尤其當此函式被頻繁呼叫時,會嚴重阻塞事件迴圈。建議將「readRoleFiles()」的結果快取起來,讓「loadRole」直接從記憶體中查詢,避免重複讀取磁碟。
admin added 1 commit 2026-06-16 08:46:27 +00:00
chore: update ai-review findings [ai-review-bot][failure]
AI / 計算版本號 (pull_request) Successful in 4s
AI / Code Review (pull_request) Failing after 5s
d714cf7665
jiantw83 added 3 commits 2026-06-16 09:01:29 +00:00
Owner

🤖 AI Code Review 團隊

👤 角色 🎯 面向 🧠 個性
🗡️ Assassin security 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用
🎼 Bard style 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版
🧰 Leo maintainability 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來
🔮 Mage logic 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」
🧪 Maya testing 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑
Rogue efficiency 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」

🔍 服務:gemini 模型:gemini-2.5-flash

## 🤖 AI Code Review 團隊 | 👤 角色 | 🎯 面向 | 🧠 個性 | |--------|--------|--------| | **🗡️ Assassin** | security | 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用 | | **🎼 Bard** | style | 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版 | | **🧰 Leo** | maintainability | 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來 | | **🔮 Mage** | logic | 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」 | | **🧪 Maya** | testing | 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑 | | **⚡ Rogue** | efficiency | 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」 | > 🔍 服務:gemini 模型:gemini-2.5-flash
Owner

🔍 新發現問題(1 筆)

等級 審查員 位置 建議
🟡 警告 Bard app/comments.test.js:172 此處斷言使用了魔術字串 /嚴重問題/,就像樂譜中突然出現的無標記音符,雖能理解,卻少了點優雅與明確。建議將此字串提取為一個具名常數,或至少賦予一個描述性變數,以提升可讀性與未來維護的便利性,讓意圖更加清晰。
## 🔍 新發現問題(1 筆) | 等級 | 審查員 | 位置 | 建議 | |------|--------|------|------| | 🟡 警告 | Bard | app/comments.test.js:172 | 此處斷言使用了魔術字串 `/嚴重問題/`,就像樂譜中突然出現的無標記音符,雖能理解,卻少了點優雅與明確。建議將此字串提取為一個具名常數,或至少賦予一個描述性變數,以提升可讀性與未來維護的便利性,讓意圖更加清晰。 |
jiantw83 scheduled this pull request to auto merge when all checks succeed 2026-06-16 09:03:30 +00:00
admin added 1 commit 2026-06-16 09:03:48 +00:00
chore: update ai-review findings [ai-review-bot][success]
AI / 計算版本號 (pull_request) Successful in 4s
AI / Code Review (pull_request) Successful in 10s
862f4e46ef
jiantw83 merged commit ffc9038923 into develop 2026-06-16 09:04:09 +00:00
jiantw83 deleted branch feat/optimize-step2 2026-06-16 09:04:10 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: actions/code-review#14