Initial commit
This commit is contained in:
386
skills/skills-development/examples.md
Normal file
386
skills/skills-development/examples.md
Normal file
@@ -0,0 +1,386 @@
|
||||
# Skills 設計實際案例分析
|
||||
|
||||
本文件提供實際的 skill 設計案例分析,幫助你理解如何判斷是否需要將功能獨立成 skill。
|
||||
|
||||
每個案例都包含:
|
||||
- 背景說明
|
||||
- 詳細的分析過程
|
||||
- 決策結論和理由
|
||||
- 未來的重新評估條件(如果適用)
|
||||
|
||||
## 案例 1:Git 提交原子性判斷
|
||||
|
||||
### 背景
|
||||
|
||||
在設計 Git 相關的 commands 時,遇到一個問題:
|
||||
|
||||
- `git:commit-push` 需要判斷變更是否符合原子性(atomic commits)
|
||||
- `git:commit-push-all` **明確設計為不考慮**原子性,直接提交所有變更
|
||||
|
||||
**問題**:是否應該將「原子性判斷」邏輯獨立成一個 skill?
|
||||
|
||||
### 分析過程
|
||||
|
||||
#### 使用檢查清單
|
||||
|
||||
```markdown
|
||||
檢查清單:
|
||||
- [ ] 多處使用?→ ❌ 只有一處使用(commit-push)
|
||||
- [x] 邏輯複雜?→ ✅ 包含分類、分析等邏輯(7+ 步驟)
|
||||
- [ ] 可獨立呼叫?→ ❓ 可能有價值,但不確定使用者是否會單獨呼叫
|
||||
- [ ] 需要獨立維護?→ ❌ 目前沒有這個需求
|
||||
```
|
||||
|
||||
#### 權重評估
|
||||
|
||||
| 評估項目 | 現況 | 符合度 |
|
||||
|---------|------|--------|
|
||||
| 使用次數 | 1 處 | ❌ 不符合 |
|
||||
| 複雜度 | 中高(7+ 步驟) | ✅ 符合 |
|
||||
| 獨立價值 | 不確定 | ❓ 不明確 |
|
||||
| 未來擴展 | 可能但不確定 | ❓ 不明確 |
|
||||
|
||||
**評分**:2 個明確條件中只符合 1 個
|
||||
|
||||
### 決策結論
|
||||
|
||||
**❌ 目前不需要獨立成 skill**
|
||||
|
||||
#### 理由
|
||||
|
||||
1. **使用次數不足**
|
||||
- 只有 `git:commit-push` 使用
|
||||
- `git:commit-push-all` 明確採用不同設計理念(不檢查原子性)
|
||||
- 未來是否有其他使用場景不確定
|
||||
|
||||
2. **遵循 YAGNI 原則**
|
||||
- 不要為「可能的」未來需求過度設計
|
||||
- 等到第二個使用場景出現再重構
|
||||
|
||||
3. **與 command 緊密耦合**
|
||||
- 原子性判斷的邏輯與 commit-push 的流程緊密結合
|
||||
- 獨立出來可能降低可讀性
|
||||
|
||||
### 未來觸發條件
|
||||
|
||||
**何時應該重新評估?**
|
||||
|
||||
如果出現以下任一情況,應該考慮將其獨立成 `git:analyze-atomicity` skill:
|
||||
|
||||
✅ **觸發重構的條件**:
|
||||
|
||||
1. **新增其他 commands 需要這個邏輯**
|
||||
- 例如:`git:commit-review` 也需要檢查原子性
|
||||
- 例如:`git:pre-commit-check` 需要在提交前驗證
|
||||
|
||||
2. **使用者主動要求獨立功能**
|
||||
- 使用者想要「只檢查原子性,不提交」的功能
|
||||
- 需要將原子性檢查作為獨立的驗證步驟
|
||||
|
||||
3. **邏輯變得更複雜**
|
||||
- 原子性判斷需要更多步驟和條件
|
||||
- 需要獨立測試和驗證
|
||||
|
||||
4. **跨 plugin 重複使用**
|
||||
- 其他 plugins 也需要類似的原子性判斷邏輯
|
||||
|
||||
**那時候再抽取成獨立的 skill 是更好的時機。**
|
||||
|
||||
---
|
||||
|
||||
## 案例 2:產生 Commit 訊息
|
||||
|
||||
### 背景
|
||||
|
||||
多個 Git commands 都需要產生符合規範的提交訊息:
|
||||
|
||||
- `git:commit-push` 需要產生符合 Conventional Commits 的訊息
|
||||
- `git:commit-push-all` 也需要產生提交訊息(可能格式略有不同)
|
||||
- 未來可能有 `git:commit-amend`、`git:commit-fixup` 等 commands
|
||||
|
||||
**問題**:是否應該將「產生提交訊息」獨立成一個 skill?
|
||||
|
||||
### 分析過程
|
||||
|
||||
#### 使用檢查清單
|
||||
|
||||
```markdown
|
||||
檢查清單:
|
||||
- [x] 多處使用?→ ✅ 2 處以上,未來可能更多
|
||||
- [x] 邏輯複雜?→ ✅ 需要分析變更、套用格式規範(5+ 步驟)
|
||||
- [x] 可獨立呼叫?→ ✅ 使用者可能想「預覽提交訊息」而不實際提交
|
||||
- [x] 需要獨立維護?→ ✅ 格式規範(如 Conventional Commits)可能會調整
|
||||
```
|
||||
|
||||
#### 權重評估
|
||||
|
||||
| 評估項目 | 現況 | 符合度 |
|
||||
|---------|------|--------|
|
||||
| 使用次數 | 2+ 處,未來更多 | ✅ 符合 |
|
||||
| 複雜度 | 中(5+ 步驟) | ✅ 符合 |
|
||||
| 獨立價值 | 高(預覽訊息) | ✅ 符合 |
|
||||
| 未來擴展 | 確定會擴展 | ✅ 符合 |
|
||||
|
||||
**評分**:4 個條件全部符合 ✅
|
||||
|
||||
### 決策結論
|
||||
|
||||
**✅ 應該獨立成 skill**
|
||||
|
||||
#### 理由
|
||||
|
||||
1. **多處重複使用**
|
||||
- 至少 2 個 commands 需要
|
||||
- 未來明確會有更多使用場景
|
||||
|
||||
2. **邏輯複雜且需要獨立維護**
|
||||
- 需要分析 git diff
|
||||
- 套用 Conventional Commits 格式
|
||||
- 可能需要支援不同的訊息格式
|
||||
|
||||
3. **具有獨立使用價值**
|
||||
- 使用者可能想「預覽提交訊息」
|
||||
- 可以作為提交前的檢查步驟
|
||||
|
||||
4. **便於測試和維護**
|
||||
- 提交訊息格式可能會調整
|
||||
- 獨立 skill 便於集中管理和測試
|
||||
|
||||
### 建議的 Skill 設計
|
||||
|
||||
**Skill 名稱**:`git:generate-commit-message`
|
||||
|
||||
**位置**:`plugins/git/skills/generate-commit-message/SKILL.md`
|
||||
|
||||
**YAML Front Matter**:
|
||||
```yaml
|
||||
---
|
||||
name: Generate-Commit-Message
|
||||
description: 根據變更內容和專案規範產生提交訊息
|
||||
---
|
||||
```
|
||||
|
||||
**核心功能**:
|
||||
|
||||
```markdown
|
||||
# 產生提交訊息
|
||||
|
||||
## 輸入條件
|
||||
- Git 變更的詳細資訊(通過 git diff 獲取)
|
||||
- 專案的提交訊息格式偏好(預設 Conventional Commits)
|
||||
- 可選:現有的 commit history 來學習風格
|
||||
|
||||
## 執行步驟
|
||||
1. 分析變更內容和類型(新增、修改、修正等)
|
||||
2. 識別影響範圍(scope)
|
||||
3. 產生簡短描述(subject line)
|
||||
4. 產生詳細說明(body)
|
||||
5. 套用格式規範(Conventional Commits 或自訂格式)
|
||||
6. 加入 co-author 資訊(如果是 AI 協助)
|
||||
|
||||
## 輸出結果
|
||||
- 格式化的提交訊息文字
|
||||
- 可以直接用於 `git commit -m`
|
||||
```
|
||||
|
||||
**預期使用者**:
|
||||
- `git:commit-push`
|
||||
- `git:commit-push-all`
|
||||
- 未來的 `git:commit-amend`
|
||||
- 未來的 `git:commit-review`
|
||||
|
||||
---
|
||||
|
||||
## 案例 3:檔案變更分類
|
||||
|
||||
### 背景
|
||||
|
||||
在 `git:commit-push` 的實作中,需要將變更的檔案按類型分類:
|
||||
|
||||
- 依照 Conventional Commits 的類型(feat, fix, docs, style 等)
|
||||
- 分析檔案路徑和變更內容
|
||||
- 決定這些變更屬於哪個類別
|
||||
|
||||
**問題**:是否應該將「檔案變更分類」獨立成一個 skill?
|
||||
|
||||
### 分析過程
|
||||
|
||||
#### 使用檢查清單
|
||||
|
||||
```markdown
|
||||
檢查清單:
|
||||
- [ ] 多處使用?→ ❌ 只有 commit-push 使用
|
||||
- [x] 邏輯複雜?→ ✅ 需要分析檔案路徑、內容變更(中等複雜度)
|
||||
- [ ] 可獨立呼叫?→ ❓ 單獨分類檔案的使用場景不明確
|
||||
- [ ] 需要獨立維護?→ ❌ 目前沒有獨立維護的需求
|
||||
```
|
||||
|
||||
#### 權重評估
|
||||
|
||||
| 評估項目 | 現況 | 符合度 |
|
||||
|---------|------|--------|
|
||||
| 使用次數 | 1 處 | ❌ 不符合 |
|
||||
| 複雜度 | 中 | ✅ 符合 |
|
||||
| 獨立價值 | 低 | ❌ 不符合 |
|
||||
| 未來擴展 | 不確定 | ❓ 不明確 |
|
||||
|
||||
**評分**:4 個條件中只符合 1 個
|
||||
|
||||
### 決策結論
|
||||
|
||||
**❌ 目前不需要獨立成 skill**
|
||||
|
||||
#### 理由
|
||||
|
||||
1. **遵循 YAGNI 原則**
|
||||
- 只有一個使用場景
|
||||
- 沒有明確的第二個使用需求
|
||||
|
||||
2. **與 command 緊密耦合**
|
||||
- 檔案分類邏輯與 commit-push 的提交流程緊密結合
|
||||
- 分類的結果直接用於產生提交訊息
|
||||
- 獨立出來反而降低程式碼的連貫性
|
||||
|
||||
3. **獨立價值不明確**
|
||||
- 使用者很少會只想「分類檔案」而不做其他操作
|
||||
- 沒有明確的獨立使用場景
|
||||
|
||||
### 建議做法
|
||||
|
||||
**保持在 `git:commit-push` 的 command 檔案中**
|
||||
|
||||
- 作為 command 的內部邏輯步驟
|
||||
- 保持程式碼的可讀性和連貫性
|
||||
- 如果未來出現第二個使用場景,再考慮重構
|
||||
|
||||
---
|
||||
|
||||
## 專案中的實際 Skills 範例
|
||||
|
||||
本專案已經有幾個設計良好的 skills,可以作為參考:
|
||||
|
||||
### 1. Git 衝突解決
|
||||
|
||||
**檔案**:[`plugins/git/skills/resolving-conflict/SKILL.md`](../../../git/skills/resolving-conflict/SKILL.md)
|
||||
|
||||
**設計亮點**:
|
||||
- ✅ **明確的使用場景**:rebase 和 merge 衝突解決
|
||||
- ✅ **清晰的執行步驟**:偵測狀態 → 列出衝突 → 解決 → 完成流程
|
||||
- ✅ **詳細的工作流程範例**:包含使用者互動的完整流程
|
||||
- ✅ **特殊情況處理**:二進位檔案、檔案刪除衝突等
|
||||
|
||||
**為何獨立成 skill?**
|
||||
- 可能在多個 commands 中使用(`git:resolve-conflict`、`git:rebase`、`git:merge` 等)
|
||||
- 邏輯複雜,包含多種衝突類型的處理
|
||||
- 具有獨立使用價值(使用者可能單獨執行衝突解決)
|
||||
|
||||
**學習要點**:
|
||||
- 如何設計清晰的步驟流程
|
||||
- 如何處理多種情況和分支邏輯
|
||||
- 如何與使用者互動(AskUserQuestion)
|
||||
|
||||
### 2. Plugin 快速修正
|
||||
|
||||
**檔案**:[`plugins/plugin-dev/skills/quick-fix/SKILL.md`](../test/plugin-dev/quick-fix/SKILL.md)
|
||||
|
||||
**設計亮點**:
|
||||
- ✅ **單一職責**:專注於快速修正測試中的問題
|
||||
- ✅ **明確的輸入條件**:測試中的 plugin 和使用者回饋
|
||||
- ✅ **詳細的注意事項**:YAML Front Matter 處理、格式檢查等
|
||||
- ✅ **整合其他工具**:說明如何與其他檔案配合
|
||||
|
||||
**為何獨立成 skill?**
|
||||
- 特定的使用場景(測試流程中的快速修正)
|
||||
- 可能在多個測試 commands 中重複使用
|
||||
- 包含標準化的修正流程
|
||||
|
||||
**學習要點**:
|
||||
- 如何設計針對特定場景的 skill
|
||||
- 如何處理檔案讀取、修改、驗證的流程
|
||||
- 如何保持與專案規範的一致性
|
||||
|
||||
### 3. Skills 設計指南
|
||||
|
||||
**檔案**:[`plugins/plugin-dev/skills/skills-development/SKILL.md`](SKILL.md)
|
||||
|
||||
**設計亮點**:
|
||||
- ✅ **元 skill**:幫助設計其他 skills 的 skill
|
||||
- ✅ **完整的決策框架**:判斷標準、設計原則、決策樹
|
||||
- ✅ **豐富的案例**:包含本文件的所有案例分析
|
||||
- ✅ **模組化文件**:拆分成多個文件便於維護
|
||||
|
||||
**為何獨立成 skill?**
|
||||
- 在開發多個 plugins 時會重複使用
|
||||
- 提供標準化的設計流程
|
||||
- 需要獨立維護和更新
|
||||
|
||||
**學習要點**:
|
||||
- 如何設計指導性的 skill
|
||||
- 如何提供決策支援
|
||||
- 如何組織複雜的文件結構
|
||||
|
||||
---
|
||||
|
||||
## 案例對照表
|
||||
|
||||
快速對照這三個案例的決策:
|
||||
|
||||
| 案例 | 使用次數 | 複雜度 | 獨立價值 | 決策 | 主要理由 |
|
||||
|------|---------|--------|----------|------|---------|
|
||||
| **Git 原子性判斷** | 1 處 | 高 | 不確定 | ❌ 不獨立 | YAGNI 原則,等第二個使用場景 |
|
||||
| **產生 Commit 訊息** | 2+ 處 | 中 | 高 | ✅ 獨立 | 多處使用 + 獨立價值 + 需要維護 |
|
||||
| **檔案變更分類** | 1 處 | 中 | 低 | ❌ 不獨立 | 與 command 緊密耦合,獨立價值低 |
|
||||
|
||||
---
|
||||
|
||||
## 案例分析的關鍵思考
|
||||
|
||||
### 1. 不要被複雜度迷惑
|
||||
|
||||
❌ **錯誤思維**:
|
||||
> 「這個邏輯很複雜(5+ 步驟),應該獨立成 skill。」
|
||||
|
||||
✅ **正確思維**:
|
||||
> 「雖然複雜,但只有一個使用場景,而且與現有 command 緊密耦合,應該保持在一起。複雜度只是判斷因素之一,不是唯一條件。」
|
||||
|
||||
### 2. 重視「使用次數」的權重
|
||||
|
||||
使用次數是**最重要的判斷標準**:
|
||||
- 1 次使用 → 幾乎不需要獨立(除非極特殊情況)
|
||||
- 2 次使用 → 強烈建議獨立
|
||||
- 3+ 次使用 → 必須獨立
|
||||
|
||||
### 3. 「獨立價值」的判斷
|
||||
|
||||
**有獨立價值**:
|
||||
- 使用者可能單獨呼叫這個功能
|
||||
- 可以作為其他工作流程的一部分
|
||||
- 本身就是一個完整的任務
|
||||
|
||||
**沒有獨立價值**:
|
||||
- 只作為更大流程的中間步驟
|
||||
- 離開原本的 context 就沒有意義
|
||||
- 使用者不會單獨執行
|
||||
|
||||
### 4. 未來導向 vs. 當前需求
|
||||
|
||||
✅ **好的未來導向**:
|
||||
- 「已經有 2 個使用場景,未來可能有第 3、4 個」→ 獨立
|
||||
- 「有明確的擴展計畫,第 2 個使用場景正在開發中」→ 可以考慮獨立
|
||||
|
||||
❌ **過度的未來導向**:
|
||||
- 「雖然現在只有 1 個使用場景,但未來可能會有」→ 不獨立(YAGNI)
|
||||
- 「為了靈活性和可擴展性先獨立」→ 過度工程化
|
||||
|
||||
---
|
||||
|
||||
## 與其他文件的關聯
|
||||
|
||||
- **[SKILL.md](SKILL.md)**:核心判斷標準和設計原則
|
||||
- **[official-reference.md](official-reference.md)**:官方定義和參考
|
||||
- **[implementation.md](implementation.md)**:如何實作這些案例中決定獨立的 skills
|
||||
- **[best-practices.md](best-practices.md)**:避免案例中出現的常見錯誤
|
||||
|
||||
---
|
||||
|
||||
**最後更新**:2025-10-19
|
||||
Reference in New Issue
Block a user