@einja/dev-cli 0.1.6
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/README.md +179 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +49 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +243 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +23 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/sync.d.ts +7 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +294 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/sync.test.d.ts +2 -0
- package/dist/commands/sync.test.d.ts.map +1 -0
- package/dist/commands/sync.test.js +593 -0
- package/dist/commands/sync.test.js.map +1 -0
- package/dist/commands/task-loop.d.ts +11 -0
- package/dist/commands/task-loop.d.ts.map +1 -0
- package/dist/commands/task-loop.js +81 -0
- package/dist/commands/task-loop.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/file-system.d.ts +39 -0
- package/dist/lib/file-system.d.ts.map +1 -0
- package/dist/lib/file-system.js +79 -0
- package/dist/lib/file-system.js.map +1 -0
- package/dist/lib/mcp-config.d.ts +43 -0
- package/dist/lib/mcp-config.d.ts.map +1 -0
- package/dist/lib/mcp-config.js +109 -0
- package/dist/lib/mcp-config.js.map +1 -0
- package/dist/lib/mcp-config.test.d.ts +2 -0
- package/dist/lib/mcp-config.test.d.ts.map +1 -0
- package/dist/lib/mcp-config.test.js +285 -0
- package/dist/lib/mcp-config.test.js.map +1 -0
- package/dist/lib/merger.d.ts +41 -0
- package/dist/lib/merger.d.ts.map +1 -0
- package/dist/lib/merger.js +164 -0
- package/dist/lib/merger.js.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.d.ts +35 -0
- package/dist/lib/preset-update/cli-repo-detector.d.ts.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.js +83 -0
- package/dist/lib/preset-update/cli-repo-detector.js.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.test.d.ts +2 -0
- package/dist/lib/preset-update/cli-repo-detector.test.d.ts.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.test.js +120 -0
- package/dist/lib/preset-update/cli-repo-detector.test.js.map +1 -0
- package/dist/lib/preset-update/file-copier.d.ts +59 -0
- package/dist/lib/preset-update/file-copier.d.ts.map +1 -0
- package/dist/lib/preset-update/file-copier.js +220 -0
- package/dist/lib/preset-update/file-copier.js.map +1 -0
- package/dist/lib/preset-update/file-copier.test.d.ts +2 -0
- package/dist/lib/preset-update/file-copier.test.d.ts.map +1 -0
- package/dist/lib/preset-update/file-copier.test.js +297 -0
- package/dist/lib/preset-update/file-copier.test.js.map +1 -0
- package/dist/lib/preset-update/preset-finder.d.ts +39 -0
- package/dist/lib/preset-update/preset-finder.d.ts.map +1 -0
- package/dist/lib/preset-update/preset-finder.js +92 -0
- package/dist/lib/preset-update/preset-finder.js.map +1 -0
- package/dist/lib/preset-update/preset-finder.test.d.ts +2 -0
- package/dist/lib/preset-update/preset-finder.test.d.ts.map +1 -0
- package/dist/lib/preset-update/preset-finder.test.js +128 -0
- package/dist/lib/preset-update/preset-finder.test.js.map +1 -0
- package/dist/lib/preset.d.ts +14 -0
- package/dist/lib/preset.d.ts.map +1 -0
- package/dist/lib/preset.js +52 -0
- package/dist/lib/preset.js.map +1 -0
- package/dist/lib/sync/backup-manager.d.ts +50 -0
- package/dist/lib/sync/backup-manager.d.ts.map +1 -0
- package/dist/lib/sync/backup-manager.js +117 -0
- package/dist/lib/sync/backup-manager.js.map +1 -0
- package/dist/lib/sync/backup-manager.test.d.ts +2 -0
- package/dist/lib/sync/backup-manager.test.d.ts.map +1 -0
- package/dist/lib/sync/backup-manager.test.js +155 -0
- package/dist/lib/sync/backup-manager.test.js.map +1 -0
- package/dist/lib/sync/batch-processor.d.ts +27 -0
- package/dist/lib/sync/batch-processor.d.ts.map +1 -0
- package/dist/lib/sync/batch-processor.js +46 -0
- package/dist/lib/sync/batch-processor.js.map +1 -0
- package/dist/lib/sync/batch-processor.test.d.ts +2 -0
- package/dist/lib/sync/batch-processor.test.d.ts.map +1 -0
- package/dist/lib/sync/batch-processor.test.js +110 -0
- package/dist/lib/sync/batch-processor.test.js.map +1 -0
- package/dist/lib/sync/category-validator.d.ts +36 -0
- package/dist/lib/sync/category-validator.d.ts.map +1 -0
- package/dist/lib/sync/category-validator.js +46 -0
- package/dist/lib/sync/category-validator.js.map +1 -0
- package/dist/lib/sync/category-validator.test.d.ts +2 -0
- package/dist/lib/sync/category-validator.test.d.ts.map +1 -0
- package/dist/lib/sync/category-validator.test.js +89 -0
- package/dist/lib/sync/category-validator.test.js.map +1 -0
- package/dist/lib/sync/conflict-reporter.d.ts +57 -0
- package/dist/lib/sync/conflict-reporter.d.ts.map +1 -0
- package/dist/lib/sync/conflict-reporter.js +81 -0
- package/dist/lib/sync/conflict-reporter.js.map +1 -0
- package/dist/lib/sync/conflict-reporter.test.d.ts +2 -0
- package/dist/lib/sync/conflict-reporter.test.d.ts.map +1 -0
- package/dist/lib/sync/conflict-reporter.test.js +132 -0
- package/dist/lib/sync/conflict-reporter.test.js.map +1 -0
- package/dist/lib/sync/diff-engine.d.ts +28 -0
- package/dist/lib/sync/diff-engine.d.ts.map +1 -0
- package/dist/lib/sync/diff-engine.js +118 -0
- package/dist/lib/sync/diff-engine.js.map +1 -0
- package/dist/lib/sync/diff-engine.test.d.ts +2 -0
- package/dist/lib/sync/diff-engine.test.d.ts.map +1 -0
- package/dist/lib/sync/diff-engine.test.js +133 -0
- package/dist/lib/sync/diff-engine.test.js.map +1 -0
- package/dist/lib/sync/file-filter.d.ts +40 -0
- package/dist/lib/sync/file-filter.d.ts.map +1 -0
- package/dist/lib/sync/file-filter.js +171 -0
- package/dist/lib/sync/file-filter.js.map +1 -0
- package/dist/lib/sync/file-filter.test.d.ts +2 -0
- package/dist/lib/sync/file-filter.test.d.ts.map +1 -0
- package/dist/lib/sync/file-filter.test.js +179 -0
- package/dist/lib/sync/file-filter.test.js.map +1 -0
- package/dist/lib/sync/hash-cache.d.ts +34 -0
- package/dist/lib/sync/hash-cache.d.ts.map +1 -0
- package/dist/lib/sync/hash-cache.js +51 -0
- package/dist/lib/sync/hash-cache.js.map +1 -0
- package/dist/lib/sync/hash-cache.test.d.ts +2 -0
- package/dist/lib/sync/hash-cache.test.d.ts.map +1 -0
- package/dist/lib/sync/hash-cache.test.js +110 -0
- package/dist/lib/sync/hash-cache.test.js.map +1 -0
- package/dist/lib/sync/integration.test.d.ts +2 -0
- package/dist/lib/sync/integration.test.d.ts.map +1 -0
- package/dist/lib/sync/integration.test.js +317 -0
- package/dist/lib/sync/integration.test.js.map +1 -0
- package/dist/lib/sync/marker-processor.d.ts +54 -0
- package/dist/lib/sync/marker-processor.d.ts.map +1 -0
- package/dist/lib/sync/marker-processor.js +208 -0
- package/dist/lib/sync/marker-processor.js.map +1 -0
- package/dist/lib/sync/marker-processor.test.d.ts +2 -0
- package/dist/lib/sync/marker-processor.test.d.ts.map +1 -0
- package/dist/lib/sync/marker-processor.test.js +245 -0
- package/dist/lib/sync/marker-processor.test.js.map +1 -0
- package/dist/lib/sync/metadata-manager.d.ts +46 -0
- package/dist/lib/sync/metadata-manager.d.ts.map +1 -0
- package/dist/lib/sync/metadata-manager.js +129 -0
- package/dist/lib/sync/metadata-manager.js.map +1 -0
- package/dist/lib/sync/metadata-manager.test.d.ts +2 -0
- package/dist/lib/sync/metadata-manager.test.d.ts.map +1 -0
- package/dist/lib/sync/metadata-manager.test.js +137 -0
- package/dist/lib/sync/metadata-manager.test.js.map +1 -0
- package/dist/lib/sync/performance.test.d.ts +2 -0
- package/dist/lib/sync/performance.test.d.ts.map +1 -0
- package/dist/lib/sync/performance.test.js +126 -0
- package/dist/lib/sync/performance.test.js.map +1 -0
- package/dist/types/index.d.ts +59 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/preset-update.d.ts +106 -0
- package/dist/types/preset-update.d.ts.map +1 -0
- package/dist/types/preset-update.js +5 -0
- package/dist/types/preset-update.js.map +1 -0
- package/dist/types/sync.d.ts +169 -0
- package/dist/types/sync.d.ts.map +1 -0
- package/dist/types/sync.js +19 -0
- package/dist/types/sync.js.map +1 -0
- package/package.json +72 -0
- package/presets/minimal/.claude/agents/einja/docs/docs-updater.md +161 -0
- package/presets/minimal/.claude/agents/einja/frontend/design-engineer.md +685 -0
- package/presets/minimal/.claude/agents/einja/frontend/frontend-architect.md +747 -0
- package/presets/minimal/.claude/agents/einja/frontend/frontend-coder.md +441 -0
- package/presets/minimal/.claude/agents/einja/git/conflict-resolver.md +148 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-design-generator.md +462 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-qa-generator.md +466 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-requirements-generator.md +416 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-tasks-generator.md +608 -0
- package/presets/minimal/.claude/agents/einja/task/task-committer.md +82 -0
- package/presets/minimal/.claude/agents/einja/task/task-executer.md +352 -0
- package/presets/minimal/.claude/agents/einja/task/task-modification-analyzer.md +369 -0
- package/presets/minimal/.claude/agents/einja/task/task-qa.md +74 -0
- package/presets/minimal/.claude/agents/einja/task/task-reviewer.md +169 -0
- package/presets/minimal/.claude/commands/einja/frontend-implement.md +322 -0
- package/presets/minimal/.claude/commands/einja/spec-create.md +254 -0
- package/presets/minimal/.claude/commands/einja/start-dev.md +98 -0
- package/presets/minimal/.claude/commands/einja/sync-cursor-commands.md +203 -0
- package/presets/minimal/.claude/commands/einja/task-exec.md +390 -0
- package/presets/minimal/.claude/commands/einja/update-docs-by-task-specs.md +448 -0
- package/presets/minimal/.claude/hooks/einja/biome-format.sh +49 -0
- package/presets/minimal/.claude/hooks/einja/design-doc-check.sh +61 -0
- package/presets/minimal/.claude/hooks/einja/detect-secrets.sh +62 -0
- package/presets/minimal/.claude/hooks/einja/large-file-warning.sh +42 -0
- package/presets/minimal/.claude/hooks/einja/playwright-resize.sh +36 -0
- package/presets/minimal/.claude/hooks/einja/typecheck.sh +37 -0
- package/presets/minimal/.claude/hooks/einja/unset-volta-recursion.sh +32 -0
- package/presets/minimal/.claude/hooks/einja/validate-git-commit.sh +239 -0
- package/presets/minimal/.claude/hooks/einja/warn-index-ts.sh +34 -0
- package/presets/minimal/.claude/hooks/einja/warn-relative-import.sh +48 -0
- package/presets/minimal/.claude/settings.json +174 -0
- package/presets/minimal/.claude/skills/einja/api-development/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/backend-architecture/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/SKILL.md +120 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/naming-conventions.md +107 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/prohibited-patterns.md +169 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/typescript-rules.md +247 -0
- package/presets/minimal/.claude/skills/einja/component-design/SKILL.md +109 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/directory-structure.md +117 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/props-patterns.md +159 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/styling-guide.md +200 -0
- package/presets/minimal/.claude/skills/einja/conflict-resolver/SKILL.md +190 -0
- package/presets/minimal/.claude/skills/einja/frontend-development/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/general-context-loader/SKILL.md +254 -0
- package/presets/minimal/.claude/skills/einja/output-format/SKILL.md +137 -0
- package/presets/minimal/.claude/skills/einja/spec-context-loader/SKILL.md +177 -0
- package/presets/minimal/.claude/skills/einja/task-commit/SKILL.md +269 -0
- package/presets/minimal/.claude/skills/einja/task-qa/SKILL.md +306 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/failure-patterns.md +69 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/troubleshooting.md +65 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/usage-patterns.md +52 -0
- package/presets/minimal/.claude/skills/einja/task-qa/templates/qa-test-template.md +128 -0
- package/presets/minimal/preset.yaml +111 -0
- package/presets/minimal/symlinks.json +45 -0
- package/scaffolds/.mcp.json +45 -0
- package/scaffolds/CLAUDE.md.template +318 -0
- package/scaffolds/steering/README.md +170 -0
- package/scaffolds/steering/acceptance-criteria-and-qa-guide.md +415 -0
- package/scaffolds/steering/architecture.md +481 -0
- package/scaffolds/steering/branch-strategy.md +362 -0
- package/scaffolds/steering/commit-rules.md +217 -0
- package/scaffolds/steering/db-schema-design.md +609 -0
- package/scaffolds/steering/development/api-development.md +783 -0
- package/scaffolds/steering/development/backend-architecture.md +731 -0
- package/scaffolds/steering/development/frontend-development.md +1537 -0
- package/scaffolds/steering/development/review-guidelines.md +365 -0
- package/scaffolds/steering/development/testing-strategy.md +819 -0
- package/scaffolds/steering/development-workflow.md +429 -0
- package/scaffolds/steering/infrastructure/deployment.md +277 -0
- package/scaffolds/steering/infrastructure/environment-variables.md +298 -0
- package/scaffolds/steering/product.md +540 -0
- package/scaffolds/steering/task-management.md +367 -0
- package/templates/README.md +159 -0
- package/templates/design-simple.md.template +172 -0
- package/templates/design.md.template +327 -0
- package/templates/qa-test.md.template +125 -0
- package/templates/requirements.md.template +254 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
# 価値あるテストを生む要件定義とテスト設計ガイド
|
|
2
|
+
|
|
3
|
+
## 1. 受け入れ基準の原則
|
|
4
|
+
|
|
5
|
+
### Do
|
|
6
|
+
- 振る舞い・入力・観測可能な結果をセットで書く(Given/When/Then または 条件/操作/期待結果)。
|
|
7
|
+
- ビジネス価値やユーザー影響が分かる文脈を添える(誰が何のために使うか)。
|
|
8
|
+
- 正常系に加え、代表的な異常・境界ケースを列挙する。
|
|
9
|
+
- 観測手段(API レスポンス、イベント、DB 状態など)を明示する。
|
|
10
|
+
- 実装と無関係な用語で書き、内部構造への言及は避ける。
|
|
11
|
+
|
|
12
|
+
### Don't
|
|
13
|
+
- 「ファイルが存在する」「〇〇を返すクラスがある」など構造・命名のみを確認させる。
|
|
14
|
+
- 単一の肯定文で完結させて振る舞いの条件や観測結果を書かない。
|
|
15
|
+
- テストレベルを曖昧にし、誰がどの観点で検証するか不明瞭にする。
|
|
16
|
+
- 期待結果を「問題ないこと」「成功すること」で済ませる。
|
|
17
|
+
- 実装手段(特定フレームワーク、DB テーブル構造など)を強制する。
|
|
18
|
+
|
|
19
|
+
### 振る舞い駆動テンプレート
|
|
20
|
+
```
|
|
21
|
+
ACx.y: <振る舞いの名前>
|
|
22
|
+
- 前提: <状態/入力/役割>
|
|
23
|
+
- 操作: <ユーザー操作 or システムイベント>
|
|
24
|
+
- 期待結果: <観測可能なアウトプット>(例: HTTP ステータス/レスポンス/DB 変化/イベント)
|
|
25
|
+
- 検証レベル: <Unit | Integration | E2E | Browser>(複数可)
|
|
26
|
+
- 詳細は `docs/einja/steering/terminology.md` を参照
|
|
27
|
+
- 補足: <ビジネスルールやエッジケース>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 2. テスト設計の原則
|
|
31
|
+
|
|
32
|
+
### テストレベルと責務
|
|
33
|
+
- **単体 (Unit)**: 単一モジュールの意思決定ロジックを高速に検証。外部依存はモック化し、条件分岐とエッジケース網羅。
|
|
34
|
+
- **統合 (Integration)**: 境界(Repository+DB, UseCase+Gateway, API+Middleware など)越しの契約を検証。実際のインフラ接続や本物に近いセットアップを使い、主要なハッピーパス+代表的な異常系を確認。
|
|
35
|
+
- **E2E**: Playwrightコードによる自動テスト。`pnpm test:e2e`で実行され、リグレッション防止に使用。
|
|
36
|
+
- **Browser**: Playwright MCPによるブラウザテスト。task-qa Skillで実行され、画面フロー・UIインタラクションの確認に使用。
|
|
37
|
+
|
|
38
|
+
> **Note**: E2EとBrowserの違いについては `docs/einja/steering/terminology.md` を参照してください。
|
|
39
|
+
|
|
40
|
+
### 価値あるテスト判定基準
|
|
41
|
+
- 仮説: テストが守るべきビジネスルールや SLA が明文化されている。
|
|
42
|
+
- 分離: 振る舞い単位の原因→結果を説明できる。
|
|
43
|
+
- 再現性: 決定論的で、入力と期待結果から誰でも同じ結論を得られる。
|
|
44
|
+
- 監視性: 失敗時に「何が壊れたか」がメッセージやログから分かる。
|
|
45
|
+
- 保守性: 実装ディテールではなく契約・振る舞いに結び付いているため、内部構造変更で安易に壊れない。
|
|
46
|
+
- コスト対価: 実行時間/セットアップコストに見合うリスク低減効果がある。
|
|
47
|
+
|
|
48
|
+
### テスト-ファースト原則(ATDD)
|
|
49
|
+
テスト設計は**実装前**に行う。ワークフローは以下の順序で実行する:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
要件定義 → 設計 → QAテスト仕様(シナリオテスト含む)→ タスク分割 → 実装 → QA(実行のみ)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**禁止事項**:
|
|
56
|
+
- 実装後にテスト設計を行うこと
|
|
57
|
+
- テスト仕様なしでタスク分割を行うこと
|
|
58
|
+
- QAフェーズでテスト設計を新規作成すること(既存仕様の確認・実行のみ)
|
|
59
|
+
|
|
60
|
+
### シナリオテスト
|
|
61
|
+
シナリオテストは、複数のタスクをまたいで継続的に実行される操作フローを検証する。
|
|
62
|
+
|
|
63
|
+
**シナリオテストの目的**:
|
|
64
|
+
- 個別タスクのテストでは検出できない統合問題を発見
|
|
65
|
+
- ユーザーが実際に行う操作フロー全体の動作を確認
|
|
66
|
+
- タスク間の依存関係と連携を検証
|
|
67
|
+
|
|
68
|
+
**シナリオテストの特徴**:
|
|
69
|
+
- 複数のタスクグループにまたがる
|
|
70
|
+
- 各タスク完了時に実施可能な範囲が拡大
|
|
71
|
+
- Issue全体で共有される(`qa-tests/scenarios.md`に記載)
|
|
72
|
+
|
|
73
|
+
**シナリオテストテンプレート**:
|
|
74
|
+
```markdown
|
|
75
|
+
## シナリオ#1: [シナリオ名]
|
|
76
|
+
|
|
77
|
+
### 目的
|
|
78
|
+
[このシナリオで確認したいこと]
|
|
79
|
+
|
|
80
|
+
### 関連
|
|
81
|
+
- **受け入れ条件**: AC2.1, AC4.1, AC8.1(シナリオに関連するAC番号)
|
|
82
|
+
- **関連タスク**: 2.1, 2.4, 3.1(シナリオに含まれるタスク番号)
|
|
83
|
+
|
|
84
|
+
### 実施タイミング
|
|
85
|
+
- **タスク2.1完了後**: Step 1-3まで実施可能
|
|
86
|
+
- **タスク2.4完了後**: Step 1-5まで実施可能
|
|
87
|
+
- **タスク3.1完了後**: 全Step実施(フルシナリオ)
|
|
88
|
+
|
|
89
|
+
### テスト手順
|
|
90
|
+
|
|
91
|
+
| Step | 操作 | 確認項目 | 期待値 | 結果 |
|
|
92
|
+
|------|------|---------|--------|------|
|
|
93
|
+
| 1 | [操作内容] | [確認する項目] | [期待される結果] | - |
|
|
94
|
+
| 2 | ... | ... | ... | - |
|
|
95
|
+
|
|
96
|
+
### 実行ログ
|
|
97
|
+
(実施後に記載)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**シナリオテストの設計タイミング**:
|
|
101
|
+
- `/spec-create` コマンドの QAテスト仕様生成フェーズで作成
|
|
102
|
+
- requirements.md の受け入れ条件を分析し、複数ACをまたぐフローを特定
|
|
103
|
+
- タスク分割前に完了させる
|
|
104
|
+
|
|
105
|
+
## 3. 具体例集
|
|
106
|
+
|
|
107
|
+
### ケース1: データベース層(Repository)
|
|
108
|
+
- 悪い例: 「UserRepository が実装されている」
|
|
109
|
+
- 良い例:
|
|
110
|
+
```
|
|
111
|
+
AC1.1: UserRepository はメールアドレス重複を防ぐ
|
|
112
|
+
- 前提: 同一メールを持つユーザーが既に存在
|
|
113
|
+
- 操作: create({email}) を呼ぶ
|
|
114
|
+
- 期待結果: Result.Err(DuplicateEmail) を返し、DB 状態は変化しない
|
|
115
|
+
- 検証レベル: Integration(実 DB or Testcontainer)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### ケース2: アプリケーション層(UseCase)
|
|
119
|
+
- 悪い例: 「UseCase がオブジェクトリテラル形式で定義されている」
|
|
120
|
+
- 良い例:
|
|
121
|
+
```
|
|
122
|
+
AC2.2: PasswordResetUseCase はトークン発行後にメール送信イベントを発火
|
|
123
|
+
- 前提: 対象ユーザーが存在し、メール送信サービスが利用可
|
|
124
|
+
- 操作: execute({userId})
|
|
125
|
+
- 期待結果:
|
|
126
|
+
1. TokenRepository に 1 件レコード生成
|
|
127
|
+
2. DomainEventBus へ PasswordResetRequested を publish
|
|
128
|
+
- 検証レベル: Unit(メール送信はモック)、Integration(イベントバス接続)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### ケース3: API 層(REST)
|
|
132
|
+
- 悪い例: 「API エンドポイントが定義されている」
|
|
133
|
+
- 良い例:
|
|
134
|
+
```
|
|
135
|
+
AC3.4: GET /users/:id は権限エラーを 403 で返す
|
|
136
|
+
- 前提: 認証済みユーザー A がユーザー B を参照しようとする
|
|
137
|
+
- 操作: GET /users/B
|
|
138
|
+
- 期待結果: HTTP 403, body {"code":"FORBIDDEN","message":"..."}
|
|
139
|
+
- 検証レベル: Integration(API + DB + 認可ミドルウェア)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### ケース4: バッチ処理(Cron)
|
|
143
|
+
- 悪い例: 「job:cleanup スクリプトが存在する」
|
|
144
|
+
- 良い例:
|
|
145
|
+
```
|
|
146
|
+
AC4.3: cleanup ジョブは 30 日以上未使用のセッションを削除
|
|
147
|
+
- 前提: session テーブルに 29 日/30 日/31 日経過データが混在
|
|
148
|
+
- 操作: job:cleanup を実行
|
|
149
|
+
- 期待結果: 31 日 > のレコードのみ削除、削除件数をログ出力
|
|
150
|
+
- 検証レベル: Integration(実 DB)、E2E(ステージングで日次 Cron 監視)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### ケース5: フロントエンド(画面)
|
|
154
|
+
- 悪い例: 「ログイン画面コンポーネントが存在する」
|
|
155
|
+
- 良い例:
|
|
156
|
+
```
|
|
157
|
+
AC5.5: ログインフォームは誤ったパスワードで API エラーを表示
|
|
158
|
+
- 前提: ユーザーが存在、間違った PW を入力
|
|
159
|
+
- 操作: Submit
|
|
160
|
+
- 期待結果:
|
|
161
|
+
1. /api/login が 401 を返すまでスピナー表示
|
|
162
|
+
2. フォーム上に "メールアドレスまたはパスワードが違います" を表示
|
|
163
|
+
- 検証レベル: Unit(フォームバリデーション)、E2E(Playwright で API モック無)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## 4. QA 仕様書・エージェント指示
|
|
167
|
+
|
|
168
|
+
### QA 仕様書テンプレート
|
|
169
|
+
```
|
|
170
|
+
## 機能名
|
|
171
|
+
- 背景/価値:
|
|
172
|
+
- 関連 AC:
|
|
173
|
+
- テスト範囲: <Unit/Integration/E2E/Browser>(担当者or自動化)
|
|
174
|
+
- シナリオ:
|
|
175
|
+
1. タイトル
|
|
176
|
+
- 前提:
|
|
177
|
+
- 操作:
|
|
178
|
+
- 期待結果:
|
|
179
|
+
- ログ/メトリクス確認方法:
|
|
180
|
+
- 非対象(アウトオブスコープ):
|
|
181
|
+
- エビデンス(スクショ/ログ)の保存場所:
|
|
182
|
+
```
|
|
183
|
+
※ 構造確認チェックは「非対象」に明記し、必要に応じてリントや型チェックに委譲する。
|
|
184
|
+
|
|
185
|
+
### エージェント指示
|
|
186
|
+
- **task-executer**
|
|
187
|
+
- AC で指定された振る舞いをテストで再現しているか確認。
|
|
188
|
+
- 期待結果を実装ではなく外部契約(レスポンス、イベント、DB 状態)に結び付ける。
|
|
189
|
+
- 「構造だけを確認するテスト」は reject(例: `expect(fileExists).toBe(true)` など)。
|
|
190
|
+
- **task-qa**(🔴 ATDD準拠・動作確認必須)
|
|
191
|
+
- **Phase 1-2: テスト設計**
|
|
192
|
+
- AC に対応する Given/When/Then 形式のテストシナリオを設計。
|
|
193
|
+
- 構造確認だけのテストは設計禁止(「ファイルが存在する」「ビルドが成功する」等)。
|
|
194
|
+
- **Phase 3: 動作確認実施(🔴 最重要・必須)**
|
|
195
|
+
- 画面修正 → **ブラウザテスト(Playwright MCP)** で `browser_navigate` → `browser_snapshot` → 操作 → 結果確認
|
|
196
|
+
- API修正 → **API打鍵テスト(curl)** で `curl -i` リクエスト送信・レスポンス確認
|
|
197
|
+
- **ビルド/Lint成功だけでSUCCESSと判定することは禁止**
|
|
198
|
+
- **動作確認を実施せずにSUCCESSと判定することは禁止**
|
|
199
|
+
- 動作確認の実行ログを報告に必ず含める
|
|
200
|
+
- **Phase 4: 自動テスト**
|
|
201
|
+
- pnpm test, lint, build, typecheck を実行
|
|
202
|
+
- **Phase 5: 結果報告**
|
|
203
|
+
- 「Phase 3: 動作確認実施記録」セクションが空の場合、SUCCESSは認められない
|
|
204
|
+
- AC ごとの検証結果と検証方法を明記
|
|
205
|
+
|
|
206
|
+
## 5. チェックリスト
|
|
207
|
+
|
|
208
|
+
### 要件レビュー
|
|
209
|
+
- [ ] AC は「条件/操作/期待結果」が揃っているか。
|
|
210
|
+
- [ ] 観測可能なアウトプットで確認できるか。
|
|
211
|
+
- [ ] ビジネス価値やユーザー影響が説明されているか。
|
|
212
|
+
- [ ] ハッピーパスと主要な異常系が含まれているか。
|
|
213
|
+
- [ ] テストレベルと責任者が明記されているか。
|
|
214
|
+
- [ ] 実装構造への指示(ファイル名/クラス名など)が混入していないか。
|
|
215
|
+
|
|
216
|
+
### テストレビュー
|
|
217
|
+
- [ ] テスト名・説明が AC やビジネスルールを反映しているか。
|
|
218
|
+
- [ ] 入力→操作→期待結果が可読な形で記述されているか。
|
|
219
|
+
- [ ] 価値のないテスト(構造確認のみ、実装に強く依存)が存在しないか。
|
|
220
|
+
- [ ] フェイル時に原因が特定できるアサーション/ログか。
|
|
221
|
+
- [ ] 実行コスト(時間/環境構築)が妥当か、冗長なダブりがないか。
|
|
222
|
+
- [ ] シナリオのエビデンス(ログ/スクショ)が保存・共有されるか。
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## 6. QAテストの責務分離
|
|
227
|
+
|
|
228
|
+
### 単体テスト vs QAテスト
|
|
229
|
+
|
|
230
|
+
| 観点 | 単体テスト (Unit) | QAテスト (Integration/E2E) |
|
|
231
|
+
|-----|------------------|---------------------------|
|
|
232
|
+
| **担当者** | task-executer(開発者) | task-qa(QAエンジニア) |
|
|
233
|
+
| **ツール** | Jest/Vitest | ブラウザテスト(Playwright MCP)、API打鍵テスト(curl) |
|
|
234
|
+
| **対象** | コンポーネント、関数、Hook等の個別動作 | 画面フロー、API連携、データ永続化等の統合動作 |
|
|
235
|
+
| **モック** | 外部依存はモック化 | 実際のインフラ接続 |
|
|
236
|
+
| **目的** | 単一モジュールの意思決定ロジック検証 | ユーザー視点での最終価値確認 |
|
|
237
|
+
|
|
238
|
+
**重要**: QAテストは単体テストではカバーできない**統合確認**を行うことが目的です。
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 7. QA実行フロー(5 Phase)
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
Phase 1: 事前確認
|
|
246
|
+
├── シナリオテスト仕様(scenarios.md)の確認
|
|
247
|
+
├── 必須自動テストの実行(pnpm test/lint/build/typecheck)
|
|
248
|
+
└── すべて成功 → Phase 2へ / 失敗 → 即座にFAILURE
|
|
249
|
+
|
|
250
|
+
Phase 2: 実装整合性チェック
|
|
251
|
+
├── requirements.md の AC と実装の対応確認
|
|
252
|
+
├── design.md の設計と実装の整合性確認
|
|
253
|
+
└── 不整合発見 → 差し戻し判断
|
|
254
|
+
|
|
255
|
+
Phase 3: 動作確認実施(🔴 最重要・必須)
|
|
256
|
+
├── 画面修正 → Playwright MCP で操作・確認
|
|
257
|
+
├── API修正 → Curl でリクエスト・レスポンス確認
|
|
258
|
+
└── 動作確認なしでのSUCCESS判定は禁止
|
|
259
|
+
|
|
260
|
+
Phase 4: シナリオテスト実行
|
|
261
|
+
├── scenarios.md の該当シナリオを実行
|
|
262
|
+
└── 複数タスクをまたぐフローの統合確認
|
|
263
|
+
|
|
264
|
+
Phase 5: 結果報告
|
|
265
|
+
├── qa-tests/ に結果を記録
|
|
266
|
+
├── 失敗時は原因分類(A/B/C/D)
|
|
267
|
+
└── 次アクション決定(finisher/executer/qa-retry)
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**禁止事項**:
|
|
271
|
+
- ビルド/Lint成功だけでSUCCESSと判定すること
|
|
272
|
+
- Phase 3(動作確認)を実施せずにSUCCESSと判定すること
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## 8. 失敗原因分類(A/B/C/D)
|
|
277
|
+
|
|
278
|
+
QAテスト失敗時、以下の4分類のいずれかに分類し、適切な戻し先を決定します。
|
|
279
|
+
|
|
280
|
+
### 8.1 分類フローチャート
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
QAテスト失敗
|
|
284
|
+
↓
|
|
285
|
+
質問1: 実装コードに問題があるか?
|
|
286
|
+
YES → 【A: 実装ミス】 → task-executer
|
|
287
|
+
NO → 質問2へ
|
|
288
|
+
↓
|
|
289
|
+
質問2: requirements.md の受け入れ条件が不正確・不完全か?
|
|
290
|
+
YES → 【B: 要件齟齬】 → requirements.md修正 → task-executer
|
|
291
|
+
NO → 質問3へ
|
|
292
|
+
↓
|
|
293
|
+
質問3: design.md の設計・アーキテクチャに問題があるか?
|
|
294
|
+
YES → 【C: 設計不備】 → design.md修正 → task-executer
|
|
295
|
+
NO → 質問4へ
|
|
296
|
+
↓
|
|
297
|
+
質問4: 環境・インフラ・テストツールに問題があるか?
|
|
298
|
+
YES → 【D: 環境問題】 → qa再実行
|
|
299
|
+
NO → デフォルトで【A: 実装ミス】として扱う
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### 8.2 各分類の定義
|
|
303
|
+
|
|
304
|
+
| 分類 | 定義 | 判定基準例 | 戻し先 |
|
|
305
|
+
|-----|------|----------|-------|
|
|
306
|
+
| **A: 実装ミス** | コードの論理エラー、バグ、実装漏れ | TypeScriptエラー、ランタイムエラー、ロジック不具合、単体テスト失敗 | task-executer |
|
|
307
|
+
| **B: 要件齟齬** | requirements.md の受け入れ条件が実際の要求と異なる | ACの期待結果が曖昧、ビジネスルール未記載、AC間の矛盾 | requirements.md修正 → task-executer |
|
|
308
|
+
| **C: 設計不備** | design.md のアーキテクチャ・設計方針に問題 | トランザクション設計不備、スキーマ設計ミス、インターフェース不備 | design.md修正 → task-executer |
|
|
309
|
+
| **D: 環境問題** | テスト環境、インフラ、ツールの問題 | DB接続エラー、Playwright接続失敗、タイムアウト、ポート競合 | qa再実行 |
|
|
310
|
+
|
|
311
|
+
### 8.3 判定の優先順位
|
|
312
|
+
|
|
313
|
+
複数の分類に該当する可能性がある場合:
|
|
314
|
+
|
|
315
|
+
1. **D(環境問題)**: エラーメッセージが明確に環境起因の場合は最優先
|
|
316
|
+
2. **B(要件齟齬)**: requirements.md の記載が不正確・不完全な場合
|
|
317
|
+
3. **C(設計不備)**: design.md のアーキテクチャに問題がある場合
|
|
318
|
+
4. **A(実装ミス)**: デフォルト(不明な場合は実装ミスとして扱う)
|
|
319
|
+
|
|
320
|
+
### 8.4 実践例
|
|
321
|
+
|
|
322
|
+
#### 例1: トークン検証エラー
|
|
323
|
+
```
|
|
324
|
+
症状: TypeError: Cannot read property 'token' of undefined
|
|
325
|
+
分析: 質問1 YES(nullチェック漏れ)
|
|
326
|
+
判定: A: 実装ミス → task-executer
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
#### 例2: バリデーションエラーメッセージ不一致
|
|
330
|
+
```
|
|
331
|
+
症状: requirements.md「400エラーを返す」、実装「422エラーを返す」
|
|
332
|
+
分析: 質問1 NO、質問2 YES(ステータスコードが不明確)
|
|
333
|
+
判定: B: 要件齟齬 → requirements.md修正 → task-executer
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
#### 例3: トランザクション未実装
|
|
337
|
+
```
|
|
338
|
+
症状: 競合状態で整合性が保証されない
|
|
339
|
+
分析: 質問1 NO、質問2 NO、質問3 YES(トランザクション設計欠如)
|
|
340
|
+
判定: C: 設計不備 → design.md修正 → task-executer
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
#### 例4: PostgreSQL接続エラー
|
|
344
|
+
```
|
|
345
|
+
症状: Error: connect ECONNREFUSED 127.0.0.1:5432
|
|
346
|
+
分析: 質問1-3 NO、質問4 YES(PostgreSQLコンテナ未起動)
|
|
347
|
+
判定: D: 環境問題 → qa再実行
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## 9. 動作確認ツールの使用ガイド
|
|
353
|
+
|
|
354
|
+
### 9.1 ブラウザテスト(Playwright MCP)
|
|
355
|
+
|
|
356
|
+
**用途**: ブラウザ操作による画面フロー・UI動作の確認
|
|
357
|
+
|
|
358
|
+
**基本フロー**:
|
|
359
|
+
```
|
|
360
|
+
1. browser_navigate でURLに移動
|
|
361
|
+
2. browser_snapshot でページ状態を取得
|
|
362
|
+
3. browser_click / browser_type で操作
|
|
363
|
+
4. browser_snapshot で結果確認
|
|
364
|
+
5. 必要に応じてスクリーンショット保存
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
**使用例(ログインフォーム)**:
|
|
368
|
+
```
|
|
369
|
+
手順1: ログイン画面に移動 (http://localhost:3000/auth/login)
|
|
370
|
+
手順2: スナップショット取得 → メールアドレス入力欄が表示されることを確認
|
|
371
|
+
手順3: メールアドレス入力: test@example.com
|
|
372
|
+
手順4: パスワード入力: password123
|
|
373
|
+
手順5: 送信ボタンをクリック
|
|
374
|
+
手順6: スナップショット取得 → ダッシュボード画面に遷移していることを確認
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### 9.2 API打鍵テスト(curl)
|
|
378
|
+
|
|
379
|
+
**用途**: HTTPリクエスト/レスポンスによるAPI動作の確認
|
|
380
|
+
|
|
381
|
+
**基本フロー**:
|
|
382
|
+
```bash
|
|
383
|
+
# GETリクエスト
|
|
384
|
+
curl -i http://localhost:3000/api/users
|
|
385
|
+
|
|
386
|
+
# POSTリクエスト(JSON)
|
|
387
|
+
curl -i -X POST http://localhost:3000/api/auth/login \
|
|
388
|
+
-H "Content-Type: application/json" \
|
|
389
|
+
-d '{"email":"test@example.com","password":"password123"}'
|
|
390
|
+
|
|
391
|
+
# 認証付きリクエスト
|
|
392
|
+
curl -i http://localhost:3000/api/protected \
|
|
393
|
+
-H "Authorization: Bearer {token}"
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
**確認項目**:
|
|
397
|
+
- HTTPステータスコード(200, 400, 401, 403, 404, 500等)
|
|
398
|
+
- レスポンスボディの内容
|
|
399
|
+
- レスポンスヘッダー(Content-Type, Set-Cookie等)
|
|
400
|
+
|
|
401
|
+
### 9.3 テストシナリオ記述形式
|
|
402
|
+
|
|
403
|
+
QAテスト仕様書では、以下の表形式で手順を記述します:
|
|
404
|
+
|
|
405
|
+
| No | 手順 | 確認項目 | 期待値 | 結果 | 備考 |
|
|
406
|
+
|----|------|---------|--------|------|------|
|
|
407
|
+
| 1 | ログイン画面に移動 (http://localhost:3000/auth/login) | URLが正しい | /auth/login | - | - |
|
|
408
|
+
| 2 | スナップショット取得 | メールアドレス入力欄が表示される | input[data-testid="email-input"]が存在 | - | - |
|
|
409
|
+
| 3 | メールアドレス入力: test@example.com | - | - | - | - |
|
|
410
|
+
| 4 | 送信ボタンをクリック | ローディング表示される | スピナーアイコンが表示 | - | - |
|
|
411
|
+
|
|
412
|
+
**重要な原則**:
|
|
413
|
+
- 手順は自然言語で簡潔に記述
|
|
414
|
+
- mcp__playwright などのコマンドは記載しない
|
|
415
|
+
- 「-」は手順のみで確認項目がない場合に使用
|