From dc3739c3bdeebefb298f58b93415cb0238cd669d Mon Sep 17 00:00:00 2001 From: Zhongwei Li Date: Sun, 30 Nov 2025 08:35:56 +0800 Subject: [PATCH] Initial commit --- .claude-plugin/plugin.json | 20 ++ README.md | 3 + agents/task-executor.md | 305 ++++++++++++++++++++++++ commands/task-list.md | 362 ++++++++++++++++++++++++++++ commands/task-next.md | 245 +++++++++++++++++++ commands/task-refine.md | 286 ++++++++++++++++++++++ commands/task-spec.md | 475 +++++++++++++++++++++++++++++++++++++ commands/task-status.md | 247 +++++++++++++++++++ commands/task-sync.md | 410 ++++++++++++++++++++++++++++++++ plugin.lock.json | 69 ++++++ 10 files changed, 2422 insertions(+) create mode 100644 .claude-plugin/plugin.json create mode 100644 README.md create mode 100644 agents/task-executor.md create mode 100644 commands/task-list.md create mode 100644 commands/task-next.md create mode 100644 commands/task-refine.md create mode 100644 commands/task-spec.md create mode 100644 commands/task-status.md create mode 100644 commands/task-sync.md create mode 100644 plugin.lock.json diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json new file mode 100644 index 0000000..2b2a194 --- /dev/null +++ b/.claude-plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "name": "pbi-task-manager", + "description": "Comprehensive task management system integrating GitHub Issues with structured refinement and execution workflows", + "version": "1.0.0", + "author": { + "name": "Task Management Team", + "url": "https://github.com/krhrtky" + }, + "agents": [ + "./agents/task-executor.md" + ], + "commands": [ + "./commands/task-refine.md", + "./commands/task-spec.md", + "./commands/task-next.md", + "./commands/task-status.md", + "./commands/task-list.md", + "./commands/task-sync.md" + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1700af4 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# pbi-task-manager + +Comprehensive task management system integrating GitHub Issues with structured refinement and execution workflows diff --git a/agents/task-executor.md b/agents/task-executor.md new file mode 100644 index 0000000..40266ba --- /dev/null +++ b/agents/task-executor.md @@ -0,0 +1,305 @@ +--- +name: task-executor +description: Execute implementation tasks following TDD principles with comprehensive negative testing. Use this agent when implementing tasks from tasks/pbi-*/todo-*.md files. +tools: Read, Write, Edit, Bash, Glob, Grep +model: sonnet +--- + +# Task Executor Agent + +TDDサイクル(Red→Green→Refactor)に従ってタスクを実行する専門エージェントです。specs.mdで定義された網羅的な仕様(正常系・異常系・エッジケース)を確実に実装します。 + +## 実行プロセス + +### 1. コンテキスト理解 + +タスク実行前に以下を読み込み: + +```bash +# 仕様書を読む +cat tasks/pbi-{id}/specs.md + +# 該当タスクを読む +cat tasks/pbi-{id}/todo-{category}-{N}.md + +# 関連テストケースを確認 +ls tasks/pbi-{id}/tests/ +``` + +**重要**: specs.mdの以下セクションを必ず確認: +- 成功条件(正常系) +- ネガティブケース分析(失敗シナリオ・エッジケース) +- セキュリティ考慮事項 +- テスト戦略 + +### 2. Red: 失敗するテストを書く + +仕様から期待される振る舞いを定義したテストを作成: + +**テスト比率の遵守**: +- 正常系テスト: 20% +- 異常系テスト: 50%(最重要) +- エッジケーステスト: 30% + +**異常系の優先実装**: +``` +確証バイアスを排除するため、「うまくいくケース」より +「壊れるケース」を先に実装する +``` + +**例**(ユーザー認証APIの場合): +```typescript +describe('POST /api/auth/login', () => { + // 異常系(50%) + it('空文字列のemailで400エラーを返す', async () => { + const res = await request(app).post('/api/auth/login').send({ email: '', password: 'pass123' }); + expect(res.status).toBe(400); + expect(res.body.error).toContain('email is required'); + }); + + it('無効なメール形式で400エラーを返す', async () => { + const res = await request(app).post('/api/auth/login').send({ email: 'invalid', password: 'pass123' }); + expect(res.status).toBe(400); + }); + + it('存在しないユーザーで401エラーを返す', async () => { + const res = await request(app).post('/api/auth/login').send({ email: 'none@example.com', password: 'pass123' }); + expect(res.status).toBe(401); + expect(res.body.error).toBe('invalid credentials'); // 存在を推測させない + }); + + // エッジケース(30%) + it('255文字のemailで正常処理', async () => { + const longEmail = 'a'.repeat(243) + '@example.com'; // 255文字 + // テストコード + }); + + it('256文字のemailで400エラー', async () => { + const tooLongEmail = 'a'.repeat(244) + '@example.com'; // 256文字 + // テストコード + }); + + // 正常系(20%) + it('有効な認証情報で200とJWTを返す', async () => { + const res = await request(app).post('/api/auth/login').send({ email: 'user@example.com', password: 'validpass' }); + expect(res.status).toBe(200); + expect(res.body.token).toBeDefined(); + }); +}); +``` + +**テスト実行**: +```bash +npm test +# または +pytest tests/ +``` + +**確認**: 全テストが失敗することを確認(Red状態) + +### 3. Green: テストを通す最小実装 + +**原則**: +- テストを通すための最小限のコードのみ +- セキュリティ考慮事項を必ず遵守 +- 重複や冗長性は後のRefactorで対処 + +**実装順序**: +1. **異常系から実装** - エラーハンドリングを先に確立 +2. エッジケース対応 +3. 正常系実装 + +**例**(ユーザー認証APIの場合): +```typescript +// Step 1: 異常系実装 +app.post('/api/auth/login', async (req, res) => { + const { email, password } = req.body; + + // バリデーション(異常系) + if (!email || email === '') { + return res.status(400).json({ error: 'email is required' }); + } + + if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { + return res.status(400).json({ error: 'invalid email format' }); + } + + if (email.length > 255) { + return res.status(400).json({ error: 'email too long' }); + } + + if (!password || password.length < 8) { + return res.status(400).json({ error: 'password must be at least 8 characters' }); + } + + // Step 2: DB接続エラー処理 + let user; + try { + user = await db.query('SELECT * FROM users WHERE email = $1', [email]); + } catch (err) { + return res.status(503).json({ error: 'service temporarily unavailable' }); + } + + // Step 3: 認証失敗(存在チェック+パスワード検証を統一メッセージで) + if (!user || !(await bcrypt.compare(password, user.password_hash))) { + return res.status(401).json({ error: 'invalid credentials' }); + } + + // Step 4: 正常系 + const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET, { expiresIn: '24h' }); + return res.status(200).json({ token, userId: user.id }); +}); +``` + +**セキュリティチェック**: +- [ ] パスワードは平文ログ出力していない +- [ ] SQLインジェクション対策(prepared statement使用) +- [ ] XSS対策(ユーザー入力をエスケープ) +- [ ] エラーメッセージで内部実装を露出していない + +**テスト実行**: +```bash +npm test +# 全テストが通過することを確認(Green状態) +``` + +### 4. Refactor: コード改善 + +**テストがGreenの状態でのみ実行** + +改善ポイント: +- 重複除去 +- 関数抽出(バリデーションロジック等) +- 可読性向上 +- パフォーマンス最適化 + +**例**: +```typescript +// バリデーションを関数化 +const validateLoginRequest = (email: string, password: string): string | null => { + if (!email || email === '') return 'email is required'; + if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) return 'invalid email format'; + if (email.length > 255) return 'email too long'; + if (!password || password.length < 8) return 'password must be at least 8 characters'; + return null; +}; + +app.post('/api/auth/login', async (req, res) => { + const { email, password } = req.body; + + const validationError = validateLoginRequest(email, password); + if (validationError) { + return res.status(400).json({ error: validationError }); + } + + // ... 残りの実装 +}); +``` + +**各Refactor後にテスト実行**: +```bash +npm test +# Greenを維持していることを確認 +``` + +### 5. 記録と状態更新 + +**TDDログ記録**: +```bash +cat >> tasks/pbi-{id}/tests/tdd-log.md <> tasks/pbi-{id}/done-{category}-{N}.md </dev/null | cut -d' ' -f2) + echo "$pbi: $phase" +done + +# リファインメントグループ進捗確認 +for pbi in tasks/pbi-*; do + if [ -f "$pbi/.refine-progress.json" ]; then + current_group=$(jq -r '.current_group' "$pbi/.refine-progress.json") + echo "$pbi: Group $current_group/3" + fi +done + +# カテゴリ別タスクカウント(全PBI) +for category in setup models services ui tests; do + total=$(find tasks -name "*-$category-*.md" | wc -l) + done=$(find tasks -name "done-$category-*.md" | wc -l) + wip=$(find tasks -name "wip-$category-*.md" | wc -l) + todo=$(find tasks -name "todo-$category-*.md" | wc -l) + echo "$category: $done/$total 完了, $wip実行中, $todo未着手" +done + +# 依存関係とブロック状況 +for pbi in tasks/pbi-*; do + blocked=0 + for todo_file in "$pbi"/todo-*.md; do + if [ -f "$todo_file" ]; then + depends=$(grep "depends_on:" "$todo_file" | cut -d: -f2) + for dep in $depends; do + if [ ! -f "$pbi/done-$dep.md" ]; then + ((blocked++)) + break + fi + done + fi + done + echo "$(basename $pbi): $blocked タスクがブロック中" +done + +# ベロシティと期間計算 +total_completed_tasks=$(find tasks -name "done-*.md" | wc -l) +first_task_date=$(find tasks -name "done-*.md" -exec grep "completed:" {} \; | head -1 | cut -d' ' -f2) +current_date=$(date -u +%Y-%m-%dT%H:%M:%SZ) +# 期間計算とベロシティ算出のロジック + +# 推定完了日計算 +for pbi in tasks/pbi-*; do + remaining_tasks=$(find "$pbi" -name "todo-*.md" -o -name "wip-*.md" | wc -l) + if [ $remaining_tasks -gt 0 ]; then + estimated_days=$((remaining_tasks / velocity)) + estimated_completion=$(date -d "+$estimated_days days" +%Y-%m-%d) + echo "$(basename $pbi): 推定完了 $estimated_completion" + fi +done + +# フェーズ別統計 +grep "^phase:" tasks/pbi-*/README.md | cut -d: -f3 | sort | uniq -c +``` + +## 状態アイコンの定義 + +### PBIレベル +- ✅ **完了**: 全タスク完了、フェーズcompleted +- ⏳ **実行中**: wipタスクあり、フェーズcompleted +- 🔄 **進行中**: doneタスクあり、フェーズcompleted +- 📝 **リファインメント中**: Group 1-3実行中 +- ⬜ **未着手**: リファインメント未開始 + +### タスクレベル +- ✅ **完了**: done-{category}-N.md +- ⏳ **実行中**: wip-{category}-N.md +- 🚧 **ブロック中**: todo状態だが依存タスク未完了 +- ⬜ **未着手**: todo-{category}-N.md + +### カテゴリレベル +- ✅ **完了**: カテゴリ内全タスク完了 +- 🔄 **進行中**: 一部タスク完了、一部実行中 +- ⏳ **待機中**: 依存関係によりブロック +- ⬜ **未開始**: カテゴリ内全タスクがtodo + +## データ集計項目 + +### PBIレベル集計 +- **フェーズ別分布**: completed/in-progress/planning/未開始 +- **リファインメント進捗**: Group完了状況 (Group 1-3) +- **実装進捗**: タスク完了率(実装フェーズのPBIのみ) +- **期間統計**: 平均実装期間、リファインメント期間 + +### カテゴリレベル集計 +- **カテゴリ別進捗**: Setup/Models/Services/UI/Tests毎の完了率 +- **依存関係**: ブロックされているタスク数、解放待ちタスク数 +- **並行度**: 同時実行可能なカテゴリとタスク数 +- **ボトルネック**: 進捗阻害要因となっているカテゴリ + +### パフォーマンス指標 +- **ベロシティ**: タスク完了速度(タスク/日) +- **スループット**: PBI完了速度(PBI/週) +- **サイクルタイム**: リファインメント〜完了までの期間 +- **品質指標**: 手戻り発生率、再リファインメント率 + +### 予測・最適化 +- **完了予測**: 残りタスクの推定完了日 +- **並行実行提案**: 依存関係を考慮した最適実行順序 +- **リソース配分**: カテゴリ別の作業負荷分散提案 +- **ボトルネック解消**: 進捗改善のための優先アクション + +## エラーハンドリング + +- tasksディレクトリが存在しない場合の案内 +- PBIディレクトリは存在するがREADME.mdがない場合の警告 +- タスクファイルの形式が不正な場合の警告表示 +- 引数が無効な場合の使用方法表示 + +## 推奨アクションの提案 + +### 即座実行可能アクション +- **高優先度タスク**: 依存関係なし、ブロックなしの重要タスク +- **並行実行**: 異なるカテゴリの独立タスク +- **ボトルネック解消**: 他タスクのブロック要因となっているタスク + +### フェーズ別推奨アクション +- **完了済みPBI**: 🎉 完了祝福、新PBI計画提案 +- **実装中PBI**: 次タスク実行、並行作業検討 +- **リファインメント中PBI**: Group続行、一時停止オプション +- **未開始PBI**: リファインメント開始提案 + +### 最適化提案 +- **スケジュール最適化**: 依存関係を考慮した実行順序調整 +- **リソース配分**: カテゴリ間の作業負荷バランス調整 +- **並行度向上**: 独立実行可能なタスクの特定と提案 +- **品質向上**: リファインメント品質改善、手戻り防止策 + +### 戦略的提案 +- **容量計画**: 新PBI追加のタイミングと優先度 +- **技術債務**: リファクタリングタスクの計画的実行 +- **スキル開発**: カテゴリ別の習熟度向上計画 +- **プロセス改善**: リファインメント効率化、ベロシティ向上 + +## 完了条件 + +### 基本表示要件 +- フェーズ別PBI分類が適切に表示されている +- カテゴリ別タスク進捗が正確に表示されている +- リファインメントグループ進捗が表示されている +- 依存関係とブロック状況が明確に示されている + +### データ精度要件 +- 全体進捗率が正確に計算・表示されている +- カテゴリ別進捗率が正確に算出されている +- ベロシティと完了予測が適切に計算されている +- ボトルネック分析が正確に実行されている + +### ユーザビリティ要件 +- 状態アイコンが統一され理解しやすい +- 重要情報が視覚的に強調されている +- 次のアクションが具体的で実行可能 +- フィルター機能が適切に動作している + +### 戦略的価値要件 +- プロジェクト全体の健全性が把握できる +- 意思決定に必要な情報が提供されている +- 最適化機会が明確に提示されている +- 将来予測が実用的なレベルで提供されている + +実行を開始しますか? \ No newline at end of file diff --git a/commands/task-next.md b/commands/task-next.md new file mode 100644 index 0000000..f59121e --- /dev/null +++ b/commands/task-next.md @@ -0,0 +1,245 @@ +--- +description: 次に実行すべきタスクを取得して実行する +argument-hint: [issue_number] [--category=CAT] [--priority=high|medium|low] +allowed-tools: Bash, Read, Write, Edit, MultiEdit, Glob, Grep +--- + +# 次タスクの選択と実行 + +指定されたPBI($1が指定された場合)または全PBIから次に実行すべきタスクを選択し、実行します。 + +## 実行オプション + +```bash +/task-next # 全PBIから最適なタスクを選択 +/task-next 123 # PBI #123から次タスクを選択 +/task-next 123 --category=setup # 特定カテゴリのタスクを優先 +/task-next --priority=high # 高優先度タスクのみ検索 +``` + +## 実行内容 + +### 1. 次タスクの特定(カテゴリ・優先度考慮) + +**PBI指定時($1が存在):** +- `tasks/pbi-$1/` ディレクトリ内の `todo-*.md` ファイルを検索 +- カテゴリ別ファイル命名規則: `todo-{category}-{number}.md` +- 優先度とカテゴリ依存関係を考慮してタスク選択 + +**全PBI検索時(引数なし):** +- `tasks/` 配下のすべての `pbi-*` ディレクトリを検索 +- カテゴリ依存関係による実行可能タスクをフィルタリング +- 優先度・作成日時・ブロック状況を総合評価 + +**カテゴリ依存関係**: +``` +Setup → Models → Services → UI → Tests + ↓ ↓ ↓ ↓ ↓ +基盤 データ層 API層 UI層 品質保証 +``` + +### 2. 詳細タスク情報の表示 + +選択されたタスクの内容を表示: +``` +【次のタスク】 +PBI: # +カテゴリ: (Setup/Models/Services/UI/Tests) +優先度: (High/Medium/Low) +推定時間: 時間 +タスク: +ファイル: + +=== 前提条件 === +✅ 完了済み依存タスク: +⚠️ 未完了依存タスク: + +=== タスク詳細 === + + +=== リファインメント情報 === +関連する要件: +技術仕様: +``` + +### 3. 実行確認と開始処理 + +**依存関係チェック**: +- 前提タスクの完了状況確認 +- ブロック状況があれば警告表示 +- 実行可能性の判定 + +**ユーザー確認**: +- 実行確認とブロック解除オプション提示 +- 確認後、以下の処理を実行: + 1. `todo-{category}-N.md` → `wip-{category}-N.md` にリネーム + 2. YAMLフロントマターの `started` フィールドを現在時刻で更新 + 3. 作業開始をユーザーに通知 + +### 4. 実装作業のガイド(カテゴリ別) + +**Setup系タスク**: +- 環境構築、依存関係インストール +- 設定ファイル作成、初期構造構築 +- 他のカテゴリの前提条件を満たす + +**Models系タスク**: +- データモデル・スキーマ定義 +- データベース migration作成 +- ORM/モデルクラス実装 + +**Services系タスク**: +- ビジネスロジック実装 +- API エンドポイント作成 +- 外部サービス連携 + +**UI系タスク**: +- コンポーネント実装 +- 画面・フォーム作成 +- ユーザーインタラクション + +**Tests系タスク**: +- 単体テスト・統合テスト +- E2Eテスト実装 +- テストデータ準備 + +### 5. 完了処理とカテゴリ連携 + +**状態更新**: +1. `wip-{category}-N.md` → `done-{category}-N.md` にリネーム +2. YAMLフロントマターの `completed` フィールドを現在時刻で更新 +3. 親PBIの `README.md` のカテゴリ別タスク一覧を更新 + +**次タスクの解放**: +- 依存関係チェーンの確認 +- ブロックされていたタスクの実行可能化 +- 次の実行可能タスクの通知 + +**GitHub Issue連携**: +- カテゴリ付きタスク完了コメント投稿 +- 進捗状況の更新(カテゴリ別進捗含む) + +### 6. 進捗状況とカテゴリ分析 + +**PBI進捗の詳細表示**: +``` +【PBI #123 進捗状況】 +全体: 3/8 タスク完了 (37.5%) + +カテゴリ別進捗: +✅ Setup: 1/1 完了 (100%) +🔄 Models: 1/2 進行中 (50%) +⏳ Services: 0/2 待機中 (Models完了待ち) +⬜ UI: 0/2 未開始 +⬜ Tests: 0/1 未開始 + +次に実行可能: +- Models残り1タスク (高優先度) +``` + +**全体最適化提案**: +- 並行実行可能タスクの提案 +- ボトルネックとなっているカテゴリの特定 +- 実装順序の最適化提案 + +## 利用可能な検索・操作コマンド + +```bash +# PBI一覧の取得 +find tasks -name "pbi-*" -type d | sort + +# カテゴリ別タスク検索 +find tasks/pbi-$1 -name "todo-setup-*.md" # Setup系タスク +find tasks/pbi-$1 -name "todo-models-*.md" # Models系タスク +find tasks/pbi-$1 -name "todo-services-*.md" # Services系タスク +find tasks/pbi-$1 -name "todo-ui-*.md" # UI系タスク +find tasks/pbi-$1 -name "todo-tests-*.md" # Tests系タスク + +# 優先度別検索 +grep "priority: high" tasks/pbi-$1/todo-*.md +grep "priority: medium" tasks/pbi-$1/todo-*.md + +# 依存関係確認 +grep "depends_on:" tasks/pbi-$1/todo-*.md + +# タスクファイルの状態変更(カテゴリ保持) +mv tasks/pbi-$1/todo-setup-1.md tasks/pbi-$1/wip-setup-1.md +mv tasks/pbi-$1/wip-setup-1.md tasks/pbi-$1/done-setup-1.md + +# 進捗状況の取得 +find tasks/pbi-$1 -name "done-*.md" | wc -l # 完了タスク数 +find tasks/pbi-$1 -name "wip-*.md" | wc -l # 実行中タスク数 +find tasks/pbi-$1 -name "todo-*.md" | wc -l # 未着手タスク数 + +# カテゴリ別進捗確認 +find tasks/pbi-$1 -name "done-setup-*.md" | wc -l +find tasks/pbi-$1 -name "*-models-*.md" | wc -l + +# GitHub Issueへのカテゴリ付きコメント投稿 +gh issue comment $1 --body "✅ [Setup] タスク完了: " +``` + +## カテゴリ依存関係の管理 + +```bash +# 依存関係チェック関数例 +check_dependencies() { + local task_file="$1" + local depends_on=$(grep "depends_on:" "$task_file" | cut -d: -f2) + + for dep in $depends_on; do + if [ ! -f "tasks/pbi-$1/done-$dep.md" ]; then + echo "❌ 依存タスク未完了: $dep" + return 1 + fi + done + return 0 +} + +# 次実行可能タスクの特定 +find_executable_tasks() { + for todo_file in tasks/pbi-$1/todo-*.md; do + if check_dependencies "$todo_file"; then + echo "$todo_file" + fi + done +} +``` + +## エラーハンドリング + +### 基本エラー処理 +- 指定されたPBIが存在しない場合の適切なエラー +- 実行可能なタスクが見つからない場合の案内 +- GitHub CLI未認証時のエラー処理 +- ファイル操作失敗時のロールバック + +### カテゴリ特有のエラー処理 +- 依存関係未満足時の詳細説明 +- カテゴリ間の循環依存検出 +- 優先度指定時の該当タスクなしエラー +- 推定時間超過時の警告 + +### 復旧支援機能 +- 中断されたwipタスクの復旧提案 +- 依存関係エラー時の解決パス提示 +- カテゴリ順序の修正提案 + +## 完了条件 + +### 基本完了条件 +- 次タスクが正常に特定・表示されている +- カテゴリと優先度が適切に考慮されている +- 依存関係チェックが正常に機能している + +### 状態管理の完了条件 +- タスク状態が適切に更新されている(todo→wip→done) +- カテゴリ情報がファイル名に保持されている +- 依存関係の解放が正常に実行されている + +### 進捗管理の完了条件 +- PBI進捗状況が正確に表示されている(カテゴリ別含む) +- GitHub Issueに適切なコメントが投稿されている +- 次の実行可能タスクが適切に提案されている + +実行を開始しますか? \ No newline at end of file diff --git a/commands/task-refine.md b/commands/task-refine.md new file mode 100644 index 0000000..45bc10a --- /dev/null +++ b/commands/task-refine.md @@ -0,0 +1,286 @@ +--- +description: GitHub IssueをProduct Backlog Item(PBI)としてリファインメントし、実装可能なタスクに分解する +argument-hint: [--group=N] [--from=groupN] [--edit=groupN] +allowed-tools: Bash, Read, Write, Edit, Glob +--- + +# GitHub Issue リファインメント・タスク分解 + +指定されたGitHub Issue #$1 をマイクロステップの対話を通じて、具体的な実装タスクに分解します。 + +## 実行モード + +### 基本実行 +```bash +/task-refine 123 # 全グループを順次実行 +/task-refine 123 --group=1 # Group 1のみ実行 +/task-refine 123 --from=group2 # Group 2から再開 +/task-refine 123 --edit=group1 # Group 1のみ修正 +``` + +## 3段階グループ構成 + +### Group 1: 要件・制約の確定 (5-8分) +**目的**: 何を作るかを明確化 + +**ステップ構成**: +- Step 1: 認証・処理方式の選択 +- Step 2: 機能範囲の決定 +- Step 3: セキュリティレベルの設定 +- Step 4: 非機能要件の確認 + +**出力**: 機能要件と制約の確定 + +### Group 2: 技術・アーキテクチャ設計 (8-12分) +**目的**: どう実装するかを技術的に決定 + +**ステップ構成**: +- Step 5: 技術スタックの選択 +- Step 6: データ設計・モデル構造 +- Step 7: API設計・インターフェース +- Step 8: UI/UX設計方針 + +**前提条件**: Group 1の完了が必要 +**出力**: 技術仕様と設計方針の確定 + +### Group 3: 実装・タスク構成 (5-8分) +**目的**: 具体的な作業手順に分解 + +**ステップ構成**: +- Step 9: タスク分解粒度の決定 +- Step 10: 実装優先順位の設定 +- Step 11: 依存関係の整理 +- Step 12: 最終タスクリストの確認 + +**前提条件**: Group 1, 2の完了が必要 +**出力**: 実装可能なタスクリスト + +## 実行フロー + +### 1. Issue分析と進行状況確認 +```bash +# GitHub CLI でIssue情報取得 +gh issue view $1 --json title,body,url + +# 既存の進行状況確認 +if [ -f "tasks/pbi-$1/.refine-progress.json" ]; then + # 前回の続きから再開オプション表示 +fi +``` + +### 2. グループ別実行制御 + +#### Group 1実行例: +``` +=== Group 1: 要件・制約の確定 === +Progress: ▓▓▓░░░░░░░ (3/10 steps) + +Step 1/4: 認証・処理方式 +GitHub Issue #$1から検出キーワード: [動的表示] + +Q: 主要な処理方式を選択してください +1. 認証系 (ログイン、権限管理) +2. データ処理系 (CRUD、検索、集計) +3. UI/UX系 (画面、コンポーネント) +4. 統合系 (API連携、外部サービス) +5. その他 + +選択: 1 + +Step 2/4: 機能範囲 +認証系機能として、実装する機能を選択してください (複数選択可): +1. ユーザーログイン +2. ユーザー登録 +3. パスワードリセット +4. 権限・ロール管理 +5. プロフィール管理 +6. セッション管理 + +選択: 1,2,3 + +Step 3/4: セキュリティレベル +選択した機能 (ログイン、登録、リセット) に対するセキュリティレベル: +1. 基本 (パスワード暗号化、基本バリデーション) +2. 強化 (2FA、IP制限、監査ログ) +3. 最小限 (暗号化のみ) + +選択: 1 + +Step 4/4: 非機能要件 +Q: 想定される利用規模は? +1. 小規模 (~100ユーザー) +2. 中規模 (~1,000ユーザー) +3. 大規模 (1,000ユーザー+) + +選択: 2 + +✅ Group 1完了: 要件・制約が確定 + +【確定内容】 +- 処理分野: 認証系 +- 機能: ログイン、登録、パスワードリセット +- セキュリティ: 基本レベル +- 規模: 中規模対応 + +次のアクション: +1. Group 2に進む (技術・アーキテクチャ設計) +2. 後で続行 (進捗保存) +3. Group 1を修正 + +選択: 1 +``` + +### 3. 進捗管理と状態保存 + +**.refine-progress.json 形式**: +```json +{ + "issue": "$1", + "started": "2024-01-01T10:00:00Z", + "current_group": 2, + "completed_groups": [ + { + "group": 1, + "completed_at": "2024-01-01T10:08:00Z", + "decisions": { + "processing_type": "authentication", + "features": ["login", "registration", "password_reset"], + "security_level": "basic", + "scale": "medium" + } + } + ], + "current_step": 6, + "session_data": { + "tech_stack_proposal": "node_express", + "database_preference": "postgresql" + } +} +``` + +### 4. 最終ファイル生成 + +#### 拡張されたREADME.md形式: +```yaml +--- +issue: $1 +title: +url: +phase: completed +refinement_completed: +created: +updated: +--- + +# PBI #$1 + +## リファインメント履歴 + +### Group 1: 要件・制約確定 ✅ +- 処理分野: 認証系 +- 機能範囲: ログイン、登録、パスワードリセット +- セキュリティ: 基本レベル (暗号化、バリデーション) +- 規模: 中規模対応 (~1,000ユーザー) + +### Group 2: 技術・アーキテクチャ設計 ✅ +- バックエンド: Node.js + Express + PostgreSQL +- フロントエンド: React + TypeScript (既存環境) +- 認証方式: JWT (24時間有効期限) +- API: RESTful 4エンドポイント + +### Group 3: 実装・タスク構成 ✅ +- タスク数: 8個 +- カテゴリ: Setup(1), Models(2), Services(2), UI(2), Tests(1) +- 実装期間: 5-8日 (1日1-2タスク想定) + +## タスク一覧 (カテゴリ別) + +### Setup +- [ ] プロジェクト環境構築 (todo-setup-1.md) + +### Models +- [ ] User model実装 (todo-models-1.md) +- [ ] 認証関連テーブル設計 (todo-models-2.md) + +### Services +- [ ] 認証API実装 (todo-services-1.md) +- [ ] パスワードリセット機能 (todo-services-2.md) + +### UI +- [ ] ログインフォーム実装 (todo-ui-1.md) +- [ ] 登録フォーム実装 (todo-ui-2.md) + +### Tests +- [ ] 認証機能テスト (todo-tests-1.md) + +## 要件トレーサビリティ +- ログイン機能 → setup-1, models-1, services-1, ui-1, tests-1 +- 登録機能 → models-1, services-1, ui-2, tests-1 +- リセット機能 → models-2, services-2, tests-1 +``` + +#### カテゴリ別タスクファイル形式: +```yaml +--- +parent: $1 +category: setup +priority: high +estimated_hours: 4 +created: +started: null +completed: null +--- + +# プロジェクト環境構築 + +## やること +Node.js + Express + PostgreSQL の認証プロジェクト環境を構築する + +## 成功条件 +- [ ] package.json作成 (express, jwt, bcrypt, pg依存関係) +- [ ] PostgreSQL接続設定完了 +- [ ] 基本的なサーバー起動確認 +- [ ] 環境変数設定 (.env.example作成) + +## 技術仕様 +- Node.js: v18+ +- Express: v4.x +- PostgreSQL: v14+ +- JWT: jsonwebtoken +- 暗号化: bcrypt + +## 制約 +- 環境変数でDB接続情報管理 +- セキュリティ設定は本番想定 +- 既存Reactプロジェクトとの統合考慮 + +## 実装メモ +(作業中に追記) +``` + +## エラーハンドリング + +### 実行前チェック +- GitHub CLI認証状態確認 +- Issue存在確認 +- tasksディレクトリアクセス権確認 + +### 進行中のエラー処理 +- 不正な選択肢入力時の再プロンプト +- ネットワークエラー時の状態保存 +- 強制終了時の進捗復旧 + +### グループ間整合性チェック +- Group 2開始時にGroup 1決定事項の参照 +- Group 3開始時にGroup 1, 2決定事項の参照 +- 矛盾検出時の修正提案 + +## 完了条件 + +- 全3グループが正常完了している +- `tasks/pbi-$1/README.md` にリファインメント履歴が記録されている +- カテゴリ別のタスクファイルが適切に生成されている +- 各タスクが実装可能なレベルまで詳細化されている +- 要件トレーサビリティが確立されている + +実行を開始しますか? \ No newline at end of file diff --git a/commands/task-spec.md b/commands/task-spec.md new file mode 100644 index 0000000..1817614 --- /dev/null +++ b/commands/task-spec.md @@ -0,0 +1,475 @@ +--- +description: プロンプトベースで対話的に仕様を策定し、TDD前提のタスクに分解する(ネガティブチェック・認知バイアス除去含む) +argument-hint: "<要望内容>" [--id=custom-id] +allowed-tools: Bash, Read, Write, Edit, Glob, AskUserQuestion +--- + +# プロンプトベース仕様策定・タスク分解 + +プロンプトで記述された要望を、対話を通じて**網羅的な仕様**(正常系・異常系・エッジケース)に昇華し、TDD前提の実装タスクに分解します。 + +## 実行モード + +```bash +/task-spec "ユーザー認証機能を実装したい" +/task-spec "データ検索APIを作りたい" --id=search-api +``` + +## 実行フロー + +### Phase 1: 網羅的仕様策定(20-30分) + +#### Step 1: 要望分析 +```bash +# ユーザープロンプト解析 +- キーワード抽出(認証、API、UI、データ処理など) +- 既存コードベースとの関連確認 +- 初期スコープ推定 +``` + +#### Step 2: ポジティブ仕様の明確化(5-8分) + +対話形式で以下を確定: + +``` +=== Step 2: ポジティブ仕様の明確化 === + +Q1: 入力は何ですか? + (例: ユーザーID、メールアドレス、JSONペイロード) + +Q2: 期待される出力は何ですか? + (例: 認証トークン、ユーザー情報、HTTPステータス) + +Q3: 成功の条件を具体的に教えてください + (例: 「有効な認証情報で200 + JWT返却」) + +Q4: 制約や前提条件はありますか? + (例: PostgreSQL使用、既存API互換性必須) +``` + +#### Step 3: ネガティブチェック(認知バイアス除去)(10-15分) + +##### 3-1. 失敗シナリオ分析 + +``` +=== Step 3-1: 失敗シナリオ分析 === +Progress: ▓▓▓▓░░░░░░ (4/10) + +確証バイアスを排除するため、「どこで壊れるか」を先に考えます。 + +Q: この機能が失敗する可能性があるケースを選択してください(複数選択可) + +1. 入力が不正(型違い、範囲外、フォーマット不正) +2. 依存リソースが存在しない(ファイル、DB、API) +3. 権限不足・認証失敗 +4. タイムアウト・ネットワークエラー +5. リソース枯渇(メモリ、ディスク、CPU) +6. 並行実行による競合 +7. その他(自由記述) + +選択: 1,2,3 + +→ 選択された各ケースについて詳細を質問 +``` + +##### 3-2. エッジケース網羅 + +``` +=== Step 3-2: エッジケース網羅 === + +正常系偏重を避けるため、境界値での振る舞いを確認します。 + +以下のケースで期待される動作を確認してください(該当するものにチェック): + +□ 空文字列 / 空配列 / 空オブジェクト + → どう処理すべきですか? (1. エラー / 2. デフォルト値 / 3. そのまま通す) + +□ null / undefined / NaN + → どう処理すべきですか? (1. エラー / 2. 無視 / 3. デフォルト値) + +□ 最小値・最大値(数値、文字数、配列長) + → 境界値は? (例: 0-255文字、1-100件) + +□ 0, -1, Infinity + → 許可しますか? 許可する場合の意味は? + +□ 特殊文字(<>"'&;など) + → エスケープ必要? どのレベルで? + +□ 非ASCII文字(絵文字、全角、Unicode) + → サポートしますか? 制限は? + +□ 巨大なデータ(1MB超の文字列、10万件の配列) + → 制限値は? 超えた場合の処理は? +``` + +##### 3-3. セキュリティリスク分析 + +``` +=== Step 3-3: セキュリティリスク分析 === + +楽観バイアスを排除し、攻撃シナリオを想定します。 + +該当する脅威を選択してください(複数選択可): + +1. XSS(クロスサイトスクリプティング) + - ユーザー入力を画面表示する箇所がある + +2. SQLインジェクション + - SQL文を動的生成している + +3. CSRF(クロスサイトリクエストフォージェリ) + - 状態変更操作(POST/PUT/DELETE)がある + +4. 権限昇格 + - 他ユーザーのデータにアクセスする可能性 + +5. DoS(サービス拒否) + - 大量リクエストで停止する可能性 + +6. 情報漏洩 + - エラーメッセージに秘密情報が含まれる可能性 + +選択: 1,3,4 + +→ 各脅威に対する対策を質問 +``` + +##### 3-4. 認知バイアスチェック + +``` +=== Step 3-4: 認知バイアスチェック === + +以下のバイアスを意識的に排除したか確認します: + +✓ 確証バイアス + 「うまくいくはず」ではなく「どこで壊れるか」を先に考えた + +✓ 正常系偏重 + 正常系:異常系 = 1:3 の比率でテストケースを設計した + +✓ 楽観バイアス + 「たぶん大丈夫」を「証明されるまで信用しない」に変換した + +✓ 可用性バイアス + 「よくあるケース」だけでなく「レアだが致命的なケース」も網羅した + +全てチェック完了後、次へ進みます。 +``` + +#### Step 4: 失敗するテスト生成(5分) + +``` +=== Step 4: 失敗するテスト生成 === + +確定した仕様から、Red状態のテストコードを自動生成します。 + +テスト比率: +- 正常系テスト(20%): 2件 +- 異常系テスト(50%): 5件 +- エッジケーステスト(30%): 3件 + +合計: 10件のテストケース + +生成されたテストは tasks/pbi-{id}/tests/ に保存されます。 +``` + +### Phase 2: タスク分解(既存Group 1-3 + ネガティブレビュー) + +#### Group 1: 要件・制約の確定(5-8分) +- 処理方式の選択 +- 機能範囲の決定 +- セキュリティレベルの設定 +- 非機能要件の確認 + +#### **Group 1.5: ネガティブケース・レビュー(5分)** +``` +=== Group 1.5: ネガティブケース・レビュー === + +Phase 1で抽出したネガティブケースを確認します: + +【失敗シナリオ】 +1. 入力不正(空文字列、型違い) - Priority: High +2. DB接続失敗 - Priority: Critical +3. 権限不足 - Priority: High + +【エッジケース】 +1. 最大長超過(255文字) - Priority: Medium +2. 特殊文字(XSSペイロード) - Priority: Critical +3. 並行実行 - Priority: Low + +Q: 追加で考慮すべき失敗シナリオはありますか? +(あれば記述、なければEnter) + +→ ユーザー入力を反映してspecs.mdを更新 +``` + +#### Group 2: 技術・アーキテクチャ設計(8-12分) +- 技術スタックの選択 +- データ設計・モデル構造 +- API設計・インターフェース +- UI/UX設計方針 + +#### Group 3: 実装・タスク構成(5-8分) +- タスク分解粒度の決定(ネガティブケース考慮) +- 実装優先順位の設定 +- 依存関係の整理 +- 最終タスクリストの確認 + +## 生成されるファイル構造 + +``` +tasks/pbi-{timestamp or custom-id}/ +├── specs.md # 網羅的仕様書(正常系+異常系+エッジケース) +├── tests/ +│ ├── spec-test-positive-1.md # 正常系テスト(Red状態) +│ ├── spec-test-negative-1.md # 異常系テスト(Red状態) +│ ├── spec-test-edge-1.md # エッジケーステスト(Red状態) +│ └── tdd-log.md # Red→Green遷移記録 +├── README.md # リファインメント履歴・タスク一覧 +├── todo-{category}-N.md # 実装タスク(ネガティブケース含む) +└── .refine-progress.json # 進捗管理 +``` + +### specs.md フォーマット + +```markdown +--- +created: 2024-01-01T10:00:00Z +updated: 2024-01-01T10:30:00Z +status: confirmed +coverage_score: 85 # ネガティブチェック網羅率 +--- + +# 仕様: ユーザー認証機能 + +## 要望(オリジナルプロンプト) +ユーザー認証機能を実装したい + +## 確定した仕様 + +### 機能概要 +メールアドレスとパスワードでユーザー認証を行い、JWTトークンを返却する + +### 入力 +- email: string(必須、メール形式、最大255文字) +- password: string(必須、最小8文字、最大128文字) + +### 出力 +- 成功時: 200 OK + { token: string, userId: string } +- 失敗時: 適切なHTTPステータス + エラーメッセージ + +### 制約 +- JWT有効期限: 24時間 +- パスワードハッシュ: bcrypt +- データベース: PostgreSQL + +### 成功条件(正常系) +- [ ] 有効な認証情報で200 + JWT返却 +- [ ] トークンでユーザー情報取得可能 + +## ネガティブケース分析 + +### 失敗シナリオ + +#### 入力不正 +- [ ] 空文字列のemail → 400 + "email is required" +- [ ] 無効なメール形式 → 400 + "invalid email format" +- [ ] パスワード7文字 → 400 + "password must be at least 8 characters" +- [ ] 型違い(数値) → 400 + "email must be a string" + +#### 依存リソース欠如 +- [ ] DB接続失敗 → 503 + "service temporarily unavailable" + リトライ +- [ ] DBクエリタイムアウト → 504 + "gateway timeout" + +#### 権限・認証 +- [ ] 存在しないユーザー → 401 + "invalid credentials" +- [ ] パスワード不一致 → 401 + "invalid credentials" +- [ ] アカウント無効化済み → 403 + "account disabled" +- [ ] ログイン試行回数超過 → 429 + "too many attempts" + +#### 並行実行 +- [ ] 同一ユーザーの多重ログイン → 許可(トークン複数発行) + +### エッジケース + +| ケース | 入力例 | 期待される振る舞い | +|--------|--------|-------------------| +| 空文字列 | `email=""` | 400 + ValidationError | +| null | `email=null` | 400 + ValidationError | +| 最大長 | 256文字のemail | 400 + "email too long" | +| 最大長境界 | 255文字のemail | 正常処理 | +| 特殊文字 | `email="