yodogawa 2.1.1 → 2.2.0
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.
- package/CHANGELOG.md +134 -82
- package/LICENSE +1 -1
- package/README.md +351 -246
- package/bin/checks/id-trace.js +137 -0
- package/bin/checks/links.js +59 -0
- package/bin/checks/placeholder.js +132 -0
- package/bin/checks/structure.js +127 -0
- package/bin/cli.js +51 -68
- package/bin/commands/doctor.js +128 -0
- package/bin/commands/install.js +58 -0
- package/bin/commands/new-task.js +117 -0
- package/bin/lib/check-cli.js +19 -0
- package/bin/lib/findings.js +31 -0
- package/bin/lib/markdown.js +103 -0
- package/bin/lib/project-spec.js +138 -0
- package/bin/lib/walk-md.js +23 -0
- package/package.json +68 -56
- package/skills/a-001-setup-doc-structure/SKILL.md +7 -6
- package/skills/a-001-setup-doc-structure/reference/directory-structure.md +40 -13
- package/skills/a-002-initialize-project/SKILL.md +72 -52
- package/skills/a-002-initialize-project/reference/hearing-questions.md +91 -41
- package/skills/a-002-initialize-project/reference/structure-check.md +12 -22
- package/skills/a-002a-slice-mvp-scope/SKILL.md +105 -0
- package/skills/a-002b-define-user-stories/SKILL.md +80 -0
- package/skills/a-002b-define-user-stories/reference/user-stories-guide.md +78 -0
- package/skills/a-003-create-scenarios/SKILL.md +37 -39
- package/{templates/project/02-behavior/01-scenarios.md → skills/a-003-create-scenarios/reference/detailed-gherkin-template.md} +413 -406
- package/skills/a-003-create-scenarios/reference/structure-check.md +20 -17
- package/skills/a-004-define-domain-model/SKILL.md +44 -36
- package/skills/a-004-define-domain-model/reference/event-storming-guide.md +33 -7
- package/skills/a-004-define-domain-model/reference/ubiquitous-language-guide.md +49 -0
- package/skills/a-005-create-domain-diagram/SKILL.md +18 -17
- package/skills/a-006-review-requirements-domain/SKILL.md +59 -22
- package/skills/a-006-review-requirements-domain/examples/review-report-template.md +27 -7
- package/skills/a-006-review-requirements-domain/reference/consistency-checks.md +53 -18
- package/skills/a-007-define-tech-stack/SKILL.md +4 -7
- package/skills/a-008-define-repository-structure/SKILL.md +2 -5
- package/skills/a-009-define-screen-design/SKILL.md +3 -6
- package/skills/a-010-define-design-system/SKILL.md +1 -5
- package/skills/a-011-define-data-model/SKILL.md +4 -7
- package/skills/a-012-define-api-spec/SKILL.md +1 -4
- package/skills/a-013-define-architecture/SKILL.md +1 -4
- package/skills/a-014-define-infrastructure/SKILL.md +9 -4
- package/skills/{a-002-initialize-project → a-014-define-infrastructure}/examples/nfr-baseline.md +2 -1
- package/{templates/project/01-requirements/04-non-functional-requirements.md → skills/a-014-define-infrastructure/examples/non-functional-requirements.md} +120 -115
- package/skills/a-015-review-design/reference/consistency-checks.md +1 -1
- package/skills/b-001-create-task-directory/SKILL.md +14 -8
- package/skills/b-002-create-task-definition/SKILL.md +4 -5
- package/skills/b-003-create-task-research/SKILL.md +4 -5
- package/skills/b-004-create-task-implementation/SKILL.md +4 -5
- package/skills/b-005-review-task/reference/assessment-criteria.md +3 -3
- package/skills/c-001-implement-task/SKILL.md +1 -1
- package/skills/c-001-implement-task/reference/implementation-loop.md +1 -1
- package/skills/c-002-update-documentation/SKILL.md +7 -7
- package/skills/c-002-update-documentation/examples/project-doc-updates.md +4 -4
- package/skills/c-002-update-documentation/reference/doc-structure-and-checks.md +8 -9
- package/templates/project/01-requirements/01-product-brief.md +186 -0
- package/templates/project/01-requirements/02-mvp-scope.md +64 -0
- package/templates/project/01-requirements/03-parking-lot.md +29 -0
- package/templates/project/01-requirements/05-user-stories.md +28 -124
- package/templates/project/01-requirements/{02-features-implemented.md → 06-features-implemented.md} +77 -73
- package/templates/project/02-behavior/01-core-scenarios.md +80 -0
- package/templates/project/03-domain/01-domain-model.md +120 -339
- package/templates/project/03-domain/01-domain-sketch.md +90 -0
- package/templates/project/03-domain/02-ubiquitous-language.md +32 -153
- package/templates/project/04-design/01-tech-stack.md +367 -367
- package/templates/project/04-design/02-repository-structure.md +391 -391
- package/templates/project/04-design/03-screen-design.md +596 -596
- package/templates/project/04-design/04-design-system.md +261 -261
- package/templates/project/04-design/05-data-model.md +211 -211
- package/templates/project/04-design/06-api-spec.md +226 -226
- package/templates/project/04-design/07-architecture.md +183 -183
- package/templates/project/04-design/08-infrastructure.md +180 -180
- package/templates/project/AI_CONTEXT.md +55 -0
- package/templates/project/STAKEHOLDER-SUMMARY.md +66 -0
- package/templates/tasks/task-template/a-definition.md +143 -143
- package/templates/tasks/task-template/b-research.md +185 -185
- package/templates/tasks/task-template/c-implementation.md +200 -200
- package/scripts/create-task.sh +0 -77
- package/scripts/init-project-docs.sh +0 -90
- package/scripts/init-task-doc.sh +0 -77
- package/scripts/setup-docs.sh +0 -92
- package/templates/documentation-rules.md +0 -143
- package/templates/project/01-requirements/01-system-overview.md +0 -49
- package/templates/project/01-requirements/03-features-planned.md +0 -75
|
@@ -1,200 +1,200 @@
|
|
|
1
|
-
# 実装タスクリスト
|
|
2
|
-
|
|
3
|
-
<!--
|
|
4
|
-
このドキュメントについて:
|
|
5
|
-
- 格納場所: docs/tasks/task000001-{スラッグ}/c-implementation.md
|
|
6
|
-
- 作成方法: /b-
|
|
7
|
-
- 実行方法: /c-001-
|
|
8
|
-
- 前提条件: a-definition.md と b-research.md が作成済みであること
|
|
9
|
-
- 関連ドキュメント:
|
|
10
|
-
- a-definition.md (タスク定義ドキュメント)
|
|
11
|
-
- b-research.md (リサーチドキュメント)
|
|
12
|
-
|
|
13
|
-
このドキュメントの目的:
|
|
14
|
-
- 実装作業を段階的に分割して管理
|
|
15
|
-
- 進捗の可視化とチーム共有
|
|
16
|
-
- 各ステップの成果物を明確化
|
|
17
|
-
- 実装漏れの防止
|
|
18
|
-
|
|
19
|
-
更新タイミング:
|
|
20
|
-
- 実装開始前にフェーズ分割を計画
|
|
21
|
-
- 各ステップ完了時にチェック(/c-001-
|
|
22
|
-
- 新たな作業が発覚した際に追加
|
|
23
|
-
- レビュー指摘事項を反映
|
|
24
|
-
-->
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## フェーズ 1: [フェーズ名]
|
|
29
|
-
|
|
30
|
-
<!--
|
|
31
|
-
フェーズの分け方:
|
|
32
|
-
- 機能単位で分割(例: フロントエンド → バックエンド → 統合)
|
|
33
|
-
- 依存関係で分割(例: データモデル → API → UI)
|
|
34
|
-
- リスクで分割(例: 検証 → 本実装 → 最適化)
|
|
35
|
-
|
|
36
|
-
ベストプラクティス:
|
|
37
|
-
- 1フェーズは 1-3 日以内で完了できる粒度
|
|
38
|
-
- フェーズごとに動作確認可能な状態にする
|
|
39
|
-
- 各フェーズで小さくコミット・PR を作成(レビュー負荷軽減)
|
|
40
|
-
-->
|
|
41
|
-
|
|
42
|
-
**目的:** <!-- 例: データモデルと API エンドポイントの実装 -->
|
|
43
|
-
|
|
44
|
-
**完了条件:** <!-- 例: API が期待通りのレスポンスを返し、ユニットテストが全て通る -->
|
|
45
|
-
|
|
46
|
-
### ステップ
|
|
47
|
-
|
|
48
|
-
<!--
|
|
49
|
-
ステップの粒度:
|
|
50
|
-
- 1ステップは 1-3 時間程度で完了できる作業
|
|
51
|
-
- コミット単位で分割すると管理しやすい
|
|
52
|
-
- 成果物が明確であること(ファイル、機能、テスト)
|
|
53
|
-
|
|
54
|
-
記載のポイント:
|
|
55
|
-
- 具体的なファイル名やコンポーネント名を含める
|
|
56
|
-
- 実装の詳細にはアルゴリズムや技術的な注意点を記載
|
|
57
|
-
- 依存関係があるステップは順序を意識
|
|
58
|
-
-->
|
|
59
|
-
|
|
60
|
-
- [ ] **ステップ 1:** データベーススキーマの定義
|
|
61
|
-
- **成果物:** `migrations/001_create_users_table.sql`
|
|
62
|
-
- **詳細:** User テーブルに `email_verified`, `verification_token`, `token_expires_at` を追加。インデックスは `verification_token` に作成
|
|
63
|
-
|
|
64
|
-
- [ ] **ステップ 2:** TypeScript 型定義の追加
|
|
65
|
-
- **成果物:** `src/types/User.ts`
|
|
66
|
-
- **詳細:** `User` インターフェースに新しいフィールドを追加。Zod スキーマも同時に定義
|
|
67
|
-
|
|
68
|
-
- [ ] **ステップ 3:** メール送信 API エンドポイントの実装
|
|
69
|
-
- **成果物:** `src/api/auth/send-verification.ts`
|
|
70
|
-
- **詳細:** トークン生成(UUID v4)、有効期限 24 時間、SendGrid API 呼び出し。エラーハンドリング実装
|
|
71
|
-
|
|
72
|
-
- [ ] **ステップ 4:** メール認証 API エンドポイントの実装
|
|
73
|
-
- **成果物:** `src/api/auth/verify-email.ts`
|
|
74
|
-
- **詳細:** トークン検証、有効期限チェック、ユーザーステータス更新。無効トークンは 400 エラー
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
## フェーズ 2: [フェーズ名]
|
|
79
|
-
|
|
80
|
-
**目的:** <!-- 例: フロントエンド UI の実装とユーザーフロー統合 -->
|
|
81
|
-
|
|
82
|
-
**完了条件:** <!-- 例: ユーザー登録から認証完了までの一連の流れが動作し、E2E テストが通る -->
|
|
83
|
-
|
|
84
|
-
### ステップ
|
|
85
|
-
|
|
86
|
-
- [ ] **ステップ 1:** メール認証ページの作成
|
|
87
|
-
- **成果物:** `src/pages/EmailVerificationPage.tsx`
|
|
88
|
-
- **詳細:** URL パラメータからトークンを取得、API 呼び出し、成功/失敗メッセージ表示
|
|
89
|
-
|
|
90
|
-
- [ ] **ステップ 2:** ユーザー登録フォームにメール送信処理を追加
|
|
91
|
-
- **成果物:** `src/features/auth/RegisterForm.tsx` を更新
|
|
92
|
-
- **詳細:** 登録成功後にメール送信 API を呼び出し、「確認メールを送信しました」メッセージを表示
|
|
93
|
-
|
|
94
|
-
- [ ] **ステップ 3:** 認証状態のガード実装
|
|
95
|
-
- **成果物:** `src/middleware/requireEmailVerified.ts`
|
|
96
|
-
- **詳細:** 未認証ユーザーは特定ページにアクセス不可。リダイレクト処理を実装
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## フェーズ 3: テスト・ドキュメント
|
|
101
|
-
|
|
102
|
-
<!--
|
|
103
|
-
テストフェーズの重要性:
|
|
104
|
-
- 実装と同時にテストを書くことでバグを早期発見
|
|
105
|
-
- テストコードは仕様書の役割も果たす
|
|
106
|
-
- リグレッション防止(今後の変更で既存機能が壊れない)
|
|
107
|
-
|
|
108
|
-
記載すべきテスト:
|
|
109
|
-
- ユニットテスト(関数、コンポーネント単位)
|
|
110
|
-
- 統合テスト(API、データベース連携)
|
|
111
|
-
- E2E テスト(ユーザーフロー全体)
|
|
112
|
-
- エッジケーステスト(異常系、境界値)
|
|
113
|
-
-->
|
|
114
|
-
|
|
115
|
-
**目的:** <!-- 例: テストコード作成とドキュメント整備 -->
|
|
116
|
-
|
|
117
|
-
**完了条件:** <!-- 例: テストカバレッジ 80% 以上、README にセットアップ手順を記載 -->
|
|
118
|
-
|
|
119
|
-
### ステップ
|
|
120
|
-
|
|
121
|
-
- [ ] **ステップ 1:** ユニットテストの作成
|
|
122
|
-
- **成果物:** `src/api/auth/send-verification.test.ts`, `verify-email.test.ts`
|
|
123
|
-
- **詳細:** トークン生成、有効期限検証、エラーハンドリングのテスト。モックを使用
|
|
124
|
-
|
|
125
|
-
- [ ] **ステップ 2:** 統合テストの作成
|
|
126
|
-
- **成果物:** `tests/integration/email-verification.test.ts`
|
|
127
|
-
- **詳細:** API エンドポイントの実際の動作をテスト。テストデータベース使用
|
|
128
|
-
|
|
129
|
-
- [ ] **ステップ 3:** E2E テストの作成
|
|
130
|
-
- **成果物:** `tests/e2e/user-registration.spec.ts`
|
|
131
|
-
- **詳細:** Playwright でユーザー登録→メール確認→ログインまでの流れをテスト
|
|
132
|
-
|
|
133
|
-
- [ ] **ステップ 4:** ドキュメント更新
|
|
134
|
-
- **成果物:** `README.md`, `docs/tasks/task000001-{スラッグ}/a-definition.md`
|
|
135
|
-
- **詳細:** セットアップ手順、環境変数設定、API 仕様を記載
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## 受け入れ基準
|
|
140
|
-
|
|
141
|
-
<!--
|
|
142
|
-
受け入れ基準の記載ポイント:
|
|
143
|
-
- 機能が正しく動作すること(正常系)
|
|
144
|
-
- エラーハンドリングが適切に実装されていること(異常系)
|
|
145
|
-
- エッジケースが処理されること(境界値、特殊な入力)
|
|
146
|
-
- パフォーマンス要件を満たすこと(必要に応じて)
|
|
147
|
-
- セキュリティ要件を満たすこと(XSS, CSRF, SQL Injection など)
|
|
148
|
-
- ブラウザ互換性(必要に応じて)
|
|
149
|
-
- テストが全て通ること
|
|
150
|
-
- ドキュメントが更新されていること
|
|
151
|
-
|
|
152
|
-
各フェーズの完了を判断するための具体的な基準を記載します。
|
|
153
|
-
全ての基準を満たした時点でタスク完了とみなされます。
|
|
154
|
-
-->
|
|
155
|
-
|
|
156
|
-
### フェーズ 1 の受け入れ基準
|
|
157
|
-
|
|
158
|
-
- [ ] データベースマイグレーションが成功する
|
|
159
|
-
- [ ] 型定義が正しく適用される(TypeScript コンパイルエラーなし)
|
|
160
|
-
- [ ] メール送信 API がトークンを生成し、メールを送信する
|
|
161
|
-
- [ ] 無効なトークンでアクセスした場合、エラーが返る
|
|
162
|
-
- [ ] トークンの有効期限切れが正しく検出される
|
|
163
|
-
|
|
164
|
-
### フェーズ 2 の受け入れ基準
|
|
165
|
-
|
|
166
|
-
- [ ] メール認証ページが正しく表示される
|
|
167
|
-
- [ ] 認証成功時に成功メッセージが表示される
|
|
168
|
-
- [ ] 認証失敗時にエラーメッセージが表示される
|
|
169
|
-
- [ ] 未認証ユーザーは保護されたページにアクセスできない
|
|
170
|
-
- [ ] 認証済みユーザーは全ての機能にアクセスできる
|
|
171
|
-
|
|
172
|
-
### フェーズ 3 の受け入れ基準
|
|
173
|
-
|
|
174
|
-
- [ ] 全てのユニットテストが通る
|
|
175
|
-
- [ ] 全ての統合テストが通る
|
|
176
|
-
- [ ] E2E テストが通る(CI 環境でも実行)
|
|
177
|
-
- [ ] テストカバレッジが 80% 以上
|
|
178
|
-
- [ ] ドキュメントに記載された手順で環境構築できる
|
|
179
|
-
|
|
180
|
-
---
|
|
181
|
-
|
|
182
|
-
## メモ
|
|
183
|
-
|
|
184
|
-
<!--
|
|
185
|
-
実装全体に関する補足情報
|
|
186
|
-
|
|
187
|
-
記載すべき内容:
|
|
188
|
-
- 実装中に気づいた技術的な課題
|
|
189
|
-
- リファクタリングが必要な箇所
|
|
190
|
-
- パフォーマンス最適化の余地
|
|
191
|
-
- セキュリティ上の注意点
|
|
192
|
-
- 今後の拡張予定
|
|
193
|
-
- チームメンバーへの引き継ぎ事項
|
|
194
|
-
|
|
195
|
-
例:
|
|
196
|
-
- メール送信は現在同期処理だが、将来的にはジョブキューに移行予定
|
|
197
|
-
- トークンの有効期限は現在 24 時間だが、設定ファイルで変更可能にする
|
|
198
|
-
- SendGrid の API キーは環境変数で管理(.env.example に記載)
|
|
199
|
-
- セキュリティレビュー完了(2025-01-15、レビュアー: @john)
|
|
200
|
-
-->
|
|
1
|
+
# 実装タスクリスト
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
このドキュメントについて:
|
|
5
|
+
- 格納場所: docs/tasks/task000001-{スラッグ}/c-implementation.md
|
|
6
|
+
- 作成方法: /b-004-create-task-implementation スキルで作成
|
|
7
|
+
- 実行方法: /c-001-implement-task スキルで各ステップを実行
|
|
8
|
+
- 前提条件: a-definition.md と b-research.md が作成済みであること
|
|
9
|
+
- 関連ドキュメント:
|
|
10
|
+
- a-definition.md (タスク定義ドキュメント)
|
|
11
|
+
- b-research.md (リサーチドキュメント)
|
|
12
|
+
|
|
13
|
+
このドキュメントの目的:
|
|
14
|
+
- 実装作業を段階的に分割して管理
|
|
15
|
+
- 進捗の可視化とチーム共有
|
|
16
|
+
- 各ステップの成果物を明確化
|
|
17
|
+
- 実装漏れの防止
|
|
18
|
+
|
|
19
|
+
更新タイミング:
|
|
20
|
+
- 実装開始前にフェーズ分割を計画
|
|
21
|
+
- 各ステップ完了時にチェック(/c-001-implement-task が自動更新)
|
|
22
|
+
- 新たな作業が発覚した際に追加
|
|
23
|
+
- レビュー指摘事項を反映
|
|
24
|
+
-->
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## フェーズ 1: [フェーズ名]
|
|
29
|
+
|
|
30
|
+
<!--
|
|
31
|
+
フェーズの分け方:
|
|
32
|
+
- 機能単位で分割(例: フロントエンド → バックエンド → 統合)
|
|
33
|
+
- 依存関係で分割(例: データモデル → API → UI)
|
|
34
|
+
- リスクで分割(例: 検証 → 本実装 → 最適化)
|
|
35
|
+
|
|
36
|
+
ベストプラクティス:
|
|
37
|
+
- 1フェーズは 1-3 日以内で完了できる粒度
|
|
38
|
+
- フェーズごとに動作確認可能な状態にする
|
|
39
|
+
- 各フェーズで小さくコミット・PR を作成(レビュー負荷軽減)
|
|
40
|
+
-->
|
|
41
|
+
|
|
42
|
+
**目的:** <!-- 例: データモデルと API エンドポイントの実装 -->
|
|
43
|
+
|
|
44
|
+
**完了条件:** <!-- 例: API が期待通りのレスポンスを返し、ユニットテストが全て通る -->
|
|
45
|
+
|
|
46
|
+
### ステップ
|
|
47
|
+
|
|
48
|
+
<!--
|
|
49
|
+
ステップの粒度:
|
|
50
|
+
- 1ステップは 1-3 時間程度で完了できる作業
|
|
51
|
+
- コミット単位で分割すると管理しやすい
|
|
52
|
+
- 成果物が明確であること(ファイル、機能、テスト)
|
|
53
|
+
|
|
54
|
+
記載のポイント:
|
|
55
|
+
- 具体的なファイル名やコンポーネント名を含める
|
|
56
|
+
- 実装の詳細にはアルゴリズムや技術的な注意点を記載
|
|
57
|
+
- 依存関係があるステップは順序を意識
|
|
58
|
+
-->
|
|
59
|
+
|
|
60
|
+
- [ ] **ステップ 1:** データベーススキーマの定義
|
|
61
|
+
- **成果物:** `migrations/001_create_users_table.sql`
|
|
62
|
+
- **詳細:** User テーブルに `email_verified`, `verification_token`, `token_expires_at` を追加。インデックスは `verification_token` に作成
|
|
63
|
+
|
|
64
|
+
- [ ] **ステップ 2:** TypeScript 型定義の追加
|
|
65
|
+
- **成果物:** `src/types/User.ts`
|
|
66
|
+
- **詳細:** `User` インターフェースに新しいフィールドを追加。Zod スキーマも同時に定義
|
|
67
|
+
|
|
68
|
+
- [ ] **ステップ 3:** メール送信 API エンドポイントの実装
|
|
69
|
+
- **成果物:** `src/api/auth/send-verification.ts`
|
|
70
|
+
- **詳細:** トークン生成(UUID v4)、有効期限 24 時間、SendGrid API 呼び出し。エラーハンドリング実装
|
|
71
|
+
|
|
72
|
+
- [ ] **ステップ 4:** メール認証 API エンドポイントの実装
|
|
73
|
+
- **成果物:** `src/api/auth/verify-email.ts`
|
|
74
|
+
- **詳細:** トークン検証、有効期限チェック、ユーザーステータス更新。無効トークンは 400 エラー
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## フェーズ 2: [フェーズ名]
|
|
79
|
+
|
|
80
|
+
**目的:** <!-- 例: フロントエンド UI の実装とユーザーフロー統合 -->
|
|
81
|
+
|
|
82
|
+
**完了条件:** <!-- 例: ユーザー登録から認証完了までの一連の流れが動作し、E2E テストが通る -->
|
|
83
|
+
|
|
84
|
+
### ステップ
|
|
85
|
+
|
|
86
|
+
- [ ] **ステップ 1:** メール認証ページの作成
|
|
87
|
+
- **成果物:** `src/pages/EmailVerificationPage.tsx`
|
|
88
|
+
- **詳細:** URL パラメータからトークンを取得、API 呼び出し、成功/失敗メッセージ表示
|
|
89
|
+
|
|
90
|
+
- [ ] **ステップ 2:** ユーザー登録フォームにメール送信処理を追加
|
|
91
|
+
- **成果物:** `src/features/auth/RegisterForm.tsx` を更新
|
|
92
|
+
- **詳細:** 登録成功後にメール送信 API を呼び出し、「確認メールを送信しました」メッセージを表示
|
|
93
|
+
|
|
94
|
+
- [ ] **ステップ 3:** 認証状態のガード実装
|
|
95
|
+
- **成果物:** `src/middleware/requireEmailVerified.ts`
|
|
96
|
+
- **詳細:** 未認証ユーザーは特定ページにアクセス不可。リダイレクト処理を実装
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## フェーズ 3: テスト・ドキュメント
|
|
101
|
+
|
|
102
|
+
<!--
|
|
103
|
+
テストフェーズの重要性:
|
|
104
|
+
- 実装と同時にテストを書くことでバグを早期発見
|
|
105
|
+
- テストコードは仕様書の役割も果たす
|
|
106
|
+
- リグレッション防止(今後の変更で既存機能が壊れない)
|
|
107
|
+
|
|
108
|
+
記載すべきテスト:
|
|
109
|
+
- ユニットテスト(関数、コンポーネント単位)
|
|
110
|
+
- 統合テスト(API、データベース連携)
|
|
111
|
+
- E2E テスト(ユーザーフロー全体)
|
|
112
|
+
- エッジケーステスト(異常系、境界値)
|
|
113
|
+
-->
|
|
114
|
+
|
|
115
|
+
**目的:** <!-- 例: テストコード作成とドキュメント整備 -->
|
|
116
|
+
|
|
117
|
+
**完了条件:** <!-- 例: テストカバレッジ 80% 以上、README にセットアップ手順を記載 -->
|
|
118
|
+
|
|
119
|
+
### ステップ
|
|
120
|
+
|
|
121
|
+
- [ ] **ステップ 1:** ユニットテストの作成
|
|
122
|
+
- **成果物:** `src/api/auth/send-verification.test.ts`, `verify-email.test.ts`
|
|
123
|
+
- **詳細:** トークン生成、有効期限検証、エラーハンドリングのテスト。モックを使用
|
|
124
|
+
|
|
125
|
+
- [ ] **ステップ 2:** 統合テストの作成
|
|
126
|
+
- **成果物:** `tests/integration/email-verification.test.ts`
|
|
127
|
+
- **詳細:** API エンドポイントの実際の動作をテスト。テストデータベース使用
|
|
128
|
+
|
|
129
|
+
- [ ] **ステップ 3:** E2E テストの作成
|
|
130
|
+
- **成果物:** `tests/e2e/user-registration.spec.ts`
|
|
131
|
+
- **詳細:** Playwright でユーザー登録→メール確認→ログインまでの流れをテスト
|
|
132
|
+
|
|
133
|
+
- [ ] **ステップ 4:** ドキュメント更新
|
|
134
|
+
- **成果物:** `README.md`, `docs/tasks/task000001-{スラッグ}/a-definition.md`
|
|
135
|
+
- **詳細:** セットアップ手順、環境変数設定、API 仕様を記載
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 受け入れ基準
|
|
140
|
+
|
|
141
|
+
<!--
|
|
142
|
+
受け入れ基準の記載ポイント:
|
|
143
|
+
- 機能が正しく動作すること(正常系)
|
|
144
|
+
- エラーハンドリングが適切に実装されていること(異常系)
|
|
145
|
+
- エッジケースが処理されること(境界値、特殊な入力)
|
|
146
|
+
- パフォーマンス要件を満たすこと(必要に応じて)
|
|
147
|
+
- セキュリティ要件を満たすこと(XSS, CSRF, SQL Injection など)
|
|
148
|
+
- ブラウザ互換性(必要に応じて)
|
|
149
|
+
- テストが全て通ること
|
|
150
|
+
- ドキュメントが更新されていること
|
|
151
|
+
|
|
152
|
+
各フェーズの完了を判断するための具体的な基準を記載します。
|
|
153
|
+
全ての基準を満たした時点でタスク完了とみなされます。
|
|
154
|
+
-->
|
|
155
|
+
|
|
156
|
+
### フェーズ 1 の受け入れ基準
|
|
157
|
+
|
|
158
|
+
- [ ] データベースマイグレーションが成功する
|
|
159
|
+
- [ ] 型定義が正しく適用される(TypeScript コンパイルエラーなし)
|
|
160
|
+
- [ ] メール送信 API がトークンを生成し、メールを送信する
|
|
161
|
+
- [ ] 無効なトークンでアクセスした場合、エラーが返る
|
|
162
|
+
- [ ] トークンの有効期限切れが正しく検出される
|
|
163
|
+
|
|
164
|
+
### フェーズ 2 の受け入れ基準
|
|
165
|
+
|
|
166
|
+
- [ ] メール認証ページが正しく表示される
|
|
167
|
+
- [ ] 認証成功時に成功メッセージが表示される
|
|
168
|
+
- [ ] 認証失敗時にエラーメッセージが表示される
|
|
169
|
+
- [ ] 未認証ユーザーは保護されたページにアクセスできない
|
|
170
|
+
- [ ] 認証済みユーザーは全ての機能にアクセスできる
|
|
171
|
+
|
|
172
|
+
### フェーズ 3 の受け入れ基準
|
|
173
|
+
|
|
174
|
+
- [ ] 全てのユニットテストが通る
|
|
175
|
+
- [ ] 全ての統合テストが通る
|
|
176
|
+
- [ ] E2E テストが通る(CI 環境でも実行)
|
|
177
|
+
- [ ] テストカバレッジが 80% 以上
|
|
178
|
+
- [ ] ドキュメントに記載された手順で環境構築できる
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## メモ
|
|
183
|
+
|
|
184
|
+
<!--
|
|
185
|
+
実装全体に関する補足情報
|
|
186
|
+
|
|
187
|
+
記載すべき内容:
|
|
188
|
+
- 実装中に気づいた技術的な課題
|
|
189
|
+
- リファクタリングが必要な箇所
|
|
190
|
+
- パフォーマンス最適化の余地
|
|
191
|
+
- セキュリティ上の注意点
|
|
192
|
+
- 今後の拡張予定
|
|
193
|
+
- チームメンバーへの引き継ぎ事項
|
|
194
|
+
|
|
195
|
+
例:
|
|
196
|
+
- メール送信は現在同期処理だが、将来的にはジョブキューに移行予定
|
|
197
|
+
- トークンの有効期限は現在 24 時間だが、設定ファイルで変更可能にする
|
|
198
|
+
- SendGrid の API キーは環境変数で管理(.env.example に記載)
|
|
199
|
+
- セキュリティレビュー完了(2025-01-15、レビュアー: @john)
|
|
200
|
+
-->
|
package/scripts/create-task.sh
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# create-task.sh
|
|
4
|
-
# docs/tasks/ 配下に連番 ID 付きのタスクディレクトリを作成するスクリプト
|
|
5
|
-
# Usage: bash scripts/create-task.sh <slug>
|
|
6
|
-
# 例: bash scripts/create-task.sh user-profile-edit
|
|
7
|
-
|
|
8
|
-
set -e
|
|
9
|
-
|
|
10
|
-
TASKS_DIR="docs/tasks"
|
|
11
|
-
SLUG="$1"
|
|
12
|
-
|
|
13
|
-
echo "📂 タスクディレクトリの作成を開始します..."
|
|
14
|
-
|
|
15
|
-
# 1. 引数チェック
|
|
16
|
-
if [ -z "$SLUG" ]; then
|
|
17
|
-
echo "❌ スラッグが指定されていません。"
|
|
18
|
-
echo " 使い方: bash scripts/create-task.sh <slug>"
|
|
19
|
-
echo " 例: bash scripts/create-task.sh user-profile-edit"
|
|
20
|
-
exit 1
|
|
21
|
-
fi
|
|
22
|
-
|
|
23
|
-
# 2. スラッグの形式チェック(英小文字・数字・ハイフンのみ、連続ハイフン禁止)
|
|
24
|
-
if ! [[ "$SLUG" =~ ^[a-z0-9]+(-[a-z0-9]+)*$ ]]; then
|
|
25
|
-
echo "❌ スラッグは英小文字・数字・ハイフンのみ使用できます: '$SLUG'"
|
|
26
|
-
echo " 例: user-profile-edit"
|
|
27
|
-
exit 1
|
|
28
|
-
fi
|
|
29
|
-
|
|
30
|
-
# 3. 単語数の警告(3〜5 語を推奨、範囲外は警告のみで続行)
|
|
31
|
-
WORD_COUNT=$(echo "$SLUG" | awk -F'-' '{print NF}')
|
|
32
|
-
if [ "$WORD_COUNT" -lt 3 ] || [ "$WORD_COUNT" -gt 5 ]; then
|
|
33
|
-
echo "⚠️ スラッグは 3〜5 語を推奨しています(現在: ${WORD_COUNT} 語)。"
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
# 4. docs/tasks/ の存在確認
|
|
37
|
-
if [ ! -d "$TASKS_DIR" ]; then
|
|
38
|
-
echo "❌ '$TASKS_DIR' が存在しません。"
|
|
39
|
-
echo " 先に /a-001-setup-doc-structure を実行してください。"
|
|
40
|
-
exit 1
|
|
41
|
-
fi
|
|
42
|
-
|
|
43
|
-
# 5. 既存タスクから次の ID を採番
|
|
44
|
-
MAX_ID=0
|
|
45
|
-
for dir in "$TASKS_DIR"/task*; do
|
|
46
|
-
[ -d "$dir" ] || continue
|
|
47
|
-
BASENAME=$(basename "$dir")
|
|
48
|
-
# task000123-xxx から 000123 を抜き出す
|
|
49
|
-
if [[ "$BASENAME" =~ ^task([0-9]{6})- ]]; then
|
|
50
|
-
NUM=$((10#${BASH_REMATCH[1]}))
|
|
51
|
-
if [ "$NUM" -gt "$MAX_ID" ]; then
|
|
52
|
-
MAX_ID=$NUM
|
|
53
|
-
fi
|
|
54
|
-
fi
|
|
55
|
-
done
|
|
56
|
-
|
|
57
|
-
NEXT_ID=$((MAX_ID + 1))
|
|
58
|
-
TASK_ID=$(printf "task%06d" "$NEXT_ID")
|
|
59
|
-
TASK_DIR="$TASKS_DIR/${TASK_ID}-${SLUG}"
|
|
60
|
-
|
|
61
|
-
# 6. 同名ディレクトリの存在確認(理論上発生しないが保険)
|
|
62
|
-
if [ -d "$TASK_DIR" ]; then
|
|
63
|
-
echo "❌ '$TASK_DIR' は既に存在します。"
|
|
64
|
-
exit 1
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
|
-
# 7. 作成
|
|
68
|
-
echo "🔨 ディレクトリを作成中: $TASK_DIR"
|
|
69
|
-
mkdir -p "$TASK_DIR"
|
|
70
|
-
|
|
71
|
-
# 8. 完了報告
|
|
72
|
-
echo ""
|
|
73
|
-
echo "✅ タスクディレクトリを作成しました。"
|
|
74
|
-
echo " パス: $TASK_DIR"
|
|
75
|
-
echo ""
|
|
76
|
-
echo "次のステップ:"
|
|
77
|
-
echo " - タスク定義書を作成する: /b-002-create-task-definition"
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# init-project-docs.sh
|
|
4
|
-
# templates/project/<category>/ 配下のテンプレートを
|
|
5
|
-
# docs/project/<category>/ へ一括コピーするスクリプト
|
|
6
|
-
# Usage: bash scripts/init-project-docs.sh <category>
|
|
7
|
-
# category: requirements | behavior | domain | design
|
|
8
|
-
# 例: bash scripts/init-project-docs.sh requirements
|
|
9
|
-
|
|
10
|
-
set -e
|
|
11
|
-
|
|
12
|
-
CATEGORY="$1"
|
|
13
|
-
|
|
14
|
-
# スクリプト自身の位置からテンプレートルートを解決(.claude/scripts -> .claude/templates)
|
|
15
|
-
SCRIPT_SELF_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
16
|
-
TEMPLATE_ROOT="$SCRIPT_SELF_DIR/../templates/project"
|
|
17
|
-
|
|
18
|
-
echo "📝 プロジェクトドキュメントの一括初期化を開始します..."
|
|
19
|
-
|
|
20
|
-
# 1. 引数チェック
|
|
21
|
-
if [ -z "$CATEGORY" ]; then
|
|
22
|
-
echo "❌ category 引数が指定されていません。"
|
|
23
|
-
echo " 使い方: bash scripts/init-project-docs.sh <category>"
|
|
24
|
-
echo " category: requirements | behavior | domain | design"
|
|
25
|
-
exit 1
|
|
26
|
-
fi
|
|
27
|
-
|
|
28
|
-
# 2. category を番号付きディレクトリ名にマッピング
|
|
29
|
-
case "$CATEGORY" in
|
|
30
|
-
requirements)
|
|
31
|
-
SUBDIR="01-requirements"
|
|
32
|
-
;;
|
|
33
|
-
behavior)
|
|
34
|
-
SUBDIR="02-behavior"
|
|
35
|
-
;;
|
|
36
|
-
domain)
|
|
37
|
-
SUBDIR="03-domain"
|
|
38
|
-
;;
|
|
39
|
-
design)
|
|
40
|
-
SUBDIR="04-design"
|
|
41
|
-
;;
|
|
42
|
-
*)
|
|
43
|
-
echo "❌ 不明な category: '$CATEGORY'"
|
|
44
|
-
echo " 有効な category: requirements | behavior | domain | design"
|
|
45
|
-
exit 1
|
|
46
|
-
;;
|
|
47
|
-
esac
|
|
48
|
-
|
|
49
|
-
SRC_DIR="$TEMPLATE_ROOT/$SUBDIR"
|
|
50
|
-
DEST_DIR="docs/project/$SUBDIR"
|
|
51
|
-
|
|
52
|
-
# 3. テンプレートディレクトリの存在確認
|
|
53
|
-
if [ ! -d "$SRC_DIR" ]; then
|
|
54
|
-
echo "❌ テンプレートディレクトリが見つかりません: $SRC_DIR"
|
|
55
|
-
echo " yodogawa CLI での再インストールを検討してください。"
|
|
56
|
-
exit 1
|
|
57
|
-
fi
|
|
58
|
-
|
|
59
|
-
# 4. 出力先ディレクトリの存在確認
|
|
60
|
-
if [ ! -d "$DEST_DIR" ]; then
|
|
61
|
-
echo "❌ 出力先ディレクトリが存在しません: $DEST_DIR"
|
|
62
|
-
echo " 先に /a-001-setup-doc-structure を実行してください。"
|
|
63
|
-
exit 1
|
|
64
|
-
fi
|
|
65
|
-
|
|
66
|
-
# 5. テンプレートファイルを一括コピー(既存はスキップして冪等性を確保)
|
|
67
|
-
COPIED=0
|
|
68
|
-
SKIPPED=0
|
|
69
|
-
|
|
70
|
-
for SRC_PATH in "$SRC_DIR"/*.md; do
|
|
71
|
-
[ -f "$SRC_PATH" ] || continue
|
|
72
|
-
FILENAME=$(basename "$SRC_PATH")
|
|
73
|
-
DEST_PATH="$DEST_DIR/$FILENAME"
|
|
74
|
-
|
|
75
|
-
if [ -f "$DEST_PATH" ]; then
|
|
76
|
-
echo "ℹ️ 既に存在するためスキップ: $DEST_PATH"
|
|
77
|
-
SKIPPED=$((SKIPPED + 1))
|
|
78
|
-
else
|
|
79
|
-
echo "🔨 コピー中: $SRC_PATH → $DEST_PATH"
|
|
80
|
-
cp "$SRC_PATH" "$DEST_PATH"
|
|
81
|
-
COPIED=$((COPIED + 1))
|
|
82
|
-
fi
|
|
83
|
-
done
|
|
84
|
-
|
|
85
|
-
# 6. 完了報告
|
|
86
|
-
echo ""
|
|
87
|
-
echo "✅ プロジェクトドキュメントを初期化しました。"
|
|
88
|
-
echo " カテゴリ: $CATEGORY ($SUBDIR)"
|
|
89
|
-
echo " コピー: ${COPIED} ファイル / スキップ: ${SKIPPED} ファイル"
|
|
90
|
-
echo " パス: $DEST_DIR"
|
package/scripts/init-task-doc.sh
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# init-task-doc.sh
|
|
4
|
-
# タスクディレクトリにテンプレートから指定のドキュメントをコピーするスクリプト
|
|
5
|
-
# Usage: bash scripts/init-task-doc.sh <task-dir> <type>
|
|
6
|
-
# type: definition | research | implementation
|
|
7
|
-
# 例: bash scripts/init-task-doc.sh docs/tasks/task000001-user-profile-edit definition
|
|
8
|
-
|
|
9
|
-
set -e
|
|
10
|
-
|
|
11
|
-
TASK_DIR="$1"
|
|
12
|
-
DOC_TYPE="$2"
|
|
13
|
-
|
|
14
|
-
# スクリプト自身の位置からテンプレートルートを解決(.claude/scripts -> .claude/templates)
|
|
15
|
-
SCRIPT_SELF_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
16
|
-
TEMPLATE_ROOT="$SCRIPT_SELF_DIR/../templates/tasks/task-template"
|
|
17
|
-
|
|
18
|
-
echo "📝 タスクドキュメントの初期化を開始します..."
|
|
19
|
-
|
|
20
|
-
# 1. 引数チェック
|
|
21
|
-
if [ -z "$TASK_DIR" ] || [ -z "$DOC_TYPE" ]; then
|
|
22
|
-
echo "❌ 引数が不足しています。"
|
|
23
|
-
echo " 使い方: bash scripts/init-task-doc.sh <task-dir> <type>"
|
|
24
|
-
echo " type: definition | research | implementation"
|
|
25
|
-
echo " 例: bash scripts/init-task-doc.sh docs/tasks/task000001-login definition"
|
|
26
|
-
exit 1
|
|
27
|
-
fi
|
|
28
|
-
|
|
29
|
-
# 2. タスクディレクトリの存在確認
|
|
30
|
-
if [ ! -d "$TASK_DIR" ]; then
|
|
31
|
-
echo "❌ タスクディレクトリが存在しません: $TASK_DIR"
|
|
32
|
-
echo " 先に /b-001-create-task-directory を実行してください。"
|
|
33
|
-
exit 1
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
# 3. type をファイル名にマッピング
|
|
37
|
-
case "$DOC_TYPE" in
|
|
38
|
-
definition)
|
|
39
|
-
SRC_FILE="a-definition.md"
|
|
40
|
-
;;
|
|
41
|
-
research)
|
|
42
|
-
SRC_FILE="b-research.md"
|
|
43
|
-
;;
|
|
44
|
-
implementation)
|
|
45
|
-
SRC_FILE="c-implementation.md"
|
|
46
|
-
;;
|
|
47
|
-
*)
|
|
48
|
-
echo "❌ 不明な type: '$DOC_TYPE'"
|
|
49
|
-
echo " 有効な type: definition | research | implementation"
|
|
50
|
-
exit 1
|
|
51
|
-
;;
|
|
52
|
-
esac
|
|
53
|
-
|
|
54
|
-
SRC_PATH="$TEMPLATE_ROOT/$SRC_FILE"
|
|
55
|
-
DEST_PATH="$TASK_DIR/$SRC_FILE"
|
|
56
|
-
|
|
57
|
-
# 4. テンプレートの存在確認
|
|
58
|
-
if [ ! -f "$SRC_PATH" ]; then
|
|
59
|
-
echo "❌ テンプレートが見つかりません: $SRC_PATH"
|
|
60
|
-
echo " yodogawa CLI での再インストールを検討してください。"
|
|
61
|
-
exit 1
|
|
62
|
-
fi
|
|
63
|
-
|
|
64
|
-
# 5. 既存ファイルはスキップ(冪等性)
|
|
65
|
-
if [ -f "$DEST_PATH" ]; then
|
|
66
|
-
echo "ℹ️ 既に存在するためスキップ: $DEST_PATH"
|
|
67
|
-
exit 0
|
|
68
|
-
fi
|
|
69
|
-
|
|
70
|
-
# 6. コピー
|
|
71
|
-
echo "🔨 コピー中: $SRC_PATH → $DEST_PATH"
|
|
72
|
-
cp "$SRC_PATH" "$DEST_PATH"
|
|
73
|
-
|
|
74
|
-
# 7. 完了報告
|
|
75
|
-
echo ""
|
|
76
|
-
echo "✅ タスクドキュメントを初期化しました。"
|
|
77
|
-
echo " パス: $DEST_PATH"
|