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,124 @@
|
|
|
1
|
+
# TypeScript テストルール(フロントエンド)
|
|
2
|
+
|
|
3
|
+
## テストフレームワーク
|
|
4
|
+
- **Vitest**: このプロジェクトではVitestを使用
|
|
5
|
+
- **React Testing Library**: コンポーネントテスト用
|
|
6
|
+
- **MSW (Mock Service Worker)**: APIモック用
|
|
7
|
+
- テストのインポート: `import { describe, it, expect, beforeEach, vi } from 'vitest'`
|
|
8
|
+
- コンポーネントテストのインポート: `import { render, screen, fireEvent } from '@testing-library/react'`
|
|
9
|
+
- モックの作成: `vi.mock()` を使用
|
|
10
|
+
|
|
11
|
+
## テストの基本方針
|
|
12
|
+
|
|
13
|
+
### 品質要件
|
|
14
|
+
- **カバレッジ**: 単体テストのカバレッジは60%以上を必須(フロントエンド標準 2025)
|
|
15
|
+
- **独立性**: 各テストは他のテストに依存せず実行可能
|
|
16
|
+
- **再現性**: テストは環境に依存せず、常に同じ結果を返す
|
|
17
|
+
- **可読性**: テストコードも製品コードと同様の品質を維持
|
|
18
|
+
|
|
19
|
+
### カバレッジ要件(ADR-0002準拠)
|
|
20
|
+
**必須**: 単体テストのカバレッジは60%以上
|
|
21
|
+
**コンポーネント別目標**:
|
|
22
|
+
- Atoms(Button、Text等): 70%以上
|
|
23
|
+
- Molecules(FormField等): 65%以上
|
|
24
|
+
- Organisms(Header、Footer等): 60%以上
|
|
25
|
+
- Custom Hooks: 65%以上
|
|
26
|
+
- Utils: 70%以上
|
|
27
|
+
|
|
28
|
+
**指標**: Statements(文)、Branches(分岐)、Functions(関数)、Lines(行)
|
|
29
|
+
|
|
30
|
+
### テストの種類と範囲
|
|
31
|
+
1. **単体テスト(React Testing Library)**
|
|
32
|
+
- 個々のコンポーネントや関数の動作を検証
|
|
33
|
+
- 外部依存はすべてモック化
|
|
34
|
+
- 最も数が多く、細かい粒度で実施
|
|
35
|
+
- ユーザーから観測可能な振る舞いに焦点を当てる
|
|
36
|
+
|
|
37
|
+
2. **統合テスト(React Testing Library + MSW)**
|
|
38
|
+
- 複数のコンポーネントの連携を検証
|
|
39
|
+
- MSW(Mock Service Worker)でAPIをモック
|
|
40
|
+
- 実際のDB接続なし(DBはバックエンドが管理)
|
|
41
|
+
- 主要な機能フローの検証
|
|
42
|
+
|
|
43
|
+
3. **E2Eテストでの機能横断検証**
|
|
44
|
+
- 新機能追加時、既存機能への影響を必ず検証
|
|
45
|
+
- Design Docの「統合ポイントマップ」で影響度「高」「中」の箇所をカバー
|
|
46
|
+
- 検証パターン: 既存機能動作 → 新機能有効化 → 既存機能の継続性確認
|
|
47
|
+
- 判定基準: 表示内容の変化なし、レンダリング時間5秒以内
|
|
48
|
+
- CI/CDでの自動実行を前提とした設計
|
|
49
|
+
|
|
50
|
+
## テストの実装規約
|
|
51
|
+
|
|
52
|
+
### ディレクトリ構造(Co-location原則)
|
|
53
|
+
```
|
|
54
|
+
src/
|
|
55
|
+
└── components/
|
|
56
|
+
└── Button/
|
|
57
|
+
├── Button.tsx
|
|
58
|
+
├── Button.test.tsx # コンポーネントと同じ場所に配置
|
|
59
|
+
└── index.ts
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**理由**:
|
|
63
|
+
- React Testing Libraryのベストプラクティス
|
|
64
|
+
- ADR-0002 Co-location原則
|
|
65
|
+
- 実装と一緒にテストを見つけやすく、保守しやすい
|
|
66
|
+
|
|
67
|
+
### 命名規則
|
|
68
|
+
- テストファイル: `{ComponentName}.test.tsx`
|
|
69
|
+
- 統合テストファイル: `{FeatureName}.integration.test.tsx`
|
|
70
|
+
- テストスイート: 対象のコンポーネントや機能を説明する名前
|
|
71
|
+
- テストケース: ユーザー視点から期待される動作を説明する名前
|
|
72
|
+
|
|
73
|
+
### テストコードの品質ルール
|
|
74
|
+
|
|
75
|
+
✅ **推奨: すべてのテストを常に有効に保つ**
|
|
76
|
+
- メリット: テストスイートの完全性を保証
|
|
77
|
+
- 実践: 問題があるテストは修正して有効化
|
|
78
|
+
|
|
79
|
+
❌ **避けるべき: test.skip()やコメントアウト**
|
|
80
|
+
- 理由: テストの穴が生まれ、品質チェックが不完全になる
|
|
81
|
+
- 対処: 不要なテストは完全に削除する
|
|
82
|
+
|
|
83
|
+
## モックの型安全性の徹底
|
|
84
|
+
|
|
85
|
+
### MSW(Mock Service Worker)セットアップ
|
|
86
|
+
```typescript
|
|
87
|
+
// ✅ 型安全なMSWハンドラー
|
|
88
|
+
import { rest } from 'msw'
|
|
89
|
+
|
|
90
|
+
const handlers = [
|
|
91
|
+
rest.get('/api/users/:id', (req, res, ctx) => {
|
|
92
|
+
return res(ctx.json({ id: '1', name: 'John' } satisfies User))
|
|
93
|
+
})
|
|
94
|
+
]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### コンポーネントモックの型安全性
|
|
98
|
+
```typescript
|
|
99
|
+
// ✅ 必要な部分のみ
|
|
100
|
+
type TestProps = Pick<ButtonProps, 'label' | 'onClick'>
|
|
101
|
+
const mockProps: TestProps = { label: 'Click', onClick: vi.fn() }
|
|
102
|
+
|
|
103
|
+
// やむを得ない場合のみ、理由明記
|
|
104
|
+
const mockRouter = {
|
|
105
|
+
push: vi.fn()
|
|
106
|
+
} as unknown as Router // 複雑なRouter型構造のため
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## React Testing Libraryの基本例
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
import { describe, it, expect, vi } from 'vitest'
|
|
113
|
+
import { render, screen, fireEvent } from '@testing-library/react'
|
|
114
|
+
import { Button } from './Button'
|
|
115
|
+
|
|
116
|
+
describe('Button', () => {
|
|
117
|
+
it('should call onClick when clicked', () => {
|
|
118
|
+
const onClick = vi.fn()
|
|
119
|
+
render(<Button label="Click me" onClick={onClick} />)
|
|
120
|
+
fireEvent.click(screen.getByRole('button', { name: 'Click me' }))
|
|
121
|
+
expect(onClick).toHaveBeenCalledOnce()
|
|
122
|
+
})
|
|
123
|
+
})
|
|
124
|
+
```
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# TypeScript開発ルール
|
|
2
|
+
|
|
3
|
+
## フロントエンド固有のアンチパターン
|
|
4
|
+
|
|
5
|
+
coding-standards.mdの普遍的アンチパターンに加え、以下のフロントエンド固有の問題に注意:
|
|
6
|
+
|
|
7
|
+
- **3階層以上のProp drilling** - Context APIまたは状態管理を使用すべき
|
|
8
|
+
- **巨大なコンポーネント(300行以上)** - 小さなコンポーネントに分割
|
|
9
|
+
|
|
10
|
+
## Frontend実装における型安全性
|
|
11
|
+
|
|
12
|
+
**データフローにおける型安全性**
|
|
13
|
+
- **Frontend → Backend**: Props/State(型保証済み) → APIリクエスト(シリアライゼーション)
|
|
14
|
+
- **Backend → Frontend**: APIレスポンス(`unknown`) → 型ガード → State(型保証済み)
|
|
15
|
+
|
|
16
|
+
**Frontend固有の型シナリオ**:
|
|
17
|
+
- **React Props/State**: TypeScriptが型管理、unknown不要
|
|
18
|
+
- **外部APIレスポンス**: 常に`unknown`として受け取り、型ガードで検証
|
|
19
|
+
- **localStorage/sessionStorage**: `unknown`として扱い、検証
|
|
20
|
+
- **URLパラメータ**: `unknown`として扱い、検証
|
|
21
|
+
- **Form入力(Controlled Components)**: React合成イベントで型安全
|
|
22
|
+
|
|
23
|
+
**型の複雑性管理(Frontend)**
|
|
24
|
+
- **Props設計**:
|
|
25
|
+
- Props数: 3-7個が理想(10個超えたらコンポーネント分割検討)
|
|
26
|
+
- Optional Props: 50%以下(多すぎる場合はデフォルト値やContext使用検討)
|
|
27
|
+
- ネスト: 2レベルまで(深いネストはFlatten推奨)
|
|
28
|
+
- 型アサーション: 3回以上使用で設計見直し
|
|
29
|
+
- **外部API型**: 制約を緩和し実態に応じて定義(内部で適切に変換)
|
|
30
|
+
|
|
31
|
+
## コーディング規約
|
|
32
|
+
|
|
33
|
+
**コンポーネント設計基準**
|
|
34
|
+
- **Function Components(必須)**: React公式推奨、モダンツールで最適化可能
|
|
35
|
+
- **Classes禁止**: Class componentsは完全非推奨(例外: Error Boundary)
|
|
36
|
+
- **Custom Hooks**: ロジック再利用の標準パターン
|
|
37
|
+
|
|
38
|
+
**関数設計**
|
|
39
|
+
- **0-2パラメータまで**: 3個以上はオブジェクト使用
|
|
40
|
+
```typescript
|
|
41
|
+
// ✅ オブジェクトパラメータ
|
|
42
|
+
function createUser({ name, email, role }: CreateUserParams) {}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Props設計(Props-drivenアプローチ)**
|
|
46
|
+
- Propsはインターフェース: 必要な情報を全てPropsとして定義
|
|
47
|
+
- 暗黙的依存を避ける: 必要なくグローバルstateやcontextに依存しない
|
|
48
|
+
- 型安全性: Props型を常に明示的に定義
|
|
49
|
+
|
|
50
|
+
**環境変数**
|
|
51
|
+
- **ビルドツールの環境変数システムを使用**: `process.env`はブラウザで動作しない
|
|
52
|
+
- **クライアントサイドに秘密情報なし**: フロントエンドコードは全て公開、秘密情報はバックエンドで管理
|
|
53
|
+
|
|
54
|
+
**依存性注入**
|
|
55
|
+
- **カスタムフックで依存性注入**: テスト可能性とモジュール性を確保
|
|
56
|
+
|
|
57
|
+
**非同期処理**
|
|
58
|
+
- Promise処理: 常に`async/await`使用
|
|
59
|
+
- エラーハンドリング: 常に`try-catch`またはError Boundaryで処理
|
|
60
|
+
- 型定義: 戻り値の型を明示的に定義(例: `Promise<Result>`)
|
|
61
|
+
|
|
62
|
+
**フォーマットルール**
|
|
63
|
+
- セミコロン省略(Biome設定に従う)
|
|
64
|
+
- 型は`PascalCase`、変数・関数は`camelCase`
|
|
65
|
+
- importは絶対パス使用(`src/`)
|
|
66
|
+
|
|
67
|
+
**Clean Code原則**
|
|
68
|
+
- ✅ 未使用コードは即座に削除
|
|
69
|
+
- ✅ デバッグ用`console.log()`削除
|
|
70
|
+
- ❌ コメントアウトされたコード(履歴はバージョン管理で)
|
|
71
|
+
- ✅ コメントは「理由」を説明(「何を」ではない)
|
|
72
|
+
|
|
73
|
+
## エラーハンドリング
|
|
74
|
+
|
|
75
|
+
**絶対ルール**: エラー抑制禁止。全てのエラーはログ出力と適切な処理が必須。
|
|
76
|
+
|
|
77
|
+
**Fail-Fast原則**: エラー時は速やかに失敗し、無効な状態での処理継続を防ぐ
|
|
78
|
+
```typescript
|
|
79
|
+
// ❌ 禁止: 無条件フォールバック
|
|
80
|
+
catch (error) {
|
|
81
|
+
return defaultValue // エラーを隠蔽
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ✅ 必須: 明示的な失敗
|
|
85
|
+
catch (error) {
|
|
86
|
+
logger.error('処理失敗', error)
|
|
87
|
+
throw error // Error Boundaryまたは上位層で処理
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Result型パターン**: エラーを型で表現し明示的にハンドリング
|
|
92
|
+
```typescript
|
|
93
|
+
type Result<T, E> = { ok: true; value: T } | { ok: false; error: E }
|
|
94
|
+
|
|
95
|
+
// 例: エラーの可能性を型で表現
|
|
96
|
+
function parseUser(data: unknown): Result<User, ValidationError> {
|
|
97
|
+
if (!isValid(data)) return { ok: false, error: new ValidationError() }
|
|
98
|
+
return { ok: true, value: data as User }
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**カスタムエラークラス**
|
|
103
|
+
```typescript
|
|
104
|
+
export class AppError extends Error {
|
|
105
|
+
constructor(message: string, public readonly code: string, public readonly statusCode = 500) {
|
|
106
|
+
super(message)
|
|
107
|
+
this.name = this.constructor.name
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// 目的別: ValidationError(400), ApiError(502), NotFoundError(404)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**レイヤー別エラーハンドリング(React)**
|
|
114
|
+
- Error Boundary: Reactコンポーネントエラーをキャッチ、フォールバックUI表示
|
|
115
|
+
- Custom Hook: ビジネスルール違反を検出、AppErrorをそのまま伝播
|
|
116
|
+
- API層: fetchエラーをドメインエラーに変換
|
|
117
|
+
|
|
118
|
+
**構造化ロギングと機密情報保護**
|
|
119
|
+
ログに機密情報(password、token、apiKey、secret、creditCard)を絶対含めない
|
|
120
|
+
|
|
121
|
+
**Reactでの非同期エラーハンドリング**
|
|
122
|
+
- Error Boundaryセットアップ必須: レンダリングエラーをキャッチ
|
|
123
|
+
- イベントハンドラ内の全async/awaitでtry-catch使用
|
|
124
|
+
- エラーは常にログ記録し、再スローまたはerror stateで表示
|
|
125
|
+
|
|
126
|
+
## パフォーマンス最適化
|
|
127
|
+
|
|
128
|
+
- コンポーネントメモ化: 高コストコンポーネントにReact.memo使用
|
|
129
|
+
- State最適化: 適切なstate構造で再レンダリングを最小化
|
|
130
|
+
- 遅延読み込み: React.lazyとSuspenseでコード分割
|
|
131
|
+
- バンドルサイズ: `build`スクリプト(package.jsonの`packageManager`フィールドに応じた実行コマンドを使用)で監視し最適化
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# 統合テスト・E2Eテスト設計・実装ルール
|
|
2
|
+
|
|
3
|
+
## テスト種別と上限
|
|
4
|
+
|
|
5
|
+
| 種別 | 目的 | ファイル形式 | 上限 |
|
|
6
|
+
|------|------|-------------|------|
|
|
7
|
+
| 統合テスト | コンポーネント間連携検証 | `*.int.test.ts` | 機能あたり3件 |
|
|
8
|
+
| E2Eテスト | クリティカルユーザージャーニー検証 | `*.e2e.test.ts` | 機能あたり1-2件 |
|
|
9
|
+
|
|
10
|
+
**クリティカルユーザージャーニー**: 収益影響・法的要件・大多数のユーザーが日常的に利用する機能
|
|
11
|
+
|
|
12
|
+
## 振る舞い優先の原則
|
|
13
|
+
|
|
14
|
+
### 観測可能性チェック(全てYESで対象)
|
|
15
|
+
|
|
16
|
+
| チェック | 質問 | NOの場合 |
|
|
17
|
+
|---------|------|----------|
|
|
18
|
+
| 観測可能 | ユーザーが結果を観測できるか? | 除外 |
|
|
19
|
+
| システム文脈 | 複数コンポーネントの統合が必要か? | 除外 |
|
|
20
|
+
| 自動化可能 | CI環境で安定実行できるか? | 除外 |
|
|
21
|
+
|
|
22
|
+
### Include/Exclude基準
|
|
23
|
+
|
|
24
|
+
**Include**: ビジネスロジック正確性、データ整合性、ユーザー可視機能、エラーハンドリング
|
|
25
|
+
**Exclude**: 外部実接続、パフォーマンス指標、実装詳細、UIレイアウト
|
|
26
|
+
|
|
27
|
+
## スケルトン仕様
|
|
28
|
+
|
|
29
|
+
### 必須コメント形式
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
// AC: "[受入条件原文]"
|
|
33
|
+
// ROI: [0-100] | ビジネス価値: [0-10] | 頻度: [0-10]
|
|
34
|
+
// 振る舞い: [トリガー] → [処理] → [観測可能な結果]
|
|
35
|
+
// @category: core-functionality | integration | edge-case | ux | e2e
|
|
36
|
+
// @dependency: none | [コンポーネント名] | full-system
|
|
37
|
+
// @complexity: low | medium | high
|
|
38
|
+
it.todo('[AC番号]: [テスト名]')
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Property注釈
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
// Property: `[検証式]`
|
|
45
|
+
// fast-check: fc.property(fc.[arbitrary], (input) => [不変条件])
|
|
46
|
+
it.todo('[AC番号]-property: [不変条件記述]')
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### ROI計算
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
ROI = (ビジネス価値 × 頻度 + 法的要件 × 10 + 欠陥検出) / 総コスト
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
| 種別 | 総コスト | E2E生成条件 |
|
|
56
|
+
|------|---------|------------|
|
|
57
|
+
| 統合 | 11 | - |
|
|
58
|
+
| E2E | 38 | ROI > 50 |
|
|
59
|
+
|
|
60
|
+
## 実装ルール
|
|
61
|
+
|
|
62
|
+
### Property-Based Test実装
|
|
63
|
+
|
|
64
|
+
Property注釈がある場合、fast-checkライブラリ必須:
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
import fc from 'fast-check'
|
|
68
|
+
|
|
69
|
+
it('AC2-property: モデル名は常にgemini-3-pro-image-preview', () => {
|
|
70
|
+
fc.assert(
|
|
71
|
+
fc.property(fc.string(), (prompt) => {
|
|
72
|
+
const result = client.generate(prompt)
|
|
73
|
+
return result.model === 'gemini-3-pro-image-preview'
|
|
74
|
+
})
|
|
75
|
+
)
|
|
76
|
+
})
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**必須事項**:
|
|
80
|
+
- `fc.assert(fc.property(...))` 形式で記述
|
|
81
|
+
- スケルトンの`// fast-check:`コメントをそのまま実装に反映
|
|
82
|
+
- 失敗ケース発見時は具体的なユニットテストとして追加(リグレッション防止)
|
|
83
|
+
|
|
84
|
+
### 振る舞い検証の実装
|
|
85
|
+
|
|
86
|
+
**振る舞い記述の検証レベル**:
|
|
87
|
+
|
|
88
|
+
| ステップ種別 | 検証対象 | 例 |
|
|
89
|
+
|-------------|---------|-----|
|
|
90
|
+
| トリガー | Arrangeで再現 | API障害 → mockResolvedValue({ ok: false }) |
|
|
91
|
+
| 処理 | 中間状態または呼び出し | 関数呼び出し、状態変更 |
|
|
92
|
+
| 観測可能な結果 | 最終出力の値 | 戻り値、エラーメッセージ、ログ出力 |
|
|
93
|
+
|
|
94
|
+
**判定基準**: 「観測可能な結果」がテスト対象の**戻り値またはモックの呼び出し引数**として検証されていれば合格
|
|
95
|
+
|
|
96
|
+
### 検証項目の決定ルール
|
|
97
|
+
|
|
98
|
+
| スケルトンの状態 | 検証項目の決定方法 |
|
|
99
|
+
|-----------------|-------------------|
|
|
100
|
+
| `// 検証項目:` が列挙されている | 列挙された全項目をexpectで実装 |
|
|
101
|
+
| `// 検証項目:` がない | 「振る舞い」記述の「観測可能な結果」から導出 |
|
|
102
|
+
| 両方ある | 検証項目を優先、振る舞いは補足として使用 |
|
|
103
|
+
|
|
104
|
+
**振る舞いからの導出例**:
|
|
105
|
+
```
|
|
106
|
+
// 振る舞い: ユーザーが決済完了 → DBに注文作成 → 注文確認画面表示
|
|
107
|
+
↓ 導出
|
|
108
|
+
- 注文がDBに作成される(または作成関数が呼び出される)
|
|
109
|
+
- 注文確認画面のデータが返される
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 統合テストのモック境界
|
|
113
|
+
|
|
114
|
+
| 判断基準 | モック | 実物 |
|
|
115
|
+
|---------|--------|------|
|
|
116
|
+
| テスト対象の一部か? | No → モック可 | Yes → 実物必須 |
|
|
117
|
+
| 呼び出しがテストの検証対象か? | No → モック可 | Yes → 実物または検証可能なモック |
|
|
118
|
+
| 外部ネットワーク通信か? | Yes → モック必須 | No → 実物推奨 |
|
|
119
|
+
|
|
120
|
+
**判定フロー**:
|
|
121
|
+
1. 外部API(HTTP通信)→ モック必須
|
|
122
|
+
2. テスト対象のコンポーネント間連携 → 実物必須
|
|
123
|
+
3. ログ出力の検証が必要 → 検証可能なモック(vi.fn())を使用
|
|
124
|
+
4. ログ出力の検証が不要 → 実物または無視
|
|
125
|
+
|
|
126
|
+
### E2Eテストの実行条件
|
|
127
|
+
|
|
128
|
+
- 全コンポーネント実装完了後に実行
|
|
129
|
+
- モック禁止(`@dependency: full-system`)
|
|
130
|
+
|
|
131
|
+
## レビュー基準
|
|
132
|
+
|
|
133
|
+
### スケルトンと実装の整合性
|
|
134
|
+
|
|
135
|
+
| チェック | 不合格条件 |
|
|
136
|
+
|---------|-----------|
|
|
137
|
+
| Property検証 | Property注釈があるのにfast-check未使用 |
|
|
138
|
+
| 振る舞い検証 | 「観測可能な結果」に対応するexpectがない |
|
|
139
|
+
| 検証項目網羅 | 列挙された検証項目がexpectに含まれていない |
|
|
140
|
+
| モック境界 | 統合テストで内部コンポーネントをモック化 |
|
|
141
|
+
|
|
142
|
+
### 実装品質
|
|
143
|
+
|
|
144
|
+
| チェック | 不合格条件 |
|
|
145
|
+
|---------|-----------|
|
|
146
|
+
| AAA構造 | Arrange/Act/Assertの区切りが不明確 |
|
|
147
|
+
| 独立性 | テスト間で状態共有、実行順序依存 |
|
|
148
|
+
| 再現性 | 日時・乱数に依存し結果が変動 |
|
|
149
|
+
| 可読性 | テスト名と検証内容が一致しない |
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# プロジェクトコンテキスト
|
|
2
|
+
|
|
3
|
+
## 基本設定
|
|
4
|
+
|
|
5
|
+
### プロジェクトの性質
|
|
6
|
+
- **プロジェクト形態**: Claude Code専用TypeScriptプロジェクトテンプレート
|
|
7
|
+
- **利用範囲**: プロジェクトの要件に応じて設定可能
|
|
8
|
+
- **実装方針**: LLM主導実装、品質重視、YAGNI原則徹底
|
|
9
|
+
|
|
10
|
+
### 技術スタック
|
|
11
|
+
- **基盤技術**: TypeScript、Node.js
|
|
12
|
+
- **テストフレームワーク**: Vitest
|
|
13
|
+
- **品質管理**: Biome、TypeScript strict mode
|
|
14
|
+
|
|
15
|
+
## 実装原則
|
|
16
|
+
|
|
17
|
+
### 実装方針の特徴
|
|
18
|
+
- **LLM主導実装**: Claude Codeが主要な実装者として機能
|
|
19
|
+
- **品質重視**: 速度より品質を優先する文化
|
|
20
|
+
- **YAGNI原則**: 必要になるまで実装しない
|
|
21
|
+
- **体系的な設計**: ADR/Design Doc/作業計画書による設計プロセス
|
|
22
|
+
|
|
23
|
+
## カスタマイズガイド
|
|
24
|
+
|
|
25
|
+
新しいプロジェクトでこのテンプレートを使用する場合:
|
|
26
|
+
|
|
27
|
+
1. **プロジェクト固有情報の追加**
|
|
28
|
+
- ターゲットユーザー特性
|
|
29
|
+
- ビジネス要件と制約
|
|
30
|
+
- 技術的制約事項
|
|
31
|
+
|
|
32
|
+
2. **アーキテクチャの選択**
|
|
33
|
+
- `docs/rules/architecture/` から適切なパターンを選択
|
|
34
|
+
- `docs/rules/architecture/` にプロジェクト固有の設計を配置
|
|
35
|
+
|
|
36
|
+
3. **環境設定**
|
|
37
|
+
- プロジェクトに適した環境変数管理方法の実装
|
|
38
|
+
- プロジェクト固有の設定ファイル追加
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# 各ルールファイルのメタデータ
|
|
2
|
+
# 各ルールの概要、タグ、典型的な使用場面、サイズを管理
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
coding-standards:
|
|
6
|
+
file: "coding-standards.md"
|
|
7
|
+
tags: [anti-patterns, technical-judgment, debugging, rule-of-three, implementation, type-safety, refactoring, code-reading, best-practices, impact-analysis, unused-code, code-deletion, testing, tdd]
|
|
8
|
+
typical-use: "全ドメイン共通の技術的判断基準、アンチパターン検出、デバッグ手法、実装時のベストプラクティス、影響範囲調査、未使用コード削除、テスト設計原則"
|
|
9
|
+
size: large
|
|
10
|
+
key-references:
|
|
11
|
+
- "Rule of Three - Martin Fowler"
|
|
12
|
+
- "5 Whys - トヨタ生産方式"
|
|
13
|
+
- "DRY原則 - The Pragmatic Programmer"
|
|
14
|
+
- "単一責任原則(SRP) - Clean Code"
|
|
15
|
+
- "YAGNI原則 - Extreme Programming"
|
|
16
|
+
- "Avoiding fallback in distributed systems - AWS Builders' Library"
|
|
17
|
+
- "Test-Driven Development - Kent Beck"
|
|
18
|
+
- "Red-Green-Refactor - Kent Beck"
|
|
19
|
+
- "AAAパターン - Arrange-Act-Assert"
|
|
20
|
+
sections:
|
|
21
|
+
- "技術的アンチパターン(赤信号パターン)"
|
|
22
|
+
- "基本原則"
|
|
23
|
+
- "コメント記述ルール"
|
|
24
|
+
- "エラーハンドリングの基本原則"
|
|
25
|
+
- "Rule of Three - コード重複の判断基準"
|
|
26
|
+
- "よくある失敗パターンと回避方法"
|
|
27
|
+
- "デバッグ手法"
|
|
28
|
+
- "型安全性の基礎"
|
|
29
|
+
- "リファクタリング手法"
|
|
30
|
+
- "技術的判断が必要な場面"
|
|
31
|
+
- "継続的改善のマインドセット"
|
|
32
|
+
- "実装作業の完全性担保"
|
|
33
|
+
- "Red-Green-Refactorプロセス(テストファースト開発)"
|
|
34
|
+
- "テスト設計原則"
|
|
35
|
+
- "テストヘルパーの活用ルール"
|
|
36
|
+
- "テストの粒度原則"
|
|
37
|
+
- "継続性テストの範囲"
|
|
38
|
+
|
|
39
|
+
typescript:
|
|
40
|
+
file: "typescript.md"
|
|
41
|
+
tags: [implementation, type-safety, async, coding-style, functional-programming, dependency-injection, backend]
|
|
42
|
+
typical-use: "バックエンドTypeScriptコードの作成・修正、クラス使用判断、DI実装"
|
|
43
|
+
size: small
|
|
44
|
+
key-references:
|
|
45
|
+
- "Dependency Injection - Martin Fowler"
|
|
46
|
+
sections:
|
|
47
|
+
- "Backend実装における型安全性"
|
|
48
|
+
- "コーディング規約"
|
|
49
|
+
- "エラーハンドリング"
|
|
50
|
+
- "パフォーマンス最適化"
|
|
51
|
+
|
|
52
|
+
typescript-testing:
|
|
53
|
+
file: "typescript-testing.md"
|
|
54
|
+
tags: [quality, testing, coverage, vitest, backend, implementation]
|
|
55
|
+
typical-use: "バックエンドテスト作成、Vitest設定、70%カバレッジ要件、テスト品質基準"
|
|
56
|
+
size: small
|
|
57
|
+
key-references:
|
|
58
|
+
- "Vitest公式ドキュメント"
|
|
59
|
+
sections:
|
|
60
|
+
- "テストフレームワーク"
|
|
61
|
+
- "テストの基本方針"
|
|
62
|
+
- "テストの実装規約"
|
|
63
|
+
- "テスト品質基準"
|
|
64
|
+
- "モックの型安全性"
|
|
65
|
+
- "Vitestの基本例"
|
|
66
|
+
|
|
67
|
+
technical-spec:
|
|
68
|
+
file: "technical-spec.md"
|
|
69
|
+
tags: [architecture, design, documentation, environment, data-flow, implementation, quality-commands, testing, build]
|
|
70
|
+
typical-use: "技術設計、環境設定、ドキュメント作成プロセス、実装方針決定、品質チェックコマンド、ビルドとテスト実行"
|
|
71
|
+
size: medium
|
|
72
|
+
key-references:
|
|
73
|
+
- "ADRフォーマット - Michael Nygard"
|
|
74
|
+
- "単一データソース原則 - Single Source of Truth"
|
|
75
|
+
sections:
|
|
76
|
+
- "技術スタックの基本方針"
|
|
77
|
+
- "環境変数管理とセキュリティ"
|
|
78
|
+
- "アーキテクチャ設計"
|
|
79
|
+
- "パターン適用の一貫性"
|
|
80
|
+
- "データフロー統一原則"
|
|
81
|
+
- "ビルドとテスト"
|
|
82
|
+
|
|
83
|
+
project-context:
|
|
84
|
+
file: "project-context.md"
|
|
85
|
+
tags: [context, project-specific, implementation]
|
|
86
|
+
typical-use: "プロジェクト固有情報、実装原則の理解"
|
|
87
|
+
size: small
|
|
88
|
+
key-references:
|
|
89
|
+
- "プロジェクト固有(経験則)"
|
|
90
|
+
sections:
|
|
91
|
+
- "基本設定"
|
|
92
|
+
- "実装原則"
|
|
93
|
+
- "カスタマイズガイド"
|
|
94
|
+
|
|
95
|
+
documentation-criteria:
|
|
96
|
+
file: "documentation-criteria.md"
|
|
97
|
+
tags: [documentation, decision-making, adr, prd, design-doc, planning, process]
|
|
98
|
+
typical-use: "実装開始時の規模判定、ドキュメント作成判定、ADR/PRD/Design Doc/作業計画書の作成基準"
|
|
99
|
+
size: medium
|
|
100
|
+
key-references:
|
|
101
|
+
- "ADR手法 - Michael Nygard"
|
|
102
|
+
- "Design Doc文化 - Google Engineering Practices"
|
|
103
|
+
- "Single Source of Truth"
|
|
104
|
+
sections:
|
|
105
|
+
- "作成判定マトリクス"
|
|
106
|
+
- "ADR作成条件(いずれか該当で必須)"
|
|
107
|
+
- "各ドキュメントの詳細定義"
|
|
108
|
+
- "作成プロセス"
|
|
109
|
+
- "保存場所"
|
|
110
|
+
- "ADRステータス"
|
|
111
|
+
- "AI自動化ルール"
|
|
112
|
+
- "図表作成要件"
|
|
113
|
+
- "共通ADRとの関係性"
|
|
114
|
+
|
|
115
|
+
implementation-approach:
|
|
116
|
+
file: "architecture/implementation-approach.md"
|
|
117
|
+
tags: [architecture, implementation, task-decomposition, strategy-patterns, strangler-pattern, facade-pattern, design, planning, confirmation-levels]
|
|
118
|
+
typical-use: "実装戦略の選択、タスク分解、設計判断、大規模変更の計画"
|
|
119
|
+
size: medium
|
|
120
|
+
key-references:
|
|
121
|
+
- "Strangler Fig Pattern - Martin Fowler"
|
|
122
|
+
- "Feature Slicing - Martin Fowler"
|
|
123
|
+
- "Walking Skeleton - Alistair Cockburn"
|
|
124
|
+
- "Facade Pattern - Gang of Four"
|
|
125
|
+
sections:
|
|
126
|
+
- "メタ認知的戦略選択プロセス"
|
|
127
|
+
- "確認レベル定義"
|
|
128
|
+
- "統合ポイントの定義"
|
|
129
|
+
- "アンチパターン"
|
|
130
|
+
- "メタ認知的実行のための指針"
|
|
131
|
+
|
|
132
|
+
integration-e2e-testing:
|
|
133
|
+
file: "integration-e2e-testing.md"
|
|
134
|
+
tags: [testing, integration-test, e2e-test, property-based-testing, fast-check, test-skeleton, test-review, quality]
|
|
135
|
+
typical-use: "統合テスト・E2Eテストのスケルトン生成、テスト実装、テストレビュー、Property-Based Test実装"
|
|
136
|
+
size: small
|
|
137
|
+
key-references:
|
|
138
|
+
- "fast-check - Property-based testing for TypeScript"
|
|
139
|
+
- "Node.js Testing Best Practices - Yoni Goldberg"
|
|
140
|
+
- "Property-Based Testing - 2025 Practices"
|
|
141
|
+
sections:
|
|
142
|
+
- "テスト種別と上限"
|
|
143
|
+
- "振る舞い優先の原則"
|
|
144
|
+
- "スケルトン仕様"
|
|
145
|
+
- "実装ルール"
|
|
146
|
+
- "レビュー基準"
|
|
147
|
+
|
|
148
|
+
frontend-typescript:
|
|
149
|
+
file: "frontend/typescript.md"
|
|
150
|
+
tags: [frontend, react, implementation, type-safety, props-driven, hooks, component-design, vite, error-boundary]
|
|
151
|
+
typical-use: "React/Viteでのフロントエンド開発、コンポーネント設計、Props設計、環境変数管理"
|
|
152
|
+
size: small
|
|
153
|
+
key-references:
|
|
154
|
+
- "React公式ドキュメント - Function Components"
|
|
155
|
+
- "Props-driven開発 - React Patterns"
|
|
156
|
+
sections:
|
|
157
|
+
- "フロントエンド固有のアンチパターン"
|
|
158
|
+
- "Frontend実装における型安全性"
|
|
159
|
+
- "コーディング規約"
|
|
160
|
+
- "エラーハンドリング"
|
|
161
|
+
- "パフォーマンス最適化"
|
|
162
|
+
|
|
163
|
+
frontend-typescript-testing:
|
|
164
|
+
file: "frontend/typescript-testing.md"
|
|
165
|
+
tags: [frontend, react, quality, testing, coverage, vitest, react-testing-library, msw, component-testing, implementation]
|
|
166
|
+
typical-use: "Reactコンポーネントのテスト作成、React Testing Library、MSW、60%カバレッジ要件、Co-location"
|
|
167
|
+
size: small
|
|
168
|
+
key-references:
|
|
169
|
+
- "React Testing Library - Kent C. Dodds"
|
|
170
|
+
- "MSW (Mock Service Worker) - API Mocking"
|
|
171
|
+
- "ADR-0002 Co-location原則"
|
|
172
|
+
sections:
|
|
173
|
+
- "テストフレームワーク"
|
|
174
|
+
- "テストの基本方針"
|
|
175
|
+
- "テストの実装規約"
|
|
176
|
+
- "モックの型安全性の徹底"
|
|
177
|
+
- "React Testing Libraryの基本例"
|
|
178
|
+
|
|
179
|
+
frontend-technical-spec:
|
|
180
|
+
file: "frontend/technical-spec.md"
|
|
181
|
+
tags: [frontend, react, architecture, design, documentation, environment, data-flow, implementation, vite, security, client-side, state-management, context-api, hooks, lighthouse, bundle-size, non-functional-requirements]
|
|
182
|
+
typical-use: "フロントエンド技術設計、環境変数管理(Vite)、セキュリティ制約、アーキテクチャ設計、状態管理パターン、実装方針決定、非機能要件の確認"
|
|
183
|
+
size: medium
|
|
184
|
+
key-references:
|
|
185
|
+
- "Vite公式ドキュメント - Environment Variables"
|
|
186
|
+
- "React公式ドキュメント - State Management"
|
|
187
|
+
- "Single Source of Truth - データフロー原則"
|
|
188
|
+
- "Immutable Update Patterns - React"
|
|
189
|
+
- "Lighthouse - Google Web Performance"
|
|
190
|
+
- "Web.dev - Performance Best Practices"
|
|
191
|
+
sections:
|
|
192
|
+
- "技術スタックの基本方針"
|
|
193
|
+
- "環境変数管理とセキュリティ"
|
|
194
|
+
- "アーキテクチャ設計"
|
|
195
|
+
- "データフロー統一原則"
|
|
196
|
+
- "ビルドとテスト"
|