@einja/dev-cli 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/lib/file-system.js +1 -1
  2. package/dist/lib/file-system.js.map +1 -1
  3. package/package.json +1 -2
  4. package/scaffolds/cli/preset.yaml +110 -0
  5. package/scaffolds/example/README.md +35 -0
  6. package/scaffolds/example/specs/issues/issue999-example-task/design.md +879 -0
  7. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/README.md +150 -0
  8. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-1.md +268 -0
  9. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-2.md +179 -0
  10. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-3.md +392 -0
  11. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/evidence/.gitkeep +0 -0
  12. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/2-1.md +459 -0
  13. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/evidence/.gitkeep +0 -0
  14. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/scenarios.md +125 -0
  15. package/scaffolds/example/specs/issues/issue999-example-task/requirements.md +494 -0
  16. package/scaffolds/example/specs/issues/issue999-example-task/tasks.md +212 -0
  17. package/scaffolds/instructions/deployment-setup.md +458 -0
  18. package/scaffolds/instructions/environment-setup.md +509 -0
  19. package/scaffolds/instructions/local-server-environment-and-worktree.md +539 -0
  20. package/scaffolds/instructions/task-execute.md +649 -0
  21. package/scaffolds/instructions/task-vibe-kanban-loop.md +495 -0
  22. package/scaffolds/memory/archive/.gitkeep +0 -0
  23. package/scaffolds/memory/decisions.md +35 -0
  24. package/scaffolds/memory/patterns.md +37 -0
  25. package/scaffolds/CLAUDE.md.template +0 -386
  26. /package/{templates → scaffolds/templates}/README.md +0 -0
  27. /package/{templates → scaffolds/templates}/design-simple.md.template +0 -0
  28. /package/{templates → scaffolds/templates}/design.md.template +0 -0
  29. /package/{templates → scaffolds/templates}/qa-test.md.template +0 -0
  30. /package/{templates → scaffolds/templates}/requirements.md.template +0 -0
