Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,6 @@ test_env/
# .codex/prompts/sdd-*.md
# .github/prompts/sdd-*.prompt.md

.codex/
.claude/
.github/
39 changes: 33 additions & 6 deletions scripts/templates/sdd-auto.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ find . -type d -maxdepth 3 | grep -E "src|models|services" | head -10

# 程式碼樣本
find . -name "*.ts" -o -name "*.py" -o -name "*.go" | head -5

# 功能發想清單(如有)
echo "=== 待實作功能 ==="
ls ideate/p0/*.md ideate/p1/*.md ideate/p2/*.md 2>/dev/null || echo "無待處理的功能發想"
```

**判斷優先順序:** Prompt 指定 > 專案上下文 > 詢問使用者 > 預設 TypeScript
Expand Down Expand Up @@ -135,6 +139,7 @@ Feature: {功能名稱}
4. **Phase 3** → 實作檔案(依 architecture.md)
5. **Phase 4** → `docs/features/{feature}/conclusion.md`
6. 失敗時返回 Phase 3 重試
7. **歸檔功能發想**(如有對應的 ideate 檔案)

**選用階段(不包含在自動模式):**
- **Integration Tests**:如需測試先行開發,請使用手動工作流程
Expand All @@ -143,19 +148,41 @@ Feature: {功能名稱}
**輸出結構:**
```
project_root/
├── features/{feature}.feature # Phase 1
├── ideate/ # 功能發想
│ ├── p0/ # 緊急優先級
│ ├── p1/ # 重要優先級
│ ├── p2/ # 一般優先級
│ └── done/ # 已完成實作
│ └── {feature}.md # 歸檔的功能發想
├── features/{feature}.feature # Phase 1
├── docs/features/{feature}/
│ ├── architecture.md # Phase 2
│ └── conclusion.md # Phase 4
│ ├── architecture.md # Phase 2
│ └── conclusion.md # Phase 4
└── {專案目錄}/
├── {模型檔案} # Phase 3
└── {服務檔案} # Phase 3
├── {模型檔案} # Phase 3
└── {服務檔案} # Phase 3
```

## 歸檔功能發想

Phase 4 驗證通過後,檢查是否有對應的功能發想檔案需要歸檔:

```bash
# 檢查各優先級資料夾
ls ideate/p0/{feature}.md ideate/p1/{feature}.md ideate/p2/{feature}.md 2>/dev/null

# 如存在,移動到已完成資料夾並更新狀態
mkdir -p ideate/done
mv ideate/p0/{feature}.md ideate/done/ 2>/dev/null || \
mv ideate/p1/{feature}.md ideate/done/ 2>/dev/null || \
mv ideate/p2/{feature}.md ideate/done/ 2>/dev/null
```

**重要:**
**重要:**
- Phase 2 輸出繁體中文 Markdown(語言無關)
- Phase 3 遵循專案技術棧與架構
- 每個 Phase 必須完成才進入下一個
- Integration tests 為選用功能,不包含在自動模式中
- 完成後自動歸檔對應的 ideate 檔案(如有)

開始執行 Phase 1。
222 changes: 222 additions & 0 deletions scripts/templates/sdd-ideate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
---
description: 階段 0 - 針對主題發想產品功能點子(策略師角色)
---

# SDD 階段 0:功能發想

**角色:** 產品策略師 | **目標:** 深入分析專案現狀,發想具體可行的功能點子,獨立存檔於 `ideate/` 資料夾

## 使用者輸入

__PROMPT__

## 解析需求

從自然語言輸入提取:發想主題、點子數量(預設 3-5 個,「越多越好」則 5-8 個)、具體痛點/情境、約束條件、目標使用者、優先級偏好

## 主題類型參考

| 主題 | 發想方向 | 思考重點 |
|-----|---------|---------|
| 新增功能 | 全新能力、創新特性 | 使用者痛點、市場趨勢、競品分析 |
| 完善體驗 | 優化流程、提升易用性 | 使用者旅程、摩擦點、操作效率 |
| 問題修復 | 解決已知問題、技術債 | 錯誤回報、效能瓶頸、穩定性 |

## 職責約束

產品策略師專注「做什麼」而非「怎麼做」。不討論技術實作細節,專注使用者價值和業務影響。

## 專案分析流程

### 1. 識別技術棧(CRITICAL)

```bash
# 檢查配置檔案
ls -la | grep -E "(package.json|requirements.txt|Gemfile|Cargo.toml|go.mod)"

# Node.js: 檢查框架
cat package.json | grep -E "(react|vue|next|express)"

# Python: 檢查框架
cat requirements.txt | grep -E "(django|flask|fastapi)"
```

**技術棧對照:**
- `package.json` → Node.js (檢查 `src/`, `app/`, `pages/`)
- `requirements.txt` → Python (檢查 `src/`, `app/`)
- `Gemfile` → Ruby/Rails (檢查 `app/`, `config/`)
- `Cargo.toml` → Rust (檢查 `src/`)
- `go.mod` → Go (檢查 `cmd/`, `pkg/`)

**明確陳述:** 專案類型、語言、框架、程式碼位置。無法識別則列出 `ls -la` 和 `cat README.md`。

### 2. 檢查現有功能

```bash
# 檢查 ideate 資料夾(存在則列出,不存在才建立)
if [ -d "ideate" ]; then
echo "=== 現有發想 ==="
ls ideate/p0/*.md ideate/p1/*.md ideate/p2/*.md ideate/done/*.md 2>/dev/null || echo "無"
else
mkdir -p ideate/p0 ideate/p1 ideate/p2 ideate/done
fi

# 檢查現有功能
ls features/ 2>/dev/null || echo "尚無 features"
ls -la | head -10
```

### 3. 發想原則

**根據技術棧調整方向:**
- **前端:** UI/UX、互動體驗、回應式設計、無障礙功能
- **後端:** 資料處理、安全性、效能、錯誤處理
- **全端:** 前後端整合、資料流、狀態管理
- **行動:** 原生功能(相機、定位)、離線支援、效能優化

**思考框架:**
- 新增功能:使用者無法做到什麼?競品有什麼?技術棧支援嗎?
- 完善體驗:使用者在哪裡卡住?如何簡化步驟?
- 問題修復:已知錯誤?不穩定情況?檢查 TODO/FIXME 註解

## 輸出格式

### 優先級分類

| 優先級 | 資料夾 | 說明 |
|-------|--------|------|
| P0 | `ideate/p0/` | 緊急:影響核心功能、阻礙使用者 |
| P1 | `ideate/p1/` | 重要:顯著提升體驗、中期規劃 |
| P2 | `ideate/p2/` | 一般:錦上添花、長期規劃 |

### 檔案格式

**檔名:** `ideate/{priority}/{feature-name}.md`(小寫、連字號、簡潔)

**內容結構:**

```markdown
---
title: {功能名稱}
priority: P0/P1/P2
impact: 高/中/低
complexity: 高/中/低
status: pending
created: {YYYY-MM-DD}
---

# {功能名稱}

## 問題陳述
{描述問題或機會,1-2 句}

## 目標使用者
{誰會使用}

## 功能描述
{具體描述做什麼,3-5 句}

## 使用情境
- 情境 1:{使用者在什麼情況下會用到}
- 情境 2:{另一個使用情境}

## 預期效益
- {對使用者的好處}
- {對業務的好處}

## 階段 1 輸入
{完整需求描述,可直接作為 sdd-spec 的輸入}
```

## 範例

**輸入:** "改善登入體驗,每次都要重新登入很麻煩,想 3 個點子讓常用使用者更方便"

**分析:**
- 技術棧:Next.js + React 前端(檢查到 package.json 含 react/next)
- 主題:登入體驗改善 | 數量:3 個 | 痛點:重複登入 | 使用者:活躍用戶

**產出:** `ideate/p1/remember-login.md`

```markdown
---
title: 記住登入狀態
priority: P1
impact: 高
complexity: 中
status: pending
created: 2024-01-15
---

# 記住登入狀態

## 問題陳述
使用者每次開啟應用程式都需要重新登入,造成使用摩擦。

## 目標使用者
所有需要登入的使用者,特別是頻繁使用的活躍用戶。

## 功能描述
提供「記住我」選項,讓使用者可以選擇在信任裝置上保持登入狀態。系統使用安全 token 機制,30 天內自動登入,並提供「登出所有裝置」安全選項。

## 使用情境
- 情境 1:使用者在手機勾選「記住我」,之後開啟 App 直接進入主頁
- 情境 2:使用者在公用電腦不勾選「記住我」,關閉瀏覽器後自動登出

## 預期效益
- 減少登入摩擦,提升使用者留存率
- 增加日活躍用戶數(DAU)

## 階段 1 輸入
實作「記住我」登入功能。使用者登入時可勾選「記住我」選項,勾選後在 30 天內自動登入,不需重新輸入密碼。未勾選則關閉瀏覽器後需重新登入。使用者可在設定中查看已登入裝置並登出特定或所有裝置。
```

## 品質檢查

**專案分析:**
- [ ] 已識別技術棧(語言、框架、程式碼位置)
- [ ] 已檢查 ideate 資料夾(存在則列出現有點子)
- [ ] 僅在必要時建立資料夾

**功能發想:**
- [ ] 符合技術棧特性
- [ ] 回應使用者需求
- [ ] 不與現有點子/已完成功能重複

**檔案產出:**
- [ ] 獨立 .md 檔案,正確資料夾
- [ ] 檔名符合規則
- [ ] 完整 frontmatter 與內容
- [ ] priority 與資料夾一致
- [ ] 「階段 1 輸入」可直接使用

## 資料夾結構

```
project_root/
└── ideate/
├── p0/ # 緊急
├── p1/ # 重要
├── p2/ # 一般
└── done/ # 已完成
```

## 執行發想

**前置確認:** ✅ 已識別技術棧 → ✅ 已檢查 ideate 狀態 → ✅ 已解析需求

**發想步驟:**
1. 確認數量(預設 3-5 個)
2. 對齊主題與使用者痛點
3. 考量技術棧特性(前端/後端/行動/全端)
4. 避免與現有點子重複
5. 依影響力分配優先級(P0/P1/P2)
6. 建立獨立檔案到對應資料夾

**避免重複:** 若 ideate 已有點子,可考慮延伸補充、不同角度或替代方案。

現在開始發想並產出功能提案。

## 下一步

完成後執行:`__CMD_PREFIX__sdd-spec {階段 1 輸入內容}`
30 changes: 29 additions & 1 deletion scripts/templates/sdd-impl.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,11 +200,39 @@ if not user:
- 運行相關測試:`npm test` 或 `pytest`
- 確保所有情境都能通過
- 如失敗,修整程式碼並重複此步驟
8. 回報已建立的檔案清單與驗證結果
8. **歸檔功能發想**:如果此功能來自 `ideate/` 資料夾,將對應檔案移至已完成區
9. 回報已建立的檔案清單與驗證結果

## 歸檔功能發想

實作完成且所有檢查通過後,檢查是否有對應的功能發想檔案需要歸檔:

```bash
# 檢查各優先級資料夾是否存在對應的 ideate 檔案
ls ideate/p0/{feature_name}.md 2>/dev/null || \
ls ideate/p1/{feature_name}.md 2>/dev/null || \
ls ideate/p2/{feature_name}.md 2>/dev/null

# 如存在,移動到已完成資料夾
mkdir -p ideate/done
mv ideate/p0/{feature_name}.md ideate/done/ 2>/dev/null || \
mv ideate/p1/{feature_name}.md ideate/done/ 2>/dev/null || \
mv ideate/p2/{feature_name}.md ideate/done/ 2>/dev/null

# 更新檔案中的 status
# 將 status: pending 改為 status: completed
```

**注意事項:**
- 只有在所有品質檢查通過後才進行歸檔
- 依序檢查 `ideate/p0/`、`ideate/p1/`、`ideate/p2/` 資料夾
- 如果檔案不存在於任何優先級資料夾,跳過此步驟
- 移動後更新檔案 frontmatter 中的 `status: pending` 為 `status: completed`

## 下一步

完成後可進行:
- 執行專案既有測試框架驗證
- 進入 Phase 4:測試驗證(如有定義)
- 整合至專案主要程式碼
- 檢視 `ideate/` 資料夾中的下一個待實作功能