create-ai-project 1.11.2
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/.claude/agents/acceptance-test-generator.md +316 -0
- package/.claude/agents/code-reviewer.md +193 -0
- package/.claude/agents/document-reviewer.md +182 -0
- package/.claude/agents/prd-creator.md +186 -0
- package/.claude/agents/quality-fixer.md +295 -0
- package/.claude/agents/requirement-analyzer.md +161 -0
- package/.claude/agents/rule-advisor.md +194 -0
- package/.claude/agents/task-decomposer.md +291 -0
- package/.claude/agents/task-executor.md +270 -0
- package/.claude/agents/technical-designer.md +343 -0
- package/.claude/agents/work-planner.md +181 -0
- package/.claude/agents-en/acceptance-test-generator.md +256 -0
- package/.claude/agents-en/code-reviewer.md +195 -0
- package/.claude/agents-en/design-sync.md +225 -0
- package/.claude/agents-en/document-reviewer.md +190 -0
- package/.claude/agents-en/integration-test-reviewer.md +195 -0
- package/.claude/agents-en/prd-creator.md +196 -0
- package/.claude/agents-en/quality-fixer-frontend.md +334 -0
- package/.claude/agents-en/quality-fixer.md +291 -0
- package/.claude/agents-en/requirement-analyzer.md +165 -0
- package/.claude/agents-en/rule-advisor.md +194 -0
- package/.claude/agents-en/task-decomposer.md +291 -0
- package/.claude/agents-en/task-executor-frontend.md +276 -0
- package/.claude/agents-en/task-executor.md +272 -0
- package/.claude/agents-en/technical-designer-frontend.md +441 -0
- package/.claude/agents-en/technical-designer.md +371 -0
- package/.claude/agents-en/work-planner.md +216 -0
- package/.claude/agents-ja/acceptance-test-generator.md +256 -0
- package/.claude/agents-ja/code-reviewer.md +195 -0
- package/.claude/agents-ja/design-sync.md +225 -0
- package/.claude/agents-ja/document-reviewer.md +192 -0
- package/.claude/agents-ja/integration-test-reviewer.md +195 -0
- package/.claude/agents-ja/prd-creator.md +194 -0
- package/.claude/agents-ja/quality-fixer-frontend.md +335 -0
- package/.claude/agents-ja/quality-fixer.md +292 -0
- package/.claude/agents-ja/requirement-analyzer.md +164 -0
- package/.claude/agents-ja/rule-advisor.md +194 -0
- package/.claude/agents-ja/task-decomposer.md +291 -0
- package/.claude/agents-ja/task-executor-frontend.md +276 -0
- package/.claude/agents-ja/task-executor.md +272 -0
- package/.claude/agents-ja/technical-designer-frontend.md +442 -0
- package/.claude/agents-ja/technical-designer.md +370 -0
- package/.claude/agents-ja/work-planner.md +213 -0
- package/.claude/commands/build.md +78 -0
- package/.claude/commands/design.md +27 -0
- package/.claude/commands/implement.md +79 -0
- package/.claude/commands/plan.md +43 -0
- package/.claude/commands/project-inject.md +76 -0
- package/.claude/commands/refine-rule.md +206 -0
- package/.claude/commands/review.md +78 -0
- package/.claude/commands/sync-rules.md +116 -0
- package/.claude/commands/task.md +13 -0
- package/.claude/commands-en/build.md +77 -0
- package/.claude/commands-en/design.md +39 -0
- package/.claude/commands-en/front-build.md +103 -0
- package/.claude/commands-en/front-design.md +42 -0
- package/.claude/commands-en/front-plan.md +40 -0
- package/.claude/commands-en/implement.md +75 -0
- package/.claude/commands-en/plan.md +45 -0
- package/.claude/commands-en/project-inject.md +76 -0
- package/.claude/commands-en/refine-rule.md +208 -0
- package/.claude/commands-en/review.md +78 -0
- package/.claude/commands-en/sync-rules.md +116 -0
- package/.claude/commands-en/task.md +13 -0
- package/.claude/commands-ja/build.md +75 -0
- package/.claude/commands-ja/design.md +37 -0
- package/.claude/commands-ja/front-build.md +103 -0
- package/.claude/commands-ja/front-design.md +42 -0
- package/.claude/commands-ja/front-plan.md +40 -0
- package/.claude/commands-ja/implement.md +73 -0
- package/.claude/commands-ja/plan.md +43 -0
- package/.claude/commands-ja/project-inject.md +76 -0
- package/.claude/commands-ja/refine-rule.md +206 -0
- package/.claude/commands-ja/review.md +78 -0
- package/.claude/commands-ja/sync-rules.md +116 -0
- package/.claude/commands-ja/task.md +13 -0
- package/.claude/settings.local.json +74 -0
- package/.husky/pre-commit +1 -0
- package/.husky/pre-push +3 -0
- package/.madgerc +14 -0
- package/.tsprunerc +11 -0
- package/CLAUDE.en.md +102 -0
- package/CLAUDE.ja.md +102 -0
- package/CLAUDE.md +111 -0
- package/LICENSE +21 -0
- package/README.ja.md +233 -0
- package/README.md +243 -0
- package/bin/create-project.js +87 -0
- package/biome.json +51 -0
- package/docs/adr/template-en.md +64 -0
- package/docs/adr/template-ja.md +64 -0
- package/docs/design/template-en.md +281 -0
- package/docs/design/template-ja.md +285 -0
- package/docs/guides/en/quickstart.md +111 -0
- package/docs/guides/en/rule-editing-guide.md +266 -0
- package/docs/guides/en/sub-agents.md +343 -0
- package/docs/guides/en/use-cases.md +308 -0
- package/docs/guides/ja/quickstart.md +112 -0
- package/docs/guides/ja/rule-editing-guide.md +266 -0
- package/docs/guides/ja/sub-agents.md +343 -0
- package/docs/guides/ja/use-cases.md +290 -0
- package/docs/guides/sub-agents.md +306 -0
- package/docs/plans/20250123-integration-test-improvement.md +993 -0
- package/docs/plans/template-en.md +130 -0
- package/docs/plans/template-ja.md +130 -0
- package/docs/prd/template-en.md +109 -0
- package/docs/prd/template-ja.md +109 -0
- package/docs/rules/ai-development-guide.md +260 -0
- package/docs/rules/architecture/implementation-approach.md +136 -0
- package/docs/rules/documentation-criteria.md +180 -0
- package/docs/rules/project-context.md +38 -0
- package/docs/rules/rules-index.yaml +137 -0
- package/docs/rules/technical-spec.md +47 -0
- package/docs/rules/typescript-testing.md +188 -0
- package/docs/rules/typescript.md +166 -0
- package/docs/rules-en/architecture/implementation-approach.md +136 -0
- package/docs/rules-en/coding-standards.md +333 -0
- package/docs/rules-en/documentation-criteria.md +184 -0
- package/docs/rules-en/frontend/technical-spec.md +143 -0
- package/docs/rules-en/frontend/typescript-testing.md +124 -0
- package/docs/rules-en/frontend/typescript.md +131 -0
- package/docs/rules-en/integration-e2e-testing.md +149 -0
- package/docs/rules-en/project-context.md +38 -0
- package/docs/rules-en/rules-index.yaml +211 -0
- package/docs/rules-en/technical-spec.md +86 -0
- package/docs/rules-en/typescript-testing.md +149 -0
- package/docs/rules-en/typescript.md +116 -0
- package/docs/rules-ja/architecture/implementation-approach.md +136 -0
- package/docs/rules-ja/coding-standards.md +333 -0
- package/docs/rules-ja/documentation-criteria.md +180 -0
- package/docs/rules-ja/frontend/technical-spec.md +143 -0
- package/docs/rules-ja/frontend/typescript-testing.md +124 -0
- package/docs/rules-ja/frontend/typescript.md +131 -0
- package/docs/rules-ja/integration-e2e-testing.md +149 -0
- package/docs/rules-ja/project-context.md +38 -0
- package/docs/rules-ja/rules-index.yaml +196 -0
- package/docs/rules-ja/technical-spec.md +86 -0
- package/docs/rules-ja/typescript-testing.md +149 -0
- package/docs/rules-ja/typescript.md +116 -0
- package/package.json +98 -0
- package/scripts/check-unused-exports.js +69 -0
- package/scripts/cleanup-test-processes.sh +32 -0
- package/scripts/post-setup.js +110 -0
- package/scripts/set-language.js +310 -0
- package/scripts/setup-project.js +199 -0
- package/scripts/show-coverage.js +74 -0
- package/src/index.ts +11 -0
- package/templates/.gitignore.template +52 -0
- package/tsconfig.json +50 -0
- package/vitest.config.mjs +47 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# 普遍的コーディング規約
|
|
2
|
+
|
|
3
|
+
## 技術的アンチパターン(赤信号パターン)
|
|
4
|
+
|
|
5
|
+
以下のパターンを検出したら即座に停止し、設計を見直すこと:
|
|
6
|
+
|
|
7
|
+
### コード品質のアンチパターン
|
|
8
|
+
1. **同じようなコードを3回以上書いた** - Rule of Threeに違反
|
|
9
|
+
2. **単一ファイルに複数の責務が混在** - 単一責任原則(SRP)違反
|
|
10
|
+
3. **同じ内容を複数ファイルで定義** - DRY原則違反
|
|
11
|
+
4. **依存関係を確認せずに変更** - 予期しない影響の可能性
|
|
12
|
+
5. **コメントアウトでコード無効化** - バージョン管理を活用すべき
|
|
13
|
+
6. **エラーの握りつぶし** - 問題の隠蔽は技術的負債
|
|
14
|
+
7. **型アサーション(as)の多用** - 型安全性の放棄
|
|
15
|
+
|
|
16
|
+
### 設計のアンチパターン
|
|
17
|
+
- **「一旦動くように」という思考** - 技術的負債の蓄積
|
|
18
|
+
- **継ぎ足し実装** - 既存コードへの無計画な追加
|
|
19
|
+
- **不確実技術の楽観的実装** - 未知要素を「たぶん動く」前提で設計
|
|
20
|
+
- **対処療法的修正** - 根本原因を解決しない表面的な修正
|
|
21
|
+
- **無計画な大規模変更** - 段階的アプローチの欠如
|
|
22
|
+
|
|
23
|
+
## 基本原則
|
|
24
|
+
|
|
25
|
+
✅ **積極的なリファクタリング** - 技術的負債を防ぎ、健全性を維持
|
|
26
|
+
❌ **使われない「念のため」のコード** - YAGNI原則(Kent Beck)に反する
|
|
27
|
+
|
|
28
|
+
## コメント記述ルール
|
|
29
|
+
- **機能説明重視**: コードが「何をするか」を記述
|
|
30
|
+
- **履歴情報禁止**: 開発履歴は記載しない
|
|
31
|
+
- **タイムレス**: いつ読んでも有効な内容のみ記述
|
|
32
|
+
- **簡潔性**: 必要最小限の説明にとどめる
|
|
33
|
+
|
|
34
|
+
## エラーハンドリングの基本原則
|
|
35
|
+
|
|
36
|
+
### Fail-Fast原則
|
|
37
|
+
エラー時は速やかに失敗させ、不正な状態での処理継続を防ぐ。エラーの握りつぶしは禁止。
|
|
38
|
+
|
|
39
|
+
詳細な実装方法(Result型、カスタムエラークラス、層別エラー処理など)は各言語・フレームワークのルールを参照。
|
|
40
|
+
|
|
41
|
+
## Rule of Three - コード重複の判断基準
|
|
42
|
+
|
|
43
|
+
Martin Fowler「Refactoring」に基づく重複コードの扱い方:
|
|
44
|
+
|
|
45
|
+
| 重複回数 | 対応 | 理由 |
|
|
46
|
+
|---------|------|------|
|
|
47
|
+
| 1回目 | インライン実装 | 将来の変化が予測できない |
|
|
48
|
+
| 2回目 | 将来の統合を意識 | パターンが見え始める |
|
|
49
|
+
| 3回目 | 共通化実施 | パターンが確立された |
|
|
50
|
+
|
|
51
|
+
### 共通化の判断基準
|
|
52
|
+
|
|
53
|
+
**共通化すべきケース**
|
|
54
|
+
- ビジネスロジックの重複
|
|
55
|
+
- 複雑な処理アルゴリズム
|
|
56
|
+
- 一括変更が必要になる可能性が高い箇所
|
|
57
|
+
- バリデーションルール
|
|
58
|
+
|
|
59
|
+
**共通化を避けるべきケース**
|
|
60
|
+
- 偶然の一致(たまたま同じコード)
|
|
61
|
+
- 将来異なる方向に進化する可能性
|
|
62
|
+
- 共通化により可読性が著しく低下
|
|
63
|
+
- テストコード内の簡単なヘルパー
|
|
64
|
+
|
|
65
|
+
### 実装例
|
|
66
|
+
```typescript
|
|
67
|
+
// ❌ 1回目の重複で即共通化
|
|
68
|
+
function validateUserEmail(email: string) { /* ... */ }
|
|
69
|
+
function validateContactEmail(email: string) { /* ... */ }
|
|
70
|
+
|
|
71
|
+
// ✅ 3回目で共通化
|
|
72
|
+
function validateEmail(email: string, context: 'user' | 'contact' | 'admin') { /* ... */ }
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## よくある失敗パターンと回避方法
|
|
76
|
+
|
|
77
|
+
### パターン1: エラー修正の連鎖
|
|
78
|
+
**症状**: エラーを修正すると新しいエラーが発生
|
|
79
|
+
**原因**: 根本原因を理解せずに表面的な修正
|
|
80
|
+
**回避方法**: 5 Whysで根本原因を特定してから修正
|
|
81
|
+
|
|
82
|
+
### パターン2: 型安全性の放棄
|
|
83
|
+
**症状**: any型やasの多用
|
|
84
|
+
**原因**: 型エラーを回避したい衝動
|
|
85
|
+
**回避方法**: unknown型と型ガードで安全に処理
|
|
86
|
+
|
|
87
|
+
### パターン3: テスト不足での実装
|
|
88
|
+
**症状**: 実装後にバグ多発
|
|
89
|
+
**原因**: Red-Green-Refactorプロセスの無視
|
|
90
|
+
**回避方法**: 必ず失敗するテストから開始
|
|
91
|
+
|
|
92
|
+
### パターン4: 技術的不確実性の無視
|
|
93
|
+
**症状**: 新技術導入時の想定外エラー多発
|
|
94
|
+
**原因**: 事前調査なしで「公式ドキュメント通りなら動くはず」
|
|
95
|
+
**回避方法**:
|
|
96
|
+
- タスクファイル冒頭に確実性評価を記載
|
|
97
|
+
```
|
|
98
|
+
確実性: low(理由: MCP接続の実例がない)
|
|
99
|
+
探索的実装: true
|
|
100
|
+
フォールバック: 従来APIを使用
|
|
101
|
+
```
|
|
102
|
+
- 確実性lowの場合、最初に最小限の動作確認コードを作成
|
|
103
|
+
- 動作確認できたら本実装、できなければフォールバック実行
|
|
104
|
+
|
|
105
|
+
### パターン5: 既存コード調査不足
|
|
106
|
+
**症状**: 重複実装、アーキテクチャ不整合、結合時の障害
|
|
107
|
+
**原因**: 実装前の既存コード理解不足
|
|
108
|
+
**回避方法**:
|
|
109
|
+
- 実装前に類似機能の存在を必ず検索(同じドメイン、責務、設定パターンをキーワードに)
|
|
110
|
+
- 類似機能を発見 → その実装を使用する(新規実装は行わない)
|
|
111
|
+
- 類似機能が技術的負債 → ADRで改善提案を作成してから実装
|
|
112
|
+
- 類似機能が存在しない → 既存の設計思想に沿って新規実装
|
|
113
|
+
- すべての判断と根拠をDesign Docの「既存コードベース分析」セクションに記録
|
|
114
|
+
|
|
115
|
+
## デバッグ手法
|
|
116
|
+
|
|
117
|
+
### 1. エラー分析手順
|
|
118
|
+
1. エラーメッセージ(最初の行)を正確に読む
|
|
119
|
+
2. スタックトレースの最初と最後に注目
|
|
120
|
+
3. 自分のコードが現れる最初の行を特定
|
|
121
|
+
|
|
122
|
+
### 2. 5 Whys - 根本原因分析
|
|
123
|
+
```
|
|
124
|
+
症状: TypeScriptのビルドエラー
|
|
125
|
+
Why1: 型定義が一致しない → Why2: インターフェースが更新された
|
|
126
|
+
Why3: 依存関係の変更 → Why4: パッケージ更新の影響
|
|
127
|
+
Why5: 破壊的変更を含むメジャーバージョンアップ
|
|
128
|
+
根本原因: package.jsonでのバージョン指定が不適切
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 3. 最小再現コード
|
|
132
|
+
問題を切り分けるため、最小限のコードで再現を試みる:
|
|
133
|
+
- 関連のない部分を削除
|
|
134
|
+
- モックで外部依存を置き換え
|
|
135
|
+
- 問題が再現する最小構成を作成
|
|
136
|
+
|
|
137
|
+
### 4. デバッグログ出力
|
|
138
|
+
```typescript
|
|
139
|
+
console.log('DEBUG:', {
|
|
140
|
+
context: 'user-creation',
|
|
141
|
+
input: { email, name },
|
|
142
|
+
state: currentState,
|
|
143
|
+
timestamp: new Date().toISOString()
|
|
144
|
+
})
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## 型安全性の基礎
|
|
148
|
+
|
|
149
|
+
**型安全の原則**: `unknown`型と型ガードを使用する。`any`型は型チェックを無効化し、実行時エラーの原因となる。
|
|
150
|
+
|
|
151
|
+
**any型の代替手段(優先順位順)**
|
|
152
|
+
1. **unknown型 + 型ガード**: 外部入力の検証に使用
|
|
153
|
+
2. **ジェネリクス**: 型の柔軟性が必要な場合
|
|
154
|
+
3. **ユニオン型・インターセクション型**: 複数の型の組み合わせ
|
|
155
|
+
4. **型アサーション(最終手段)**: 型が確実な場合のみ
|
|
156
|
+
|
|
157
|
+
**型ガードの実装パターン**
|
|
158
|
+
```typescript
|
|
159
|
+
function isUser(value: unknown): value is User {
|
|
160
|
+
return typeof value === 'object' && value !== null && 'id' in value && 'name' in value
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**モダンな型機能の活用**
|
|
165
|
+
- **satisfies演算子**: `const config = { port: 3000 } satisfies Config` - 型推論維持
|
|
166
|
+
- **const assertion**: `const ROUTES = { HOME: '/' } as const satisfies Routes` - 不変かつ型安全
|
|
167
|
+
- **ブランド型**: `type UserId = string & { __brand: 'UserId' }` - 意味を区別
|
|
168
|
+
- **テンプレートリテラル型**: `type Endpoint = \`\${HttpMethod} \${Route}\`` - 文字列パターンを型で表現
|
|
169
|
+
|
|
170
|
+
**型の複雑性管理**
|
|
171
|
+
- フィールド数: 20個まで(超えたら責務で分割、外部API型は例外)
|
|
172
|
+
- オプショナル率: 30%まで(超えたら必須/任意で分離)
|
|
173
|
+
- ネスト深さ: 3階層まで(超えたらフラット化)
|
|
174
|
+
- 型アサーション: 3回以上使用したら設計見直し
|
|
175
|
+
- **外部API型の扱い**: 制約を緩和し、実態に合わせて定義(内部では適切に変換)
|
|
176
|
+
|
|
177
|
+
## リファクタリング手法
|
|
178
|
+
|
|
179
|
+
**基本方針**
|
|
180
|
+
- 小さなステップ: 段階的改善により、常に動作する状態を維持
|
|
181
|
+
- 安全な変更: 一度に変更する範囲を最小限に抑制
|
|
182
|
+
- 動作保証: 既存の動作を変えないことを確認しながら進める
|
|
183
|
+
|
|
184
|
+
**実施手順**: 現状把握 → 段階的変更 → 動作確認 → 最終検証
|
|
185
|
+
|
|
186
|
+
**優先順位**: 重複コード削除 > 長大な関数分割 > 複雑な条件分岐簡素化 > 型安全性向上
|
|
187
|
+
|
|
188
|
+
## 技術的判断が必要な場面
|
|
189
|
+
|
|
190
|
+
### 抽象化のタイミング
|
|
191
|
+
- 具体的な実装を3回書いてからパターンを抽出
|
|
192
|
+
- YAGNIを意識し、現在必要な機能のみ実装
|
|
193
|
+
- 将来の拡張性より現在のシンプルさを優先
|
|
194
|
+
|
|
195
|
+
### パフォーマンス vs 可読性
|
|
196
|
+
- 明確なボトルネックがない限り可読性を優先
|
|
197
|
+
- 計測してから最適化(推測するな、計測せよ)
|
|
198
|
+
- 最適化する場合はコメントで理由を明記
|
|
199
|
+
|
|
200
|
+
### 型定義の粒度
|
|
201
|
+
- 過度に細かい型は保守性を低下させる
|
|
202
|
+
- ドメインを適切に表現する型を設計
|
|
203
|
+
- ユーティリティ型を活用して重複を削減
|
|
204
|
+
|
|
205
|
+
## 継続的改善のマインドセット
|
|
206
|
+
|
|
207
|
+
- **謙虚**: 完璧なコードは存在しない、フィードバック歓迎
|
|
208
|
+
- **勇気**: 必要なリファクタリングは大胆に実行
|
|
209
|
+
- **透明性**: 技術的な判断理由を明確に記録
|
|
210
|
+
|
|
211
|
+
## 実装作業の完全性担保
|
|
212
|
+
|
|
213
|
+
### 影響範囲調査の必須手順
|
|
214
|
+
|
|
215
|
+
**完了定義**: 以下3段階すべての完了
|
|
216
|
+
|
|
217
|
+
#### 1. 検索(Discovery)
|
|
218
|
+
```bash
|
|
219
|
+
Grep -n "TargetClass\|TargetMethod" -o content
|
|
220
|
+
Grep -n "DependencyClass" -o content
|
|
221
|
+
Grep -n "targetData\|SetData\|UpdateData" -o content
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
#### 2. 読解(Understanding)
|
|
225
|
+
**必須**: 発見した全ファイルを読み込み、作業に必要な部分をコンテキストに含める:
|
|
226
|
+
- 呼び出し元の目的と文脈
|
|
227
|
+
- 依存関係の方向
|
|
228
|
+
- データフロー: 生成→変更→参照
|
|
229
|
+
|
|
230
|
+
#### 3. 特定(Identification)
|
|
231
|
+
影響範囲の構造化報告(必須):
|
|
232
|
+
```
|
|
233
|
+
## 影響範囲分析
|
|
234
|
+
### 直接影響: ClassA、ClassB(理由明記)
|
|
235
|
+
### 間接影響: SystemX、PrefabY(連携経路明記)
|
|
236
|
+
### 処理フロー: 入力→処理1→処理2→出力
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**重要**: 検索のみで完了とせず、3段階すべてを実行すること
|
|
240
|
+
|
|
241
|
+
### 未使用コード削除ルール
|
|
242
|
+
|
|
243
|
+
未使用コード検出時 → 使用予定?
|
|
244
|
+
- Yes → 即実装(保留禁止)
|
|
245
|
+
- No → 即削除(Git履歴に残る)
|
|
246
|
+
|
|
247
|
+
対象: コード・ドキュメント・設定ファイル
|
|
248
|
+
|
|
249
|
+
### 既存コード削除判断フロー
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
使用中? No → 即削除(Git履歴に残る)
|
|
253
|
+
Yes → 動作? No → 削除+再実装
|
|
254
|
+
Yes → 修正
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## Red-Green-Refactorプロセス(テストファースト開発)
|
|
258
|
+
|
|
259
|
+
**推奨原則**: コード変更は必ずテストから始める
|
|
260
|
+
|
|
261
|
+
**背景**:
|
|
262
|
+
- 変更前の動作を保証し、リグレッションを防止
|
|
263
|
+
- 期待する動作を明確化してから実装
|
|
264
|
+
- リファクタリング時の安全性を確保
|
|
265
|
+
|
|
266
|
+
**開発ステップ**:
|
|
267
|
+
1. **Red**: 期待する動作のテストを書く(失敗する)
|
|
268
|
+
2. **Green**: 最小限の実装でテストを通す
|
|
269
|
+
3. **Refactor**: テストが通る状態を維持しながらコード改善
|
|
270
|
+
|
|
271
|
+
**NGケース(テストファースト不要)**:
|
|
272
|
+
- 純粋な設定ファイル変更(.env、config等)
|
|
273
|
+
- ドキュメントのみの更新(README、コメント等)
|
|
274
|
+
- 緊急本番障害対応(ただし事後テスト必須)
|
|
275
|
+
|
|
276
|
+
## テスト設計原則
|
|
277
|
+
|
|
278
|
+
### テストケースの構造
|
|
279
|
+
- テストは「準備(Arrange)」「実行(Act)」「検証(Assert)」の3段階で構成
|
|
280
|
+
- 各テストの目的が明確に分かる命名
|
|
281
|
+
- 1つのテストケースでは1つの振る舞いのみを検証
|
|
282
|
+
|
|
283
|
+
### テストデータ管理
|
|
284
|
+
- テストデータは専用ディレクトリで管理
|
|
285
|
+
- 環境変数はテスト用の値を定義
|
|
286
|
+
- 機密情報は必ずモック化
|
|
287
|
+
- テストデータは最小限に保ち、テストケースの検証目的に直接関連するデータのみ使用
|
|
288
|
+
|
|
289
|
+
### モックとスタブの使用方針
|
|
290
|
+
|
|
291
|
+
✅ **推奨: 単体テストでの外部依存モック化**
|
|
292
|
+
- メリット: テストの独立性と再現性を確保
|
|
293
|
+
- 実践: DB、API、ファイルシステム等の外部依存をモック化
|
|
294
|
+
|
|
295
|
+
❌ **避けるべき: 単体テストでの実際の外部接続**
|
|
296
|
+
- 理由: テスト速度が遅くなり、環境依存の問題が発生するため
|
|
297
|
+
|
|
298
|
+
### テスト失敗時の対応判断基準
|
|
299
|
+
|
|
300
|
+
**テストを修正**: 間違った期待値、存在しない機能参照、実装詳細への依存、テストのためだけの実装
|
|
301
|
+
**実装を修正**: 妥当な仕様、ビジネスロジック、重要なエッジケース
|
|
302
|
+
**判断に迷ったら**: ユーザーに確認
|
|
303
|
+
|
|
304
|
+
## テストヘルパーの活用ルール
|
|
305
|
+
|
|
306
|
+
### 基本原則
|
|
307
|
+
テストヘルパーは、テストコードの重複を減らし、保守性を高めるために活用します。
|
|
308
|
+
|
|
309
|
+
### 判断基準
|
|
310
|
+
| モックの特性 | 対応方針 |
|
|
311
|
+
|-------------|---------|
|
|
312
|
+
| **単純で安定** | 共通ヘルパーに集約 |
|
|
313
|
+
| **複雑または変更頻度高** | 個別実装 |
|
|
314
|
+
| **3箇所以上で重複** | 共通化を検討 |
|
|
315
|
+
| **テスト固有ロジック** | 個別実装 |
|
|
316
|
+
|
|
317
|
+
## テストの粒度原則
|
|
318
|
+
|
|
319
|
+
### 原則:観測可能な振る舞いのみ
|
|
320
|
+
**テスト対象**:公開API、戻り値、例外、外部呼び出し、永続化された状態
|
|
321
|
+
**テスト対象外**:privateメソッド、内部状態、アルゴリズム詳細
|
|
322
|
+
|
|
323
|
+
```typescript
|
|
324
|
+
// ✅ 振る舞いをテスト
|
|
325
|
+
expect(calculatePrice(100, 0.1)).toBe(110)
|
|
326
|
+
|
|
327
|
+
// ❌ 実装詳細をテスト
|
|
328
|
+
expect((calculator as any).taxRate).toBe(0.1)
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
## 継続性テストの範囲
|
|
332
|
+
|
|
333
|
+
新機能追加時の既存機能への影響確認に限定。長時間運用・負荷テストはインフラ層の責務のため対象外。
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# ドキュメント作成基準
|
|
2
|
+
|
|
3
|
+
## 作成判定マトリクス
|
|
4
|
+
|
|
5
|
+
| 条件 | 必要ドキュメント | 作成順序 |
|
|
6
|
+
|-----|--------------|---------|
|
|
7
|
+
| 新機能追加 | PRD → [ADR] → Design Doc → 作業計画書 | PRD承認後 |
|
|
8
|
+
| ADR条件該当(下記参照) | ADR → Design Doc → 作業計画書 | 即座に開始 |
|
|
9
|
+
| 6ファイル以上 | ADR → Design Doc → 作業計画書(必須) | 即座に開始 |
|
|
10
|
+
| 3-5ファイル | Design Doc → 作業計画書(推奨) | 即座に開始 |
|
|
11
|
+
| 1-2ファイル | なし | 直接実装 |
|
|
12
|
+
|
|
13
|
+
## ADR作成条件(いずれか該当で必須)
|
|
14
|
+
|
|
15
|
+
### 1. 型システム変更
|
|
16
|
+
- **3階層以上のネスト型追加**: `type A = { b: { c: { d: T } } }`
|
|
17
|
+
- 判断理由: 深いネストは複雑性が高く、影響範囲が広い
|
|
18
|
+
- **3箇所以上で使用される型の変更・削除**
|
|
19
|
+
- 判断理由: 複数箇所への影響は慎重な判断が必要
|
|
20
|
+
- **型の責務変更**(例: DTO→Entity)
|
|
21
|
+
- 判断理由: 概念モデルの変更は設計思想に関わる
|
|
22
|
+
|
|
23
|
+
### 2. データフロー変更
|
|
24
|
+
- **保存場所変更**(DB→ファイル、メモリ→キャッシュ)
|
|
25
|
+
- **3ステップ以上の処理順序変更**
|
|
26
|
+
- 例: 「入力→検証→保存」から「入力→保存→非同期検証」
|
|
27
|
+
- **データ受け渡し方法変更**(props→Context、直接参照→イベント)
|
|
28
|
+
|
|
29
|
+
### 3. アーキテクチャ変更
|
|
30
|
+
- レイヤー追加・責務変更・コンポーネント再配置
|
|
31
|
+
|
|
32
|
+
### 4. 外部依存変更
|
|
33
|
+
- ライブラリ・フレームワーク・外部API導入・置換
|
|
34
|
+
|
|
35
|
+
### 5. 複雑な実装ロジック(規模に関わらず)
|
|
36
|
+
- 3つ以上の状態を管理
|
|
37
|
+
- 5つ以上の非同期処理の連携
|
|
38
|
+
|
|
39
|
+
## 各ドキュメントの詳細定義
|
|
40
|
+
|
|
41
|
+
### PRD(Product Requirements Document)
|
|
42
|
+
|
|
43
|
+
**目的**: ビジネス要件とユーザー価値を定義
|
|
44
|
+
|
|
45
|
+
**含むもの**:
|
|
46
|
+
- ビジネス要件とユーザー価値
|
|
47
|
+
- 成功指標とKPI(測定可能な形式)
|
|
48
|
+
- ユーザーストーリーとユースケース
|
|
49
|
+
- MoSCoW法による優先順位(Must/Should/Could/Won't)
|
|
50
|
+
- MVPとFutureフェーズの分離
|
|
51
|
+
- ユーザージャーニー図(必須)
|
|
52
|
+
- スコープ境界図(必須)
|
|
53
|
+
|
|
54
|
+
**含まないもの**:
|
|
55
|
+
- 技術実装詳細(→Design Doc)
|
|
56
|
+
- 技術選定理由(→ADR)
|
|
57
|
+
- **実装フェーズ**(→作業計画書)
|
|
58
|
+
- **タスク分解**(→作業計画書)
|
|
59
|
+
|
|
60
|
+
### ADR(Architecture Decision Record)
|
|
61
|
+
|
|
62
|
+
**目的**: 技術的決定の理由と背景を記録
|
|
63
|
+
|
|
64
|
+
**含むもの**:
|
|
65
|
+
- 決定事項(何を選択したか)
|
|
66
|
+
- 根拠(なぜその選択をしたか)
|
|
67
|
+
- 選択肢の比較(最低3案)とトレードオフ
|
|
68
|
+
- アーキテクチャへの影響
|
|
69
|
+
- 実装への原則的な指針(例:「依存性注入を使用」)
|
|
70
|
+
|
|
71
|
+
**含まないもの**:
|
|
72
|
+
- 実装スケジュール、期間(→作業計画書)
|
|
73
|
+
- 実装手順の詳細(→Design Doc)
|
|
74
|
+
- 具体的なコード例(→Design Doc)
|
|
75
|
+
- 担当者の割り当て(→作業計画書)
|
|
76
|
+
|
|
77
|
+
### Design Document
|
|
78
|
+
|
|
79
|
+
**目的**: 技術的実装方法を詳細定義
|
|
80
|
+
|
|
81
|
+
**含むもの**:
|
|
82
|
+
- **既存コードベース分析**(必須)
|
|
83
|
+
- 実装パスマッピング(既存と新規の両方を記載)
|
|
84
|
+
- 統合点の明確化(新規実装でも既存との接続点を記載)
|
|
85
|
+
- 技術的実装アプローチ(垂直/水平/ハイブリッド)
|
|
86
|
+
- **技術的依存関係と実装制約**(実装の必要順序)
|
|
87
|
+
- インターフェース定義と型定義
|
|
88
|
+
- データフローとコンポーネント設計
|
|
89
|
+
- **統合ポイントでのE2E確認手順**
|
|
90
|
+
- **受入条件(EARS形式: When/While/If-then/無印)**
|
|
91
|
+
- 変更影響マップ(直接影響/間接影響/波及なしを明記)
|
|
92
|
+
- 統合点の完全な列挙
|
|
93
|
+
- データ契約の明確化
|
|
94
|
+
- **合意事項チェックリスト**(関係者との合意内容)
|
|
95
|
+
- **前提となるADR**(共通ADR含む)
|
|
96
|
+
|
|
97
|
+
**必須構造要素**:
|
|
98
|
+
```yaml
|
|
99
|
+
変更影響マップ:
|
|
100
|
+
変更対象: [コンポーネント/機能]
|
|
101
|
+
直接影響: [ファイル/関数]
|
|
102
|
+
間接影響: [データ形式/処理時間]
|
|
103
|
+
波及なし: [影響を受けない機能]
|
|
104
|
+
|
|
105
|
+
インターフェース変更マトリクス:
|
|
106
|
+
既存: [メソッド名]
|
|
107
|
+
新規: [メソッド名]
|
|
108
|
+
変換必要性: [あり/なし]
|
|
109
|
+
互換性確保: [方法]
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**含まないもの**:
|
|
113
|
+
- なぜその技術を選んだか(→ADR参照)
|
|
114
|
+
- いつ実装するか、期間(→作業計画書)
|
|
115
|
+
- 誰が実装するか(→作業計画書)
|
|
116
|
+
|
|
117
|
+
### 作業計画書
|
|
118
|
+
|
|
119
|
+
**目的**: 実装タスクの管理と進捗追跡
|
|
120
|
+
|
|
121
|
+
**含むもの**:
|
|
122
|
+
- **フェーズ構成**(Design Docの技術的依存関係を基に作成)
|
|
123
|
+
- タスク分解と依存関係(最大2階層まで)
|
|
124
|
+
- スケジュールと期間見積もり
|
|
125
|
+
- **Design DocのE2E確認手順を各フェーズに配置**
|
|
126
|
+
- **最終フェーズに品質保証を含む**(必須)
|
|
127
|
+
- 進捗記録(チェックボックス形式)
|
|
128
|
+
|
|
129
|
+
**含まないもの**:
|
|
130
|
+
- 技術的な根拠(→ADR)
|
|
131
|
+
- 設計の詳細(→Design Doc)
|
|
132
|
+
- 技術的依存関係の決定(→Design Doc)
|
|
133
|
+
|
|
134
|
+
**タスク完了定義の3要素**:
|
|
135
|
+
1. **実装完了**: コードが動作する
|
|
136
|
+
2. **品質完了**: テスト・型チェック・リントがパス
|
|
137
|
+
3. **統合完了**: 他コンポーネントとの連携確認
|
|
138
|
+
|
|
139
|
+
## 作成プロセス
|
|
140
|
+
|
|
141
|
+
1. **問題分析**: 変更規模判定、ADR条件確認
|
|
142
|
+
2. **ADR選択肢検討**(ADR時のみ): 3案以上比較、トレードオフ明記
|
|
143
|
+
3. **作成**: テンプレート使用、測定可能な条件記載
|
|
144
|
+
4. **承認**: レビュー後「Accepted」で実装可
|
|
145
|
+
|
|
146
|
+
## 保存場所
|
|
147
|
+
|
|
148
|
+
| ドキュメント | パス | 命名規則 | テンプレート |
|
|
149
|
+
|------------|-----|---------|------------|
|
|
150
|
+
| PRD | `docs/prd/` | `[機能名]-prd.md` | `template-ja.md` |
|
|
151
|
+
| ADR | `docs/adr/` | `ADR-[4桁]-[タイトル].md` | `template-ja.md` |
|
|
152
|
+
| Design Doc | `docs/design/` | `[機能名]-design.md` | `template-ja.md` |
|
|
153
|
+
| 作業計画書 | `docs/plans/` | `YYYYMMDD-{type}-{description}.md` | `template-ja.md` |
|
|
154
|
+
|
|
155
|
+
※作業計画書は`.gitignore`で除外
|
|
156
|
+
|
|
157
|
+
## ADRステータス
|
|
158
|
+
`Proposed` → `Accepted` → `Deprecated`/`Superseded`/`Rejected`
|
|
159
|
+
|
|
160
|
+
## AI自動化ルール
|
|
161
|
+
- 5ファイル以上: ADR作成提案
|
|
162
|
+
- 型・データフロー変更検出: ADR必須化
|
|
163
|
+
- 既存ADR確認してから実装
|
|
164
|
+
|
|
165
|
+
## 図表作成要件
|
|
166
|
+
|
|
167
|
+
各ドキュメントで必須の図表(mermaid記法使用):
|
|
168
|
+
|
|
169
|
+
| ドキュメント | 必須図表 | 目的 |
|
|
170
|
+
|------------|---------|-----|
|
|
171
|
+
| PRD | ユーザージャーニー図、スコープ境界図 | ユーザー体験と範囲の明確化 |
|
|
172
|
+
| ADR | 選択肢比較図(必要時) | トレードオフの視覚化 |
|
|
173
|
+
| Design Doc | アーキテクチャ図、データフロー図 | 技術構造の理解 |
|
|
174
|
+
| 作業計画書 | フェーズ構成図、タスク依存関係図 | 実装順序の明確化 |
|
|
175
|
+
|
|
176
|
+
## 共通ADRとの関係性
|
|
177
|
+
1. **作成時**: 共通技術領域(ログ、エラーハンドリング、非同期処理等)を特定し、既存共通ADRを参照
|
|
178
|
+
2. **不足時**: 必要な共通ADRが存在しない場合は作成を検討
|
|
179
|
+
3. **Design Doc**: 「前提となるADR」セクションで共通ADRを明記
|
|
180
|
+
4. **準拠確認**: 設計が共通ADRの決定事項と整合しているかを検証
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# 技術設計ルール(フロントエンド)
|
|
2
|
+
|
|
3
|
+
## 技術スタックの基本方針
|
|
4
|
+
TypeScriptベースのReactアプリケーション実装。アーキテクチャパターンはプロジェクトの要件と規模に応じて選択する。
|
|
5
|
+
|
|
6
|
+
## 環境変数管理とセキュリティ
|
|
7
|
+
|
|
8
|
+
### 環境変数管理
|
|
9
|
+
- **ビルドツールの環境変数システムを使用**: `process.env`はブラウザ環境で動作しない
|
|
10
|
+
- 設定レイヤーを通じて環境変数を一元管理
|
|
11
|
+
- TypeScriptによる適切な型安全性の実装
|
|
12
|
+
- デフォルト値設定と必須チェックの適切な実装
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
// ✅ ビルドツールの環境変数(公開値のみ)
|
|
16
|
+
const config = {
|
|
17
|
+
apiUrl: import.meta.env.API_URL || 'http://localhost:3000',
|
|
18
|
+
appName: import.meta.env.APP_NAME || 'My App'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// ❌ フロントエンドでは動作しない
|
|
22
|
+
const apiUrl = process.env.API_URL
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### セキュリティ(クライアントサイド制約)
|
|
26
|
+
- **重要**: すべてのフロントエンドコードは公開され、ブラウザで見える
|
|
27
|
+
- **クライアントサイドに秘密情報を保存しない**: APIキー、トークン、シークレットを環境変数に含めない
|
|
28
|
+
- `.env`ファイルをGitに含めない(バックエンドと同様)
|
|
29
|
+
- 機密情報のログ出力を禁止(パスワード、トークン、個人情報)
|
|
30
|
+
- エラーメッセージに機密情報を含めない
|
|
31
|
+
|
|
32
|
+
**秘密情報の正しい取り扱い**:
|
|
33
|
+
```typescript
|
|
34
|
+
// ❌ セキュリティリスク: APIキーがブラウザで露出
|
|
35
|
+
const apiKey = import.meta.env.VITE_API_KEY
|
|
36
|
+
const response = await fetch(`https://api.example.com/data?key=${apiKey}`)
|
|
37
|
+
|
|
38
|
+
// ✅ 正しい: バックエンドが秘密情報を管理、フロントエンドはプロキシ経由でアクセス
|
|
39
|
+
const response = await fetch('/api/data') // バックエンドがAPIキー認証を処理
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## アーキテクチャ設計
|
|
43
|
+
|
|
44
|
+
### フロントエンドアーキテクチャパターン
|
|
45
|
+
選択したプロジェクトパターンを厳格に遵守。プロジェクト固有の詳細は`docs/rules/architecture/`を参照。
|
|
46
|
+
|
|
47
|
+
**Reactコンポーネントアーキテクチャ**:
|
|
48
|
+
- **Function Components**: 必須、class componentsは非推奨
|
|
49
|
+
- **Custom Hooks**: ロジック再利用と依存性注入のため
|
|
50
|
+
- **コンポーネント階層**: Atoms → Molecules → Organisms → Templates → Pages
|
|
51
|
+
- **Props-driven**: コンポーネントは必要なすべてのデータをPropsで受け取る
|
|
52
|
+
- **Co-location**: テスト、スタイル、関連ファイルをコンポーネントと同じ場所に配置
|
|
53
|
+
|
|
54
|
+
**状態管理パターン**:
|
|
55
|
+
- **Local State**: コンポーネント固有の状態には`useState`
|
|
56
|
+
- **Context API**: コンポーネントツリー全体で状態を共有(テーマ、認証等)
|
|
57
|
+
- **Custom Hooks**: 状態ロジックと副作用をカプセル化
|
|
58
|
+
- **Server State**: APIデータのキャッシュにはReact QueryまたはSWR
|
|
59
|
+
|
|
60
|
+
## データフロー統一原則
|
|
61
|
+
|
|
62
|
+
### クライアントサイドのデータフロー
|
|
63
|
+
Reactアプリケーション全体で一貫したデータフローを維持:
|
|
64
|
+
|
|
65
|
+
- **Single Source of Truth**: 各状態には1つの権威あるソースがある
|
|
66
|
+
- UI状態: コンポーネントStateまたはContext
|
|
67
|
+
- サーバーデータ: React Query/SWRでキャッシュされたAPIレスポンス
|
|
68
|
+
- フォームデータ: React Hook Formを使ったControlled Components
|
|
69
|
+
|
|
70
|
+
- **単方向フロー**: データはPropsを通じて上から下へ流れる
|
|
71
|
+
```
|
|
72
|
+
APIレスポンス → State → Props → Render → UI
|
|
73
|
+
ユーザー入力 → イベントハンドラ → State更新 → 再レンダリング
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- **Immutable Updates**: State更新には不変パターンを使用
|
|
77
|
+
```typescript
|
|
78
|
+
// ✅ 不変なState更新
|
|
79
|
+
setUsers(prev => [...prev, newUser])
|
|
80
|
+
|
|
81
|
+
// ❌ 可変なState更新
|
|
82
|
+
users.push(newUser)
|
|
83
|
+
setUsers(users)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### データフローにおける型安全性
|
|
87
|
+
- **Frontend → Backend**: Props/State(型保証済み) → APIリクエスト(シリアライゼーション)
|
|
88
|
+
- **Backend → Frontend**: APIレスポンス(`unknown`) → 型ガード → State(型保証済み)
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// ✅ 型安全なデータフロー
|
|
92
|
+
async function fetchUser(id: string): Promise<User> {
|
|
93
|
+
const response = await fetch(`/api/users/${id}`)
|
|
94
|
+
const data: unknown = await response.json()
|
|
95
|
+
|
|
96
|
+
if (!isUser(data)) {
|
|
97
|
+
throw new Error('Invalid user data')
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return data // User型として保証
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## ビルドとテスト
|
|
105
|
+
package.jsonの`packageManager`フィールドに応じた実行コマンドを使用すること。
|
|
106
|
+
|
|
107
|
+
### ビルドコマンド
|
|
108
|
+
- `dev` - 開発サーバー
|
|
109
|
+
- `build` - 本番ビルド
|
|
110
|
+
- `preview` - 本番ビルドのプレビュー
|
|
111
|
+
- `type-check` - 型チェック(出力なし)
|
|
112
|
+
|
|
113
|
+
### テストコマンド
|
|
114
|
+
- `test` - テスト実行
|
|
115
|
+
- `test:coverage` - カバレッジ付きテスト実行
|
|
116
|
+
- `test:coverage:fresh` - カバレッジ付きテスト実行(キャッシュクリア)
|
|
117
|
+
- `test:safe` - 安全なテスト実行(自動クリーンアップ付き)
|
|
118
|
+
- `cleanup:processes` - Vitestプロセスのクリーンアップ
|
|
119
|
+
|
|
120
|
+
### 品質チェック要件
|
|
121
|
+
実装完了時に品質チェックは必須:
|
|
122
|
+
|
|
123
|
+
**Phase 1-3: 基本チェック**
|
|
124
|
+
- `check` - Biome(lint + format)
|
|
125
|
+
- `build` - TypeScriptビルド
|
|
126
|
+
|
|
127
|
+
**Phase 4-5: テストと最終確認**
|
|
128
|
+
- `test` - テスト実行
|
|
129
|
+
- `test:coverage:fresh` - カバレッジ測定
|
|
130
|
+
- `check:all` - 全体統合チェック
|
|
131
|
+
|
|
132
|
+
### カバレッジ要件
|
|
133
|
+
- **必須**: 単体テストのカバレッジは60%以上
|
|
134
|
+
- **コンポーネント別目標**:
|
|
135
|
+
- Atoms: 70%以上
|
|
136
|
+
- Molecules: 65%以上
|
|
137
|
+
- Organisms: 60%以上
|
|
138
|
+
- Custom Hooks: 65%以上
|
|
139
|
+
- Utils: 70%以上
|
|
140
|
+
|
|
141
|
+
### 非機能要件
|
|
142
|
+
- **ブラウザ互換性**: Chrome/Firefox/Safari/Edge(最新2バージョン)
|
|
143
|
+
- **レンダリング時間**: 主要ページで5秒以内
|