diff --git a/.gitignore b/.gitignore index c7d4e0e..6ccd8ff 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,6 @@ test_env/ # .codex/prompts/sdd-*.md # .github/prompts/sdd-*.prompt.md +.codex/ +.claude/ +.github/ \ No newline at end of file diff --git a/scripts/templates/sdd-auto.md b/scripts/templates/sdd-auto.md index bc4541b..f989ccb 100644 --- a/scripts/templates/sdd-auto.md +++ b/scripts/templates/sdd-auto.md @@ -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 @@ -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**:如需測試先行開發,請使用手動工作流程 @@ -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。 diff --git a/scripts/templates/sdd-ideate.md b/scripts/templates/sdd-ideate.md new file mode 100644 index 0000000..073f58d --- /dev/null +++ b/scripts/templates/sdd-ideate.md @@ -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 輸入內容}` diff --git a/scripts/templates/sdd-impl.md b/scripts/templates/sdd-impl.md index d3589b5..0c514c3 100644 --- a/scripts/templates/sdd-impl.md +++ b/scripts/templates/sdd-impl.md @@ -200,7 +200,34 @@ 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` ## 下一步 @@ -208,3 +235,4 @@ if not user: - 執行專案既有測試框架驗證 - 進入 Phase 4:測試驗證(如有定義) - 整合至專案主要程式碼 +- 檢視 `ideate/` 資料夾中的下一個待實作功能