create-ai-project 1.12.0 → 1.12.1
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/package.json +1 -1
- package/.claude/agents/acceptance-test-generator.md +0 -250
- package/.claude/agents/code-reviewer.md +0 -187
- package/.claude/agents/design-sync.md +0 -221
- package/.claude/agents/document-reviewer.md +0 -187
- package/.claude/agents/integration-test-reviewer.md +0 -192
- package/.claude/agents/prd-creator.md +0 -190
- package/.claude/agents/quality-fixer-frontend.md +0 -324
- package/.claude/agents/quality-fixer.md +0 -281
- package/.claude/agents/requirement-analyzer.md +0 -161
- package/.claude/agents/rule-advisor.md +0 -175
- package/.claude/agents/task-decomposer.md +0 -285
- package/.claude/agents/task-executor-frontend.md +0 -264
- package/.claude/agents/task-executor.md +0 -258
- package/.claude/agents/technical-designer-frontend.md +0 -444
- package/.claude/agents/technical-designer.md +0 -368
- package/.claude/agents/work-planner.md +0 -208
- package/.claude/commands/build.md +0 -75
- package/.claude/commands/design.md +0 -37
- package/.claude/commands/front-build.md +0 -103
- package/.claude/commands/front-design.md +0 -42
- package/.claude/commands/front-plan.md +0 -40
- package/.claude/commands/implement.md +0 -73
- package/.claude/commands/plan.md +0 -43
- package/.claude/commands/project-inject.md +0 -76
- package/.claude/commands/refine-skill.md +0 -206
- package/.claude/commands/review.md +0 -78
- package/.claude/commands/sync-skills.md +0 -116
- package/.claude/commands/task.md +0 -13
- package/.claude/settings.local.json +0 -94
- package/.claude/skills/coding-standards/SKILL.md +0 -246
- package/.claude/skills/documentation-criteria/SKILL.md +0 -193
- package/.claude/skills/documentation-criteria/references/adr-template.md +0 -64
- package/.claude/skills/documentation-criteria/references/design-template.md +0 -242
- package/.claude/skills/documentation-criteria/references/plan-template.md +0 -130
- package/.claude/skills/documentation-criteria/references/prd-template.md +0 -109
- package/.claude/skills/frontend/technical-spec/SKILL.md +0 -147
- package/.claude/skills/frontend/typescript-rules/SKILL.md +0 -315
- package/.claude/skills/frontend/typescript-testing/SKILL.md +0 -212
- package/.claude/skills/implementation-approach/SKILL.md +0 -141
- package/.claude/skills/integration-e2e-testing/SKILL.md +0 -146
- package/.claude/skills/project-context/SKILL.md +0 -42
- package/.claude/skills/subagents-orchestration-guide/SKILL.md +0 -212
- package/.claude/skills/task-analyzer/SKILL.md +0 -142
- package/.claude/skills/task-analyzer/references/skills-index.yaml +0 -211
- package/.claude/skills/technical-spec/SKILL.md +0 -86
- package/.claude/skills/typescript-rules/SKILL.md +0 -121
- package/.claude/skills/typescript-testing/SKILL.md +0 -155
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: frontend/typescript-testing
|
|
3
|
-
description: Vitest、React Testing Library、MSWを使用したフロントエンドテストルール。カバレッジ要件、テスト設計原則、品質基準を含む。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# TypeScript テストルール(フロントエンド)
|
|
7
|
-
|
|
8
|
-
## テストフレームワーク
|
|
9
|
-
- **Vitest**: このプロジェクトではVitestを使用
|
|
10
|
-
- **React Testing Library**: コンポーネントテスト用
|
|
11
|
-
- **MSW (Mock Service Worker)**: APIモック用
|
|
12
|
-
- テストのインポート: `import { describe, it, expect, beforeEach, vi } from 'vitest'`
|
|
13
|
-
- コンポーネントテストのインポート: `import { render, screen, fireEvent } from '@testing-library/react'`
|
|
14
|
-
- モックの作成: `vi.mock()` を使用
|
|
15
|
-
|
|
16
|
-
## テストの基本方針
|
|
17
|
-
|
|
18
|
-
### 品質要件
|
|
19
|
-
- **カバレッジ**: 単体テストのカバレッジは60%以上を必須(フロントエンド標準 2025)
|
|
20
|
-
- **独立性**: 各テストは他のテストに依存せず実行可能
|
|
21
|
-
- **再現性**: テストは環境に依存せず、常に同じ結果を返す
|
|
22
|
-
- **可読性**: テストコードも製品コードと同様の品質を維持
|
|
23
|
-
|
|
24
|
-
### カバレッジ要件
|
|
25
|
-
**必須**: 単体テストのカバレッジは60%以上
|
|
26
|
-
**コンポーネント別目標**:
|
|
27
|
-
- Atoms(Button、Text等): 70%以上
|
|
28
|
-
- Molecules(FormField等): 65%以上
|
|
29
|
-
- Organisms(Header、Footer等): 60%以上
|
|
30
|
-
- Custom Hooks: 65%以上
|
|
31
|
-
- Utils: 70%以上
|
|
32
|
-
|
|
33
|
-
**指標**: Statements(文)、Branches(分岐)、Functions(関数)、Lines(行)
|
|
34
|
-
|
|
35
|
-
### テストの種類と範囲
|
|
36
|
-
1. **単体テスト(React Testing Library)**
|
|
37
|
-
- 個々のコンポーネントや関数の動作を検証
|
|
38
|
-
- 外部依存はすべてモック化
|
|
39
|
-
- 最も数が多く、細かい粒度で実施
|
|
40
|
-
- ユーザーから観測可能な振る舞いに焦点を当てる
|
|
41
|
-
|
|
42
|
-
2. **統合テスト(React Testing Library + MSW)**
|
|
43
|
-
- 複数のコンポーネントの連携を検証
|
|
44
|
-
- MSW(Mock Service Worker)でAPIをモック
|
|
45
|
-
- 実際のDB接続なし(DBはバックエンドが管理)
|
|
46
|
-
- 主要な機能フローの検証
|
|
47
|
-
|
|
48
|
-
3. **E2Eテストでの機能横断検証**
|
|
49
|
-
- 新機能追加時、既存機能への影響を必ず検証
|
|
50
|
-
- Design Docの「統合ポイントマップ」で影響度「高」「中」の箇所をカバー
|
|
51
|
-
- 検証パターン: 既存機能動作 → 新機能有効化 → 既存機能の継続性確認
|
|
52
|
-
- 判定基準: 表示内容の変化なし、レンダリング時間5秒以内
|
|
53
|
-
- CI/CDでの自動実行を前提とした設計
|
|
54
|
-
|
|
55
|
-
## テストの実装規約
|
|
56
|
-
|
|
57
|
-
### ディレクトリ構造(Co-location原則)
|
|
58
|
-
```
|
|
59
|
-
src/
|
|
60
|
-
└── components/
|
|
61
|
-
└── Button/
|
|
62
|
-
├── Button.tsx
|
|
63
|
-
├── Button.test.tsx # コンポーネントと同じ場所に配置
|
|
64
|
-
└── index.ts
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**理由**:
|
|
68
|
-
- React Testing Libraryのベストプラクティス
|
|
69
|
-
- ADR-0002 Co-location原則
|
|
70
|
-
- 実装と一緒にテストを見つけやすく、保守しやすい
|
|
71
|
-
|
|
72
|
-
### 命名規則
|
|
73
|
-
- テストファイル: `{ComponentName}.test.tsx`
|
|
74
|
-
- 統合テストファイル: `{FeatureName}.integration.test.tsx`
|
|
75
|
-
- テストスイート: 対象のコンポーネントや機能を説明する名前
|
|
76
|
-
- テストケース: ユーザー視点から期待される動作を説明する名前
|
|
77
|
-
|
|
78
|
-
### テストコードの品質ルール
|
|
79
|
-
|
|
80
|
-
**推奨: すべてのテストを常に有効に保つ**
|
|
81
|
-
- メリット: テストスイートの完全性を保証
|
|
82
|
-
- 実践: 問題があるテストは修正して有効化
|
|
83
|
-
|
|
84
|
-
**避けるべき: test.skip()やコメントアウト**
|
|
85
|
-
- 理由: テストの穴が生まれ、品質チェックが不完全になる
|
|
86
|
-
- 対処: 不要なテストは完全に削除する
|
|
87
|
-
|
|
88
|
-
## モックの型安全性の徹底
|
|
89
|
-
|
|
90
|
-
### MSW(Mock Service Worker)セットアップ
|
|
91
|
-
```typescript
|
|
92
|
-
// 型安全なMSWハンドラー
|
|
93
|
-
import { rest } from 'msw'
|
|
94
|
-
|
|
95
|
-
const handlers = [
|
|
96
|
-
rest.get('/api/users/:id', (req, res, ctx) => {
|
|
97
|
-
return res(ctx.json({ id: '1', name: 'John' } satisfies User))
|
|
98
|
-
})
|
|
99
|
-
]
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### コンポーネントモックの型安全性
|
|
103
|
-
```typescript
|
|
104
|
-
// 必要な部分のみ
|
|
105
|
-
type TestProps = Pick<ButtonProps, 'label' | 'onClick'>
|
|
106
|
-
const mockProps: TestProps = { label: 'Click', onClick: vi.fn() }
|
|
107
|
-
|
|
108
|
-
// やむを得ない場合のみ、理由明記
|
|
109
|
-
const mockRouter = {
|
|
110
|
-
push: vi.fn()
|
|
111
|
-
} as unknown as Router // 複雑なRouter型構造のため
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## React Testing Libraryの基本例
|
|
115
|
-
|
|
116
|
-
```typescript
|
|
117
|
-
import { describe, it, expect, vi } from 'vitest'
|
|
118
|
-
import { render, screen, fireEvent } from '@testing-library/react'
|
|
119
|
-
import { Button } from './Button'
|
|
120
|
-
|
|
121
|
-
describe('Button', () => {
|
|
122
|
-
it('should call onClick when clicked', () => {
|
|
123
|
-
const onClick = vi.fn()
|
|
124
|
-
render(<Button label="Click me" onClick={onClick} />)
|
|
125
|
-
fireEvent.click(screen.getByRole('button', { name: 'Click me' }))
|
|
126
|
-
expect(onClick).toHaveBeenCalledOnce()
|
|
127
|
-
})
|
|
128
|
-
})
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## テスト品質基準
|
|
132
|
-
|
|
133
|
-
### 境界値・異常系の網羅
|
|
134
|
-
正常系に加え、境界値と異常系を含める。
|
|
135
|
-
```typescript
|
|
136
|
-
it('renders empty state for empty array', () => {
|
|
137
|
-
render(<UserList users={[]} />)
|
|
138
|
-
expect(screen.getByText('ユーザーがいません')).toBeInTheDocument()
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
it('displays error message on API failure', async () => {
|
|
142
|
-
server.use(rest.get('/api/users', (req, res, ctx) => res(ctx.status(500))))
|
|
143
|
-
render(<UserList />)
|
|
144
|
-
expect(await screen.findByText('エラーが発生しました')).toBeInTheDocument()
|
|
145
|
-
})
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### ユーザー中心のクエリ
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
// 良い: アクセシブルなクエリ
|
|
152
|
-
screen.getByRole('button', { name: 'Submit' })
|
|
153
|
-
screen.getByLabelText('Email')
|
|
154
|
-
screen.getByText('Welcome')
|
|
155
|
-
|
|
156
|
-
// 悪い: 実装詳細への依存
|
|
157
|
-
screen.getByTestId('submit-btn')
|
|
158
|
-
container.querySelector('.btn-primary')
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### 非同期処理のテスト
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
it('loads and displays user data', async () => {
|
|
165
|
-
render(<UserProfile userId="1" />)
|
|
166
|
-
|
|
167
|
-
// ローディング状態を確認
|
|
168
|
-
expect(screen.getByText('Loading...')).toBeInTheDocument()
|
|
169
|
-
|
|
170
|
-
// データ表示を待機
|
|
171
|
-
expect(await screen.findByText('John Doe')).toBeInTheDocument()
|
|
172
|
-
|
|
173
|
-
// ローディングが消えていることを確認
|
|
174
|
-
expect(screen.queryByText('Loading...')).not.toBeInTheDocument()
|
|
175
|
-
})
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
### フォームテスト
|
|
179
|
-
|
|
180
|
-
```typescript
|
|
181
|
-
it('submits form with valid data', async () => {
|
|
182
|
-
const onSubmit = vi.fn()
|
|
183
|
-
render(<LoginForm onSubmit={onSubmit} />)
|
|
184
|
-
|
|
185
|
-
await userEvent.type(screen.getByLabelText('Email'), 'test@example.com')
|
|
186
|
-
await userEvent.type(screen.getByLabelText('Password'), 'password123')
|
|
187
|
-
await userEvent.click(screen.getByRole('button', { name: 'Login' }))
|
|
188
|
-
|
|
189
|
-
expect(onSubmit).toHaveBeenCalledWith({
|
|
190
|
-
email: 'test@example.com',
|
|
191
|
-
password: 'password123'
|
|
192
|
-
})
|
|
193
|
-
})
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
## アンチパターン
|
|
197
|
-
|
|
198
|
-
```typescript
|
|
199
|
-
// 悪い: 実装詳細のテスト
|
|
200
|
-
it('calls setState', () => {
|
|
201
|
-
const setState = vi.spyOn(React, 'useState')
|
|
202
|
-
render(<Counter />)
|
|
203
|
-
// ...
|
|
204
|
-
})
|
|
205
|
-
|
|
206
|
-
// 良い: ユーザーが見る結果をテスト
|
|
207
|
-
it('increments count when clicked', () => {
|
|
208
|
-
render(<Counter />)
|
|
209
|
-
fireEvent.click(screen.getByRole('button', { name: '+' }))
|
|
210
|
-
expect(screen.getByText('Count: 1')).toBeInTheDocument()
|
|
211
|
-
})
|
|
212
|
-
```
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: implementation-approach
|
|
3
|
-
description: メタ認知的アプローチによる実装戦略選択フレームワーク。確認レベル、統合ポイント定義を含む。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 実装戦略選択フレームワーク(メタ認知的アプローチ)
|
|
7
|
-
|
|
8
|
-
## メタ認知的戦略選択プロセス
|
|
9
|
-
|
|
10
|
-
### Phase 1: 現状の包括的分析
|
|
11
|
-
|
|
12
|
-
**核心質問**: 「既存の実装はどうなっているのか?」
|
|
13
|
-
|
|
14
|
-
#### 分析フレームワーク
|
|
15
|
-
```yaml
|
|
16
|
-
アーキテクチャ分析: 責務分離、データフロー、依存関係、技術的負債
|
|
17
|
-
実装品質評価: コード品質、テストカバレッジ、パフォーマンス、セキュリティ
|
|
18
|
-
歴史的文脈理解: 現在の形の理由、過去判断の妥当性、制約の変化、要求の進化
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
#### メタ認知質問リスト
|
|
22
|
-
- この実装の真の責務は何か?
|
|
23
|
-
- どの部分がビジネス本質で、どの部分が技術的制約由来か?
|
|
24
|
-
- コードから明確でない依存関係や暗黙の前提条件は何か?
|
|
25
|
-
- 現在の設計がもたらしている利点と制約は?
|
|
26
|
-
|
|
27
|
-
### Phase 2: 戦略探索と創造
|
|
28
|
-
|
|
29
|
-
**核心質問**: 「before → after を判断する時に、参考にすべき実装パターンや戦略は何なのか?」
|
|
30
|
-
|
|
31
|
-
#### 戦略発見プロセス
|
|
32
|
-
```yaml
|
|
33
|
-
調査・探索: 技術スタック事例(WebSearch活用)、同種プロジェクト、OSS実装、文献・ブログ
|
|
34
|
-
創造的思考: 戦略組み合わせ、制約前提設計、フェーズ分け、拡張ポイント設計
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
#### 参考戦略パターン(創造的組み合わせを推奨)
|
|
38
|
-
|
|
39
|
-
**レガシー対応戦略**:
|
|
40
|
-
- ストラングラーパターン: 段階的置換による漸進的移行
|
|
41
|
-
- ファサードパターン: 統一インターフェースによる複雑性の隠蔽
|
|
42
|
-
- アダプターパターン: 既存システムとの橋渡し
|
|
43
|
-
|
|
44
|
-
**新規開発戦略**:
|
|
45
|
-
- 機能駆動開発: ユーザー価値重視の縦断実装
|
|
46
|
-
- 基盤駆動開発: 安定性重視の基盤優先構築
|
|
47
|
-
- リスク駆動開発: 最大リスク要素から優先的に対処
|
|
48
|
-
|
|
49
|
-
**統合・移行戦略**:
|
|
50
|
-
- プロキシパターン: 透過的な機能拡張
|
|
51
|
-
- デコレーターパターン: 既存機能の段階的強化
|
|
52
|
-
- ブリッジパターン: 抽象化による柔軟性確保
|
|
53
|
-
|
|
54
|
-
**重要**: 最適解は各プロジェクトの文脈に応じた創造的思考により発見される。
|
|
55
|
-
|
|
56
|
-
### Phase 3: リスク評価とコントロール
|
|
57
|
-
|
|
58
|
-
**核心質問**: 「既存の実装にそれを当てはめた時にどういうリスクが発生し、それをどうコントロールするのが最良なのか?」
|
|
59
|
-
|
|
60
|
-
#### リスク分析マトリクス
|
|
61
|
-
```yaml
|
|
62
|
-
技術的リスク: 既存システム影響、データ整合性、パフォーマンス劣化、統合複雑性
|
|
63
|
-
運用リスク: サービス可用性、デプロイダウンタイム、運用プロセス変更、切り戻し手順
|
|
64
|
-
プロジェクトリスク: スケジュール遅延、技術習得コスト、品質達成度、チーム連携
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
#### リスクコントロール戦略
|
|
68
|
-
```yaml
|
|
69
|
-
予防的対策: 段階的移行、並行動作検証、統合・回帰テスト追加、監視設定
|
|
70
|
-
発生時対応: 切り戻し手順、ログ・メトリクス準備、連絡体制定義、サービス継続手順
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### Phase 4: 制約適合性検証
|
|
74
|
-
|
|
75
|
-
**核心質問**: 「このプロジェクトの制約は何か?」
|
|
76
|
-
|
|
77
|
-
#### 制約チェックリスト
|
|
78
|
-
```yaml
|
|
79
|
-
技術的制約: ライブラリ互換性、リソース容量、義務要件、数値目標
|
|
80
|
-
時間的制約: 期限・優先度、依存関係、マイルストーン、学習期間
|
|
81
|
-
リソース制約: チーム・スキル、作業時間・体制、予算、外部契約
|
|
82
|
-
ビジネス制約: 市場投入時期、顧客影響、法規制・標準
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### Phase 5: 実装アプローチ決定
|
|
86
|
-
|
|
87
|
-
基本的な実装アプローチから最適解を選択(創造的組み合わせも推奨):
|
|
88
|
-
|
|
89
|
-
#### 垂直スライス(機能駆動)
|
|
90
|
-
**特徴**: 機能単位で全層を縦断実装
|
|
91
|
-
**適用条件**: 機能間の依存が少ない、ユーザーが利用可能な形で出力、アーキテクチャ全層への変更が必要
|
|
92
|
-
**確認方法**: 各機能完成時のエンドユーザー価値提供
|
|
93
|
-
|
|
94
|
-
#### 水平スライス(基盤駆動)
|
|
95
|
-
**特徴**: アーキテクチャ層別の段階的構築
|
|
96
|
-
**適用条件**: 基盤システムの安定性が重要、複数機能が共通基盤に依存、層別の段階的確認が有効
|
|
97
|
-
**確認方法**: 全基盤層完成時の統合動作確認
|
|
98
|
-
|
|
99
|
-
#### ハイブリッド(創造的組み合わせ)
|
|
100
|
-
**特徴**: プロジェクト特性に応じた柔軟な組み合わせ
|
|
101
|
-
**適用条件**: 要件が明確でない、フェーズごとにアプローチ変更が必要、プロトタイピングから本格実装への移行
|
|
102
|
-
**確認方法**: 各フェーズの目標に応じてL1/L2/L3の適切なレベルで確認
|
|
103
|
-
|
|
104
|
-
### Phase 6: 判断根拠の文書化
|
|
105
|
-
|
|
106
|
-
**Design Docでの記載**:実装戦略の選択理由と根拠を明記する。
|
|
107
|
-
|
|
108
|
-
## 確認レベル定義
|
|
109
|
-
|
|
110
|
-
各タスクの完了確認における優先順位:
|
|
111
|
-
|
|
112
|
-
- **L1: 機能動作確認** - エンドユーザー機能として動作(例:検索実行可能)
|
|
113
|
-
- **L2: テスト動作確認** - 新規テストが追加されパス(例:型定義テスト)
|
|
114
|
-
- **L3: ビルド成功確認** - コンパイルエラーなし(例:インターフェース定義)
|
|
115
|
-
|
|
116
|
-
**優先順位**: L1 > L2 > L3 の順で確認可能性を重視
|
|
117
|
-
|
|
118
|
-
## 統合ポイントの定義
|
|
119
|
-
|
|
120
|
-
選択した戦略に応じて統合ポイントを定義:
|
|
121
|
-
- **ストラングラー系**: 各機能の新旧システム切り替え時
|
|
122
|
-
- **機能駆動**: ユーザーが実際に機能を利用可能になった時
|
|
123
|
-
- **基盤駆動**: 全アーキテクチャ層が揃いE2Eテストが通った時
|
|
124
|
-
- **ハイブリッド**: 各フェーズで定義した個別目標達成時
|
|
125
|
-
|
|
126
|
-
## アンチパターン
|
|
127
|
-
|
|
128
|
-
- **パターン固執**: リスト内の戦略のみで選択し、独自の組み合わせを検討しない
|
|
129
|
-
- **分析不足**: Phase 1の分析フレームワークを飛ばして戦略選択
|
|
130
|
-
- **リスク軽視**: Phase 3のリスク分析マトリクスを省略して実装着手
|
|
131
|
-
- **制約無視**: Phase 4の制約チェックリストを確認せず戦略決定
|
|
132
|
-
- **根拠省略**: Phase 6の文書化テンプレートを使用せず戦略選択
|
|
133
|
-
|
|
134
|
-
## メタ認知的実行のための指針
|
|
135
|
-
|
|
136
|
-
1. **既知パターンの活用**: 出発点として参考し、創造的組み合わせを探索
|
|
137
|
-
2. **WebSearch積極活用**: 同種技術スタックの実装事例を調査
|
|
138
|
-
3. **5 Whys適用**: 根本理由を追求し本質を把握
|
|
139
|
-
4. **複数観点評価**: Phase 1-4の各観点から網羅的に評価
|
|
140
|
-
5. **創造的思考**: 複数戦略の順序適用やプロジェクト固有の制約を活かした設計を検討
|
|
141
|
-
6. **判断根拠明示**: 設計ドキュメントでの戦略選択根拠を明示化
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: integration-e2e-testing
|
|
3
|
-
description: 統合・E2Eテスト設計原則、ROI計算、テストスケルトン仕様、レビュー基準。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 統合テスト・E2Eテスト設計・実装ルール
|
|
7
|
-
|
|
8
|
-
## テスト種別と上限
|
|
9
|
-
|
|
10
|
-
| 種別 | 目的 | ファイル形式 | 上限 |
|
|
11
|
-
|------|------|-------------|------|
|
|
12
|
-
| 統合テスト | コンポーネント間連携検証 | `*.int.test.ts` | 機能あたり3件 |
|
|
13
|
-
| E2Eテスト | クリティカルユーザージャーニー検証 | `*.e2e.test.ts` | 機能あたり1-2件 |
|
|
14
|
-
|
|
15
|
-
**クリティカルユーザージャーニー**: 収益影響・法的要件・大多数のユーザーが日常的に利用する機能
|
|
16
|
-
|
|
17
|
-
## 振る舞い優先の原則
|
|
18
|
-
|
|
19
|
-
### 観測可能性チェック(全てYESで対象)
|
|
20
|
-
|
|
21
|
-
| チェック | 質問 | NOの場合 |
|
|
22
|
-
|---------|------|----------|
|
|
23
|
-
| 観測可能 | ユーザーが結果を観測できるか? | 除外 |
|
|
24
|
-
| システム文脈 | 複数コンポーネントの統合が必要か? | 除外 |
|
|
25
|
-
| 自動化可能 | CI環境で安定実行できるか? | 除外 |
|
|
26
|
-
|
|
27
|
-
### Include/Exclude基準
|
|
28
|
-
|
|
29
|
-
**Include**: ビジネスロジック正確性、データ整合性、ユーザー可視機能、エラーハンドリング
|
|
30
|
-
**Exclude**: 外部実接続、パフォーマンス指標、実装詳細、UIレイアウト
|
|
31
|
-
|
|
32
|
-
## スケルトン仕様
|
|
33
|
-
|
|
34
|
-
### 必須コメント形式
|
|
35
|
-
|
|
36
|
-
```typescript
|
|
37
|
-
// AC: "[受入条件原文]"
|
|
38
|
-
// ROI: [0-100] | ビジネス価値: [0-10] | 頻度: [0-10]
|
|
39
|
-
// 振る舞い: [トリガー] → [処理] → [観測可能な結果]
|
|
40
|
-
// @category: core-functionality | integration | edge-case | ux | e2e
|
|
41
|
-
// @dependency: none | [コンポーネント名] | full-system
|
|
42
|
-
// @complexity: low | medium | high
|
|
43
|
-
it.todo('[AC番号]: [テスト名]')
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### Property注釈
|
|
47
|
-
|
|
48
|
-
```typescript
|
|
49
|
-
// Property: `[検証式]`
|
|
50
|
-
// fast-check: fc.property(fc.[arbitrary], (input) => [不変条件])
|
|
51
|
-
it.todo('[AC番号]-property: [不変条件記述]')
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### ROI計算
|
|
55
|
-
|
|
56
|
-
```
|
|
57
|
-
ROI = (ビジネス価値 × 頻度 + 法的要件 × 10 + 欠陥検出) / 総コスト
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
| 種別 | 総コスト | E2E生成条件 |
|
|
61
|
-
|------|---------|------------|
|
|
62
|
-
| 統合 | 11 | - |
|
|
63
|
-
| E2E | 38 | ROI > 50 |
|
|
64
|
-
|
|
65
|
-
## 実装ルール
|
|
66
|
-
|
|
67
|
-
### Property-Based Test実装
|
|
68
|
-
|
|
69
|
-
Property注釈がある場合、fast-checkライブラリ必須:
|
|
70
|
-
|
|
71
|
-
```typescript
|
|
72
|
-
import fc from 'fast-check'
|
|
73
|
-
|
|
74
|
-
it('AC2-property: モデル名は常にgemini-3-pro-image-preview', () => {
|
|
75
|
-
fc.assert(
|
|
76
|
-
fc.property(fc.string(), (prompt) => {
|
|
77
|
-
const result = client.generate(prompt)
|
|
78
|
-
return result.model === 'gemini-3-pro-image-preview'
|
|
79
|
-
})
|
|
80
|
-
)
|
|
81
|
-
})
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
**必須事項**:
|
|
85
|
-
- `fc.assert(fc.property(...))` 形式で記述
|
|
86
|
-
- スケルトンの`// fast-check:`コメントをそのまま実装に反映
|
|
87
|
-
- 失敗ケース発見時は具体的なユニットテストとして追加(リグレッション防止)
|
|
88
|
-
|
|
89
|
-
### 振る舞い検証の実装
|
|
90
|
-
|
|
91
|
-
**振る舞い記述の検証レベル**:
|
|
92
|
-
|
|
93
|
-
| ステップ種別 | 検証対象 | 例 |
|
|
94
|
-
|-------------|---------|-----|
|
|
95
|
-
| トリガー | Arrangeで再現 | API障害 → mockResolvedValue({ ok: false }) |
|
|
96
|
-
| 処理 | 中間状態または呼び出し | 関数呼び出し、状態変更 |
|
|
97
|
-
| 観測可能な結果 | 最終出力の値 | 戻り値、エラーメッセージ、ログ出力 |
|
|
98
|
-
|
|
99
|
-
**判定基準**: 「観測可能な結果」がテスト対象の**戻り値またはモックの呼び出し引数**として検証されていれば合格
|
|
100
|
-
|
|
101
|
-
### 検証項目の決定ルール
|
|
102
|
-
|
|
103
|
-
| スケルトンの状態 | 検証項目の決定方法 |
|
|
104
|
-
|-----------------|-------------------|
|
|
105
|
-
| `// 検証項目:` が列挙されている | 列挙された全項目をexpectで実装 |
|
|
106
|
-
| `// 検証項目:` がない | 「振る舞い」記述の「観測可能な結果」から導出 |
|
|
107
|
-
| 両方ある | 検証項目を優先、振る舞いは補足として使用 |
|
|
108
|
-
|
|
109
|
-
### 統合テストのモック境界
|
|
110
|
-
|
|
111
|
-
| 判断基準 | モック | 実物 |
|
|
112
|
-
|---------|--------|------|
|
|
113
|
-
| テスト対象の一部か? | No → モック可 | Yes → 実物必須 |
|
|
114
|
-
| 呼び出しがテストの検証対象か? | No → モック可 | Yes → 実物または検証可能なモック |
|
|
115
|
-
| 外部ネットワーク通信か? | Yes → モック必須 | No → 実物推奨 |
|
|
116
|
-
|
|
117
|
-
**判定フロー**:
|
|
118
|
-
1. 外部API(HTTP通信)→ モック必須
|
|
119
|
-
2. テスト対象のコンポーネント間連携 → 実物必須
|
|
120
|
-
3. ログ出力の検証が必要 → 検証可能なモック(vi.fn())を使用
|
|
121
|
-
4. ログ出力の検証が不要 → 実物または無視
|
|
122
|
-
|
|
123
|
-
### E2Eテストの実行条件
|
|
124
|
-
|
|
125
|
-
- 全コンポーネント実装完了後に実行
|
|
126
|
-
- モック禁止(`@dependency: full-system`)
|
|
127
|
-
|
|
128
|
-
## レビュー基準
|
|
129
|
-
|
|
130
|
-
### スケルトンと実装の整合性
|
|
131
|
-
|
|
132
|
-
| チェック | 不合格条件 |
|
|
133
|
-
|---------|-----------|
|
|
134
|
-
| Property検証 | Property注釈があるのにfast-check未使用 |
|
|
135
|
-
| 振る舞い検証 | 「観測可能な結果」に対応するexpectがない |
|
|
136
|
-
| 検証項目網羅 | 列挙された検証項目がexpectに含まれていない |
|
|
137
|
-
| モック境界 | 統合テストで内部コンポーネントをモック化 |
|
|
138
|
-
|
|
139
|
-
### 実装品質
|
|
140
|
-
|
|
141
|
-
| チェック | 不合格条件 |
|
|
142
|
-
|---------|-----------|
|
|
143
|
-
| AAA構造 | Arrange/Act/Assertの区切りが不明確 |
|
|
144
|
-
| 独立性 | テスト間で状態共有、実行順序依存 |
|
|
145
|
-
| 再現性 | 日時・乱数に依存し結果が変動 |
|
|
146
|
-
| 可読性 | テスト名と検証内容が一致しない |
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: project-context
|
|
3
|
-
description: プロジェクトの性質、技術スタック、実装原則を含むプロジェクト固有コンテキスト。各プロジェクトでカスタマイズ可能。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# プロジェクトコンテキスト
|
|
7
|
-
|
|
8
|
-
## 基本設定
|
|
9
|
-
|
|
10
|
-
### プロジェクトの性質
|
|
11
|
-
- **プロジェクト形態**: Claude Code専用TypeScriptプロジェクトテンプレート
|
|
12
|
-
- **利用範囲**: プロジェクトの要件に応じて設定可能
|
|
13
|
-
- **実装方針**: LLM主導実装、品質重視、YAGNI原則徹底
|
|
14
|
-
|
|
15
|
-
### 技術スタック
|
|
16
|
-
- **基盤技術**: TypeScript、Node.js
|
|
17
|
-
- **テストフレームワーク**: Vitest
|
|
18
|
-
- **品質管理**: Biome、TypeScript strict mode
|
|
19
|
-
|
|
20
|
-
## 実装原則
|
|
21
|
-
|
|
22
|
-
### 実装方針の特徴
|
|
23
|
-
- **LLM主導実装**: Claude Codeが主要な実装者として機能
|
|
24
|
-
- **品質重視**: 速度より品質を優先する文化
|
|
25
|
-
- **YAGNI原則**: 必要になるまで実装しない
|
|
26
|
-
- **体系的な設計**: ADR/Design Doc/作業計画書による設計プロセス
|
|
27
|
-
|
|
28
|
-
## カスタマイズガイド
|
|
29
|
-
|
|
30
|
-
新しいプロジェクトでこのテンプレートを使用する場合:
|
|
31
|
-
|
|
32
|
-
1. **プロジェクト固有情報の追加**
|
|
33
|
-
- ターゲットユーザー特性
|
|
34
|
-
- ビジネス要件と制約
|
|
35
|
-
- 技術的制約事項
|
|
36
|
-
|
|
37
|
-
2. **アーキテクチャの選択**
|
|
38
|
-
- アーキテクチャスキルから適切なパターンを選択
|
|
39
|
-
|
|
40
|
-
3. **環境設定**
|
|
41
|
-
- プロジェクトに適した環境変数管理方法の実装
|
|
42
|
-
- プロジェクト固有の設定ファイル追加
|