@@ -0,0 +1,150 @@
1
+ # QAテスト結果ディレクトリ構造
2
+
3
+ ## 概要
4
+ このディレクトリは、タスク実装後のQAテスト結果を記録するためのサンプル構造です。
5
+ 実際のプロジェクトでは、タスクファイル(例:`.kiro/specs/subscription-management/tasks.md`)と同じディレクトリに`qa-tests`フォルダを作成して管理します。
6
+
7
+ ## ディレクトリ構造
8
+ ```
9
+ qa-tests/
10
+ ├── README.md # このファイル(QAテストガイド)
11
+ ├── scenarios.md # シナリオテスト仕様(必須)
12
+ ├── phase1/ # フェーズ1のテスト
13
+ │ ├── 1-1.md # タスク1.1.xのテスト結果
14
+ │ ├── 1-2.md # タスク1.2.xのテスト結果
15
+ │ ├── 1-3.md # タスク1.3.xのテスト結果
16
+ │ └── evidence/ # スクリーンショット等のエビデンス
17
+ ├── phase2/ # フェーズ2のテスト
18
+ │ ├── 2-1.md
19
+ │ └── evidence/
20
+ └── summary.md # 全体のテストサマリー(オプション)
21
+ ```
22
+
23
+ ## QAテストファイルの記載内容
24
+
25
+ 各QAテストファイル(例:`phase1/1-1.md`)には以下を記載:
26
+
27
+ 1. **ヘッダー情報**: テスト対象タスクID、タスク名、実装日、テスト実施日
28
+ 2. **各タスクのテスト内容**: 受け入れ条件(AC番号)、テストシナリオ(表形式)、全体ステータス、主な問題点、対応策、エビデンス
29
+ 3. **統合テスト結果サマリー**: フェーズ全体の結果サマリー、次フェーズへの引き継ぎ事項、改善提案
30
+ 4. **報告と対応**: 失敗原因分類、差し戻し情報、修正優先度
31
+
32
+ ## テスト結果の更新方針
33
+
34
+ - **上書き更新**: 実施結果セクションは最新の結果のみを記載。過去の履歴は保持しない(Gitで管理)。更新日時を必ず記載。
35
+ - **ステータス定義**: ✅ PASS(すべての受け入れ条件を満たす)、❌ FAIL(要修正)、⚠️ PARTIAL(軽微な問題あり)、🔄 未実施(テスト未実施)
36
+ - **エビデンスの保存**: `qa-tests/phase1/evidence/` 配下にログファイル、スクリーンショット、テストレポート等を保存。命名規則: `{タスク番号}-{内容}.{拡張子}`
37
+ - **実施タイミング**: タスク完了時(個別テスト)、フェーズ完了時(統合テスト)、リリース前(回帰テスト)
38
+
39
+ ## テストシナリオの記載形式
40
+
41
+ ### 画面操作テスト(簡潔な表形式)
42
+
43
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
44
+ |----|------|---------|--------|------|------|
45
+ | 1 | ログイン画面に移動 (http://localhost:3000/auth/login) | URLが正しい | /auth/login | - | - |
46
+ | 2 | スナップショット取得 | メールアドレス入力欄が表示される | input[data-testid="email-input"]が存在 | - | - |
47
+ | 3 | メールアドレス入力: test@example.com | - | - | - | - |
48
+ | 4 | 送信ボタンをクリック | ローディング表示される | スピナーアイコンが表示 | - | - |
49
+
50
+ **重要**:
51
+ - 手順は自然言語で簡潔に記述(例: 「ログイン画面に移動」「メールアドレス入力: test@example.com」)
52
+ - mcp__playwrightなどのコマンドは記載しない
53
+ - 「-」は手順のみで確認項目がない場合に使用
54
+ - 備考欄はテストの区切りや注意事項を記載
55
+
56
+ ### APIテスト(簡潔な表形式 + curlコマンド)
57
+
58
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
59
+ |----|------|---------|--------|------|------|
60
+ | 1 | POST /api/auth/magic-link (email: test@example.com) | ステータスコード | 200 | - | - |
61
+ | 2 | - | レスポンスボディ | {"success":true,"message":"..."} | - | - |
62
+ | 3 | - | メールが送信される | 受信トレイにメールあり | - | - |
63
+
64
+ **実行例**:
65
+ ```bash
66
+ curl -X POST http://localhost:3000/api/auth/magic-link \
67
+ -H "Content-Type: application/json" \
68
+ -d '{"email":"test@example.com"}'
69
+ ```
70
+
71
+ ### UIインタラクションテスト(表形式)
72
+
73
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
74
+ |----|------|---------|--------|------|------|
75
+ | 1 | メールアドレスフィールドをクリック | フォーカス状態 | 枠線の色が変化 | - | フィールドフォーカス |
76
+ | 2 | 空欄のまま送信ボタンをクリック | エラー表示 | 「メールアドレスを入力してください」、フィールド赤枠 | - | 空欄バリデーション |
77
+ | 3 | "test@"を入力して送信 | エラー表示 | 「有効なメールアドレスを入力してください」 | - | 形式バリデーション |
78
+ | 4 | 有効なメールアドレスで送信 | ローディング状態 | ボタン無効化、スピナー表示 | - | 正常系 |
79
+
80
+ ### 視覚的回帰テスト(表形式)
81
+
82
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
83
+ |----|------|---------|--------|------|------|
84
+ | 1 | ログイン画面を表示 | デフォルト状態 | ベースラインと一致 | - | evidence/login-default.png |
85
+ | 2 | メールフィールドにフォーカス | フォーカス状態 | ベースラインと一致 | - | evidence/login-focused.png |
86
+ | 3 | バリデーションエラーを発生させる | エラー状態 | ベースラインと一致 | - | evidence/login-error.png |
87
+
88
+ #### スクリーンショット命名規則
89
+ ```
90
+ evidence/
91
+ ├── [画面名]-[状態].png
92
+ ├── login-default.png # ログイン画面のデフォルト状態
93
+ ├── login-error.png # ログイン画面のエラー状態
94
+ ├── email-sent.png # メール送信確認画面
95
+ ├── error-expired.png # エラー画面(期限切れ)
96
+ └── ...
97
+ ```
98
+
99
+ ## テストツール使用例
100
+
101
+ ### Playwright MCP(画面テスト実行)
102
+
103
+ ```javascript
104
+ // ステップ1: navigate
105
+ mcp_playwright.navigate('http://localhost:3000')
106
+
107
+ // ステップ2: スナップショット取得
108
+ mcp_playwright.snapshot()
109
+
110
+ // ステップ3: click
111
+ mcp_playwright.click({
112
+ element: 'ログインボタン',
113
+ ref: '[data-testid="login-button"]'
114
+ })
115
+
116
+ // ステップ4: type
117
+ mcp_playwright.type({
118
+ element: 'メールアドレス入力欄',
119
+ ref: '[data-testid="email-input"]',
120
+ text: 'test@example.com'
121
+ })
122
+
123
+ // スクリーンショット取得
124
+ mcp_playwright.screenshot({
125
+ path: 'qa-tests/phase1/evidence/test.png'
126
+ })
127
+ ```
128
+
129
+ ### Bash(APIテスト実行)
130
+ ```bash
131
+ # APIエンドポイントテスト
132
+ curl -X POST http://localhost:3000/api/auth/magic-link \
133
+ -H "Content-Type: application/json" \
134
+ -d '{"email":"test@example.com"}'
135
+
136
+ # データベース確認
137
+ pnpm exec prisma db pull
138
+ ```
139
+
140
+ ### 自動テスト実行
141
+ ```bash
142
+ # ユニットテスト
143
+ pnpm run test
144
+
145
+ # E2Eテスト
146
+ pnpm run test:e2e
147
+
148
+ # 全テスト
149
+ pnpm run prepush
150
+ ```
@@ -0,0 +1,268 @@
1
+ # Phase 1-1: データベース基盤構築 QAテスト結果
2
+
3
+ ## テスト対象タスク
4
+ - **タスクID**: 1.1.1~1.1.4
5
+ - **タスク名**: データベース基盤構築(ユーザーデータモデル)
6
+ - **実装日**: 2025-01-15
7
+ - **テスター**: 山田太郎
8
+ - **最終更新**: 2025-01-15 16:30
9
+
10
+ ## テストサマリー
11
+ | ステータス | 件数 |
12
+ |----------|-----|
13
+ | ✅ PASS | 12 |
14
+ | ❌ FAIL | 3 |
15
+ | ⚠️ PARTIAL | 2 |
16
+ | 🔄 未実施 | 0 |
17
+
18
+ ---
19
+
20
+ ## 必須自動テスト結果
21
+
22
+ ### 実行コマンド
23
+ ```bash
24
+ # 1. ユニットテスト
25
+ pnpm test
26
+
27
+ # 2. E2Eテスト(該当する場合)
28
+ pnpm test:e2e
29
+
30
+ # 3. Lintチェック
31
+ pnpm lint
32
+
33
+ # 4. ビルドチェック
34
+ pnpm build
35
+
36
+ # 5. 型チェック(TypeScript)
37
+ pnpm typecheck
38
+ ```
39
+
40
+ ### 結果
41
+ | テスト項目 | ステータス | 備考 |
42
+ |----------|----------|------|
43
+ | ユニットテスト | ✅ | 全テスト通過 |
44
+ | E2Eテスト | - | 対象なし |
45
+ | Lintチェック | ✅ | - |
46
+ | ビルドチェック | ✅ | - |
47
+ | 型チェック | ✅ | - |
48
+
49
+ **重要**: 上記のいずれか1つでも失敗した場合、全体ステータスは**❌ FAIL**となります。
50
+
51
+ ---
52
+
53
+ ## タスク 1.1.1: データベーススキーマ設計
54
+
55
+ ### 受け入れ条件
56
+ - AC1.1: Given DBが起動している When マイグレーションを実行 Then Userテーブルが作成される
57
+ - AC1.2: Given DBが起動している When マイグレーションを実行 Then AuthTokenテーブルが作成される
58
+ - AC1.3: Given DBが起動している When マイグレーションを実行 Then UserSessionテーブルが作成される
59
+ - AC1.4: Given DBが起動している When マイグレーションを実行 Then LoginHistoryテーブルが作成される
60
+
61
+ ### テストシナリオ
62
+
63
+ #### データベース構造確認
64
+
65
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
66
+ |----|------|---------|--------|------|------|
67
+ | 1 | pnpm exec prisma migrate status 実行 | マイグレーション適用状態 | すべてのマイグレーションが適用済み | ✅ | 4件すべて適用済み |
68
+ | 2 | - | Userテーブル存在 | テーブルが存在する | ✅ | - |
69
+ | 3 | - | AuthTokenテーブル存在 | テーブルが存在する | ✅ | - |
70
+ | 4 | - | UserSessionテーブル存在 | テーブルが存在する | ✅ | - |
71
+ | 5 | - | LoginHistoryテーブル存在 | テーブルが存在する | ✅ | - |
72
+ | 6 | pnpm exec prisma db pull 実行 | Userテーブル構造 | id, email, name, avatarUrl, isActive, lastLoginAt, createdAt, updatedAt | ✅ | - |
73
+ | 7 | - | AuthTokenテーブル構造 | id, userId, token, type, expiresAt, isUsed | ✅ | - |
74
+ | 8 | - | 外部キー制約 | 全テーブルでuserIdの外部キーが正常 | ✅ | - |
75
+ | 9 | - | インデックス | token, userId等のインデックスが存在 | ✅ | - |
76
+
77
+ ### 全体ステータス: ✅ PASS
78
+
79
+ #### 主な問題点
80
+ - なし
81
+
82
+ #### 対応策
83
+ - なし
84
+
85
+ #### エビデンス
86
+ - ログファイル: `qa-tests/phase1/evidence/1-1-1-migration.log`
87
+
88
+ ---
89
+
90
+ ## タスク 1.1.2: Prismaマイグレーション作成
91
+
92
+ ### 受け入れ条件
93
+ - AC2.1: Given プロジェクトがある When ls prisma/schema.prisma Then スキーマファイルが存在する
94
+ - AC2.2: Given スキーマが定義されている When pnpm exec prisma migrate dev Then マイグレーションファイルが生成される
95
+ - AC2.3: Given マイグレーションがある When pnpm exec prisma migrate status Then すべて適用済み
96
+
97
+ ### テストシナリオ
98
+
99
+ #### マイグレーション確認
100
+
101
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
102
+ |----|------|---------|--------|------|------|
103
+ | 1 | ls prisma/schema.prisma 実行 | スキーマファイル存在 | ファイルが存在する | ✅ | - |
104
+ | 2 | pnpm exec prisma migrate dev 実行 | マイグレーション生成 | マイグレーションファイルが生成される | ❌ | **エラー**: P3006 - 既存データとの競合 |
105
+ | 3 | pnpm exec prisma migrate status 実行 | マイグレーション状態 | すべて適用済み | ⚠️ | 1件未適用: 20250115100300_create_login_histories |
106
+ | 4 | pnpm exec prisma validate 実行 | スキーマバリデーション | バリデーション成功 | ✅ | - |
107
+
108
+ ### 全体ステータス: ❌ FAIL
109
+
110
+ #### 主な問題点
111
+ 1. **マイグレーション競合**: 既存のusersテーブルとの競合が発生
112
+ 2. **未適用マイグレーション**: login_historiesテーブルのマイグレーションが未適用
113
+ 3. **影響範囲**: データベース基盤が不完全、次タスクへの影響大
114
+
115
+ #### 対応策
116
+ - 既存テーブルとの競合を解決するため、マイグレーションファイルを手動修正
117
+ - `pnpm exec prisma migrate resolve --applied 20250115100300_create_login_histories`で強制適用
118
+
119
+ #### エビデンス
120
+ - エラーログ: `qa-tests/phase1/evidence/1-1-2-migration-error.log`
121
+ - スクリーンショット: `qa-tests/phase1/evidence/1-1-2-error.png`
122
+
123
+ ---
124
+
125
+ ## タスク 1.1.3: リポジトリ層実装
126
+
127
+ ### 受け入れ条件
128
+ - AC3.1: Given UserRepositoryがある When findByEmail When ユーザーが取得できる
129
+ - AC3.2: Given UserRepositoryがある When create Then ユーザーが作成できる
130
+ - AC3.3: Given AuthTokenRepositoryがある When create Then トークンが作成できる
131
+ - AC3.4: Given AuthTokenRepositoryがある When findByToken Then トークンが取得できる
132
+ - AC3.5: Given AuthTokenRepositoryがある When markAsUsed Then トークンが使用済みになる
133
+
134
+ ### テストシナリオ
135
+
136
+ #### 単体テスト実行
137
+
138
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
139
+ |----|------|---------|--------|------|------|
140
+ | 1 | pnpm test UserRepository.findByEmail 実行 | ユーザー取得 | テスト成功 | ✅ | - |
141
+ | 2 | pnpm test UserRepository.create 実行 | ユーザー作成 | テスト成功 | ✅ | - |
142
+ | 3 | pnpm test AuthTokenRepository.create 実行 | トークン作成 | テスト成功 | ✅ | - |
143
+ | 4 | pnpm test AuthTokenRepository.findByToken 実行 | トークン取得 | テスト成功 | ❌ | **エラー**: TypeError: Cannot read property 'token' of undefined |
144
+ | 5 | pnpm test AuthTokenRepository.markAsUsed 実行 | トークン使用済み化 | テスト成功 | ⚠️ | 動作するがトランザクション処理が未実装 |
145
+
146
+ ### 全体ステータス: ⚠️ PARTIAL
147
+
148
+ #### 主な問題点
149
+ 1. **トークン取得エラー**: トークン検索処理に不具合
150
+ 2. **トランザクション未実装**: 競合状態での整合性が保証されない
151
+
152
+ #### 対応策
153
+ - トークン取得処理のnullチェックを追加
154
+ - トランザクション処理をPrismaのinteractiveTransactionsで実装
155
+
156
+ #### エビデンス
157
+ - テストログ: `qa-tests/phase1/evidence/1-1-3-unit-test.log`
158
+
159
+ ---
160
+
161
+ ## タスク 1.1.4: 要件1シナリオテスト作成・実行
162
+
163
+ ### 受け入れ条件
164
+ - AC4.1: Given テスト環境がある When ユーザー作成・取得テスト Then テストが通る
165
+ - AC4.2: Given テスト環境がある When トークン保存・検証テスト Then テストが通る
166
+ - AC4.3: Given テスト環境がある When セッション管理テスト Then テストが通る
167
+
168
+ ### テストシナリオ
169
+
170
+ #### ユーザー作成・取得フロー
171
+
172
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
173
+ |----|------|---------|--------|------|------|
174
+ | 1 | 新規ユーザー作成API呼び出し | DBにレコード作成 | ユーザーレコードが作成される | ✅ | - |
175
+ | 2 | メールアドレスでユーザー取得 | ユーザー取得 | 作成したユーザーが取得できる | ✅ | - |
176
+ | 3 | 重複メールアドレスで作成試行 | エラー処理 | 一意制約エラーが返る | ✅ | - |
177
+ | 4 | 無効なメールアドレスで作成試行 | バリデーション | バリデーションエラーが返る | ❌ | バリデーションがスキップされDBエラー発生 |
178
+
179
+ #### トークン保存・検証フロー
180
+
181
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
182
+ |----|------|---------|--------|------|------|
183
+ | 1 | 認証トークン生成API呼び出し | トークン生成 | 256ビットのトークンが生成される | ✅ | - |
184
+ | 2 | トークンをDBに保存 | トークン保存 | typeとexpiresAtとともに保存される | ✅ | - |
185
+ | 3 | 有効なトークンで検証API呼び出し | トークン検証 | 有効なトークンが検証される | ✅ | - |
186
+ | 4 | 期限切れトークンで検証API呼び出し | エラー処理 | 期限切れエラーが返る | ✅ | - |
187
+ | 5 | 使用済みトークンで検証API呼び出し | エラー処理 | 使用済みエラーが返る | ⚠️ | エラーメッセージが「Invalid token」で不明確 |
188
+ | 6 | トークン無効化API呼び出し | フラグ更新 | isUsedフラグがtrueになる | ✅ | - |
189
+
190
+ #### セッション管理フロー
191
+
192
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
193
+ |----|------|---------|--------|------|------|
194
+ | 1 | ユーザーセッション作成 | DBにレコード作成 | UserSessionレコードが作成される | ✅ | refreshTokenとexpiresAtが正しく保存 |
195
+ | 2 | セッションIDで取得 | セッション取得 | セッションが取得できる | ✅ | - |
196
+ | 3 | セッション削除API呼び出し | セッション削除 | セッションが削除される | ✅ | - |
197
+ | 4 | 期限切れセッション自動削除確認 | 自動削除 | 期限切れセッションが自動削除される | ❌ | 自動削除バッチが未実装 |
198
+
199
+ ### 全体ステータス: ⚠️ PARTIAL
200
+
201
+ #### 主な問題点
202
+ 1. **バリデーション不足**: アプリケーション層でのバリデーションが欠如
203
+ 2. **エラーメッセージ**: ユーザーフレンドリーなエラーメッセージが不足
204
+ 3. **自動削除未実装**: 期限切れセッションの自動削除機能が未実装
205
+
206
+ #### 対応策
207
+ - Zodを使用してアプリケーション層でバリデーション実装
208
+ - エラーコードに対応したメッセージマッピングを作成
209
+ - cronジョブまたはPrisma middlewareで自動削除を実装
210
+
211
+ #### エビデンス
212
+ - テストログ: `qa-tests/phase1/evidence/1-1-4-integration-test.log`
213
+
214
+ ---
215
+
216
+ ## 統合テスト結果サマリー
217
+
218
+ ### フェーズ1-1全体結果
219
+ - **全体ステータス**: ⚠️ PARTIAL
220
+ - **完了タスク**: 4/4(ただし問題あり)
221
+ - **テスト合格率**: 70% (12/17)
222
+
223
+ ### 修正が必要な項目
224
+ 1. **優先度HIGH**:
225
+ - [ ] マイグレーション競合の解消
226
+ - [ ] トークン取得処理のバグ修正
227
+ - [ ] アプリケーション層のバリデーション実装
228
+
229
+ 2. **優先度MEDIUM**:
230
+ - [ ] エラーメッセージの改善
231
+ - [ ] トランザクション処理の実装
232
+ - [ ] 期限切れセッション自動削除バッチの実装
233
+
234
+ ### 次フェーズへの引き継ぎ事項
235
+ 1. データベース基盤は概ね完成したが、いくつかの修正が必要
236
+ 2. 修正完了後、フェーズ1-2のメール送信基盤に進む
237
+ 3. 単体テストの自動化とCI/CD統合を検討
238
+
239
+ ### 改善提案
240
+ - マイグレーション実行前の環境チェックスクリプト作成
241
+ - リポジトリ層の単体テストカバレッジ向上(現在60%)
242
+ - エラーハンドリングの統一的な実装パターン確立
243
+
244
+ ---
245
+
246
+ ## 報告と対応
247
+
248
+ ### 失敗原因分類
249
+ <!-- 該当する分類にチェック -->
250
+ - [x] **A: 実装ミス** → task-executerへ差し戻し
251
+ - [ ] **B: 要件齟齬** → requirements.md修正 → task-executerへ差し戻し
252
+ - [ ] **C: 設計不備** → design.md修正 → task-executerへ差し戻し
253
+ - [ ] **D: 環境問題** → qa再実行
254
+
255
+ ### task-executerへの差し戻し(該当する場合)
256
+ 以下の項目について修正が必要:
257
+ 1. タスク1.1.2: マイグレーション競合の解消
258
+ 2. タスク1.1.3: トークン取得処理のバグ修正
259
+ 3. タスク1.1.4: バリデーション実装
260
+
261
+ ### 修正優先度
262
+ - **即座対応**: マイグレーション競合(フェーズ1-2以降に影響)
263
+ - **1週間以内**: トークン取得バグ(セキュリティに関わる)
264
+ - **2週間以内**: その他改善項目
265
+
266
+ ### 回避策(該当する場合)
267
+ - マイグレーション競合: 一時的に既存テーブルをリネームして回避可能
268
+ - トークン取得バグ: 暫定的にデバッグログを追加して原因特定を進める
@@ -0,0 +1,179 @@
1
+ # Phase 1-2: メール送信基盤 QAテスト結果
2
+
3
+ ## テスト対象タスク
4
+ - **タスクID**: 1.2.1~1.2.3
5
+ - **タスク名**: メール送信基盤構築
6
+ - **実装日**: YYYY-MM-DD
7
+ - **テスター**: TBD
8
+ - **最終更新**: YYYY-MM-DD HH:MM
9
+
10
+ ## テストサマリー
11
+ | ステータス | 件数 |
12
+ |----------|-----|
13
+ | ✅ PASS | 0 |
14
+ | ❌ FAIL | 0 |
15
+ | ⚠️ PARTIAL | 0 |
16
+ | 🔄 未実施 | 3 |
17
+
18
+ ---
19
+
20
+ ## 必須自動テスト結果
21
+
22
+ ### 実行コマンド
23
+ ```bash
24
+ # 1. ユニットテスト
25
+ pnpm test
26
+
27
+ # 2. E2Eテスト(該当する場合)
28
+ pnpm test:e2e
29
+
30
+ # 3. Lintチェック
31
+ pnpm lint
32
+
33
+ # 4. ビルドチェック
34
+ pnpm build
35
+
36
+ # 5. 型チェック(TypeScript)
37
+ pnpm typecheck
38
+ ```
39
+
40
+ ### 結果
41
+ | テスト項目 | ステータス | 備考 |
42
+ |----------|----------|------|
43
+ | ユニットテスト | 🔄 | - |
44
+ | E2Eテスト | 🔄 | - |
45
+ | Lintチェック | 🔄 | - |
46
+ | ビルドチェック | 🔄 | - |
47
+ | 型チェック | 🔄 | - |
48
+
49
+ **重要**: 上記のいずれか1つでも失敗した場合、全体ステータスは**❌ FAIL**となります。
50
+
51
+ ---
52
+
53
+ ## タスク1.2.1: メール送信サービス設定
54
+
55
+ ### 受け入れ条件
56
+ - AC2.1: Given Resendが設定されている When API呼び出し Then メールが送信できる
57
+ - AC2.2: Given 環境変数が設定されている When アプリ起動 Then Resendクライアントが初期化される
58
+
59
+ ### テストシナリオ
60
+
61
+ #### 環境設定確認
62
+
63
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
64
+ |----|------|---------|--------|------|------|
65
+ | 1 | 環境変数確認 | RESEND_API_KEY | 設定されている | - | - |
66
+ | 2 | 環境変数確認 | RESEND_FROM_EMAIL | 設定されている | - | - |
67
+ | 3 | Resendダッシュボード確認 | APIキー状態 | 有効状態 | - | - |
68
+
69
+ ### 全体ステータス: 🔄 未実施
70
+
71
+ #### 主な問題点
72
+ - (実施後に記載)
73
+
74
+ #### 対応策
75
+ - (実施後に記載)
76
+
77
+ #### エビデンス
78
+ - ログファイル: `qa-tests/phase1/evidence/1-2-1-config.log`
79
+
80
+ ---
81
+
82
+ ## タスク1.2.2: メールテンプレート作成
83
+
84
+ ### 受け入れ条件
85
+ - AC2.3: Given テンプレートがある When マジックリンク生成 Then HTMLメールが生成される
86
+ - AC2.4: Given テンプレートがある When マジックリンク生成 Then プレーンテキストメールが生成される
87
+
88
+ ### テストシナリオ
89
+
90
+ #### テンプレート確認
91
+
92
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
93
+ |----|------|---------|--------|------|------|
94
+ | 1 | HTMLテンプレート確認 | ファイル存在 | templates/magic-link.html存在 | - | - |
95
+ | 2 | プレーンテキスト確認 | ファイル存在 | templates/magic-link.txt存在 | - | - |
96
+ | 3 | 変数置換テスト | {{link}}置換 | 正しくURLが挿入される | - | - |
97
+ | 4 | 変数置換テスト | {{expiresIn}}置換 | 正しく時間が挿入される | - | - |
98
+
99
+ ### 全体ステータス: 🔄 未実施
100
+
101
+ #### 主な問題点
102
+ - (実施後に記載)
103
+
104
+ #### 対応策
105
+ - (実施後に記載)
106
+
107
+ #### エビデンス
108
+ - スクリーンショット: `qa-tests/phase1/evidence/1-2-2-template.png`
109
+
110
+ ---
111
+
112
+ ## タスク1.2.3: メール送信機能実装
113
+
114
+ ### 受け入れ条件
115
+ - AC2.5: Given 有効なメールアドレス When sendMagicLink呼び出し Then メールが送信される
116
+ - AC2.6: Given 無効なメールアドレス When sendMagicLink呼び出し Then エラーが返される
117
+
118
+ ### テストシナリオ
119
+
120
+ #### 送信機能テスト
121
+
122
+ | No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
123
+ |----|------|---------|--------|------|------|
124
+ | 1 | 有効なメールアドレスで送信 | APIレスポンス | 200成功 | - | - |
125
+ | 2 | - | メール受信確認 | メールが届く | - | - |
126
+ | 3 | - | リンク有効性 | クリック可能なリンク | - | - |
127
+ | 4 | 無効なメールアドレスで送信 | APIレスポンス | 400エラー | - | - |
128
+ | 5 | API障害時 | エラーハンドリング | 適切なエラーメッセージ | - | - |
129
+
130
+ ### 全体ステータス: 🔄 未実施
131
+
132
+ #### 主な問題点
133
+ - (実施後に記載)
134
+
135
+ #### 対応策
136
+ - (実施後に記載)
137
+
138
+ #### エビデンス
139
+ - ログファイル: `qa-tests/phase1/evidence/1-2-3-send.log`
140
+
141
+ ---
142
+
143
+ ## 統合テスト結果サマリー
144
+
145
+ ### フェーズ1-2全体結果
146
+ - **全体ステータス**: 🔄 未実施
147
+ - **完了タスク**: 0/3
148
+ - **テスト合格率**: -
149
+
150
+ ### 修正が必要な項目
151
+ (実施後に記載)
152
+
153
+ ### 次フェーズへの引き継ぎ事項
154
+ 1. メール送信基盤が正常に動作していること
155
+ 2. テンプレート変数が正しく置換されること
156
+ 3. エラーハンドリングが適切に実装されていること
157
+
158
+ ### 改善提案
159
+ (実施後に記載)
160
+
161
+ ---
162
+
163
+ ## 報告と対応
164
+
165
+ ### 失敗原因分類
166
+ <!-- 該当する分類にチェック -->
167
+ - [ ] **A: 実装ミス** → task-executerへ差し戻し
168
+ - [ ] **B: 要件齟齬** → requirements.md修正 → task-executerへ差し戻し
169
+ - [ ] **C: 設計不備** → design.md修正 → task-executerへ差し戻し
170
+ - [ ] **D: 環境問題** → qa再実行
171
+
172
+ ### task-executerへの差し戻し(該当する場合)
173
+ (実施後に記載)
174
+
175
+ ### 修正優先度
176
+ (実施後に記載)
177
+
178
+ ### 回避策(該当する場合)
179
+ (実施後に記載)