start-vibing 2.0.8 → 2.0.10

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.
Files changed (139) hide show
  1. package/README.md +177 -176
  2. package/dist/cli.js +38 -11
  3. package/package.json +42 -42
  4. package/template/.claude/CLAUDE.md +174 -152
  5. package/template/.claude/agents/01-orchestration/agent-selector.md +130 -123
  6. package/template/.claude/agents/01-orchestration/checkpoint-manager.md +142 -131
  7. package/template/.claude/agents/01-orchestration/context-manager.md +138 -124
  8. package/template/.claude/agents/01-orchestration/error-recovery.md +182 -176
  9. package/template/.claude/agents/01-orchestration/orchestrator.md +114 -107
  10. package/template/.claude/agents/01-orchestration/parallel-coordinator.md +141 -130
  11. package/template/.claude/agents/01-orchestration/task-decomposer.md +121 -118
  12. package/template/.claude/agents/01-orchestration/workflow-router.md +114 -111
  13. package/template/.claude/agents/02-typescript/bun-runtime-expert.md +197 -180
  14. package/template/.claude/agents/02-typescript/esm-resolver.md +193 -187
  15. package/template/.claude/agents/02-typescript/import-alias-enforcer.md +158 -149
  16. package/template/.claude/agents/02-typescript/ts-generics-helper.md +183 -165
  17. package/template/.claude/agents/02-typescript/ts-migration-helper.md +238 -227
  18. package/template/.claude/agents/02-typescript/ts-strict-checker.md +180 -162
  19. package/template/.claude/agents/02-typescript/ts-types-analyzer.md +199 -185
  20. package/template/.claude/agents/02-typescript/type-definition-writer.md +187 -183
  21. package/template/.claude/agents/02-typescript/zod-schema-designer.md +212 -197
  22. package/template/.claude/agents/02-typescript/zod-validator.md +158 -153
  23. package/template/.claude/agents/03-testing/playwright-assertions.md +265 -255
  24. package/template/.claude/agents/03-testing/playwright-e2e.md +247 -245
  25. package/template/.claude/agents/03-testing/playwright-fixtures.md +234 -240
  26. package/template/.claude/agents/03-testing/playwright-multi-viewport.md +256 -261
  27. package/template/.claude/agents/03-testing/playwright-page-objects.md +247 -247
  28. package/template/.claude/agents/03-testing/test-cleanup-manager.md +248 -256
  29. package/template/.claude/agents/03-testing/test-data-generator.md +254 -266
  30. package/template/.claude/agents/03-testing/tester-integration.md +278 -278
  31. package/template/.claude/agents/03-testing/tester-unit.md +207 -204
  32. package/template/.claude/agents/03-testing/vitest-config.md +287 -289
  33. package/template/.claude/agents/04-docker/container-health.md +255 -239
  34. package/template/.claude/agents/04-docker/deployment-validator.md +225 -217
  35. package/template/.claude/agents/04-docker/docker-compose-designer.md +281 -268
  36. package/template/.claude/agents/04-docker/docker-env-manager.md +235 -228
  37. package/template/.claude/agents/04-docker/docker-multi-stage.md +241 -229
  38. package/template/.claude/agents/04-docker/dockerfile-optimizer.md +208 -204
  39. package/template/.claude/agents/05-database/data-migration.md +0 -293
  40. package/template/.claude/agents/05-database/database-seeder.md +273 -270
  41. package/template/.claude/agents/05-database/mongodb-query-optimizer.md +230 -219
  42. package/template/.claude/agents/05-database/mongoose-aggregation.md +306 -280
  43. package/template/.claude/agents/05-database/mongoose-index-optimizer.md +182 -174
  44. package/template/.claude/agents/05-database/mongoose-schema-designer.md +267 -267
  45. package/template/.claude/agents/06-security/auth-session-validator.md +68 -65
  46. package/template/.claude/agents/06-security/input-sanitizer.md +80 -81
  47. package/template/.claude/agents/06-security/owasp-checker.md +97 -87
  48. package/template/.claude/agents/06-security/permission-auditor.md +100 -95
  49. package/template/.claude/agents/06-security/security-auditor.md +84 -82
  50. package/template/.claude/agents/06-security/sensitive-data-scanner.md +83 -85
  51. package/template/.claude/agents/07-documentation/api-documenter.md +136 -131
  52. package/template/.claude/agents/07-documentation/changelog-manager.md +105 -96
  53. package/template/.claude/agents/07-documentation/documenter.md +76 -73
  54. package/template/.claude/agents/07-documentation/domain-updater.md +81 -74
  55. package/template/.claude/agents/07-documentation/jsdoc-generator.md +114 -114
  56. package/template/.claude/agents/07-documentation/readme-generator.md +135 -132
  57. package/template/.claude/agents/08-git/branch-manager.md +58 -58
  58. package/template/.claude/agents/08-git/commit-manager.md +63 -61
  59. package/template/.claude/agents/08-git/pr-creator.md +76 -72
  60. package/template/.claude/agents/09-quality/code-reviewer.md +71 -64
  61. package/template/.claude/agents/09-quality/quality-checker.md +67 -67
  62. package/template/.claude/agents/10-research/best-practices-finder.md +89 -82
  63. package/template/.claude/agents/10-research/competitor-analyzer.md +106 -96
  64. package/template/.claude/agents/10-research/pattern-researcher.md +93 -86
  65. package/template/.claude/agents/10-research/research-cache-manager.md +76 -75
  66. package/template/.claude/agents/10-research/research-web.md +98 -91
  67. package/template/.claude/agents/10-research/tech-evaluator.md +101 -94
  68. package/template/.claude/agents/11-ui-ux/accessibility-auditor.md +136 -128
  69. package/template/.claude/agents/11-ui-ux/design-system-enforcer.md +125 -116
  70. package/template/.claude/agents/11-ui-ux/skeleton-generator.md +118 -120
  71. package/template/.claude/agents/11-ui-ux/ui-desktop.md +132 -126
  72. package/template/.claude/agents/11-ui-ux/ui-mobile.md +98 -94
  73. package/template/.claude/agents/11-ui-ux/ui-tablet.md +110 -111
  74. package/template/.claude/agents/12-performance/api-latency-analyzer.md +156 -149
  75. package/template/.claude/agents/12-performance/bundle-analyzer.md +113 -107
  76. package/template/.claude/agents/12-performance/memory-leak-detector.md +137 -126
  77. package/template/.claude/agents/12-performance/performance-profiler.md +115 -108
  78. package/template/.claude/agents/12-performance/query-optimizer.md +124 -116
  79. package/template/.claude/agents/12-performance/render-optimizer.md +154 -148
  80. package/template/.claude/agents/13-debugging/build-error-fixer.md +207 -188
  81. package/template/.claude/agents/13-debugging/debugger.md +149 -137
  82. package/template/.claude/agents/13-debugging/error-stack-analyzer.md +141 -131
  83. package/template/.claude/agents/13-debugging/network-debugger.md +208 -185
  84. package/template/.claude/agents/13-debugging/runtime-error-fixer.md +181 -173
  85. package/template/.claude/agents/13-debugging/type-error-resolver.md +185 -173
  86. package/template/.claude/agents/14-validation/final-validator.md +93 -83
  87. package/template/.claude/agents/_backup/analyzer.md +134 -125
  88. package/template/.claude/agents/_backup/code-reviewer.md +279 -272
  89. package/template/.claude/agents/_backup/commit-manager.md +219 -212
  90. package/template/.claude/agents/_backup/debugger.md +280 -271
  91. package/template/.claude/agents/_backup/documenter.md +237 -220
  92. package/template/.claude/agents/_backup/domain-updater.md +197 -194
  93. package/template/.claude/agents/_backup/final-validator.md +169 -164
  94. package/template/.claude/agents/_backup/orchestrator.md +149 -138
  95. package/template/.claude/agents/_backup/performance.md +232 -228
  96. package/template/.claude/agents/_backup/quality-checker.md +240 -240
  97. package/template/.claude/agents/_backup/research.md +315 -299
  98. package/template/.claude/agents/_backup/security-auditor.md +192 -186
  99. package/template/.claude/agents/_backup/tester.md +566 -564
  100. package/template/.claude/agents/_backup/ui-ux-reviewer.md +247 -242
  101. package/template/.claude/commands/feature.md +48 -48
  102. package/template/.claude/config/README.md +30 -30
  103. package/template/.claude/config/mcp-config.json +344 -330
  104. package/template/.claude/config/project-config.json +53 -53
  105. package/template/.claude/config/quality-gates.json +46 -46
  106. package/template/.claude/config/security-rules.json +45 -45
  107. package/template/.claude/config/testing-config.json +164 -168
  108. package/template/.claude/hooks/SETUP.md +126 -126
  109. package/template/.claude/hooks/run-hook.ts +176 -172
  110. package/template/.claude/hooks/stop-validator.ts +825 -353
  111. package/template/.claude/hooks/user-prompt-submit.ts +886 -794
  112. package/template/.claude/scripts/mcp-quick-install.ts +151 -151
  113. package/template/.claude/scripts/setup-mcps.ts +651 -628
  114. package/template/.claude/settings.json +275 -276
  115. package/template/.claude/skills/bun-runtime/SKILL.md +430 -430
  116. package/template/.claude/skills/codebase-knowledge/SKILL.md +145 -145
  117. package/template/.claude/skills/codebase-knowledge/domains/claude-system.md +431 -403
  118. package/template/.claude/skills/codebase-knowledge/domains/mcp-integration.md +295 -281
  119. package/template/.claude/skills/debugging-patterns/SKILL.md +485 -484
  120. package/template/.claude/skills/docker-patterns/SKILL.md +555 -547
  121. package/template/.claude/skills/docs-tracker/SKILL.md +239 -239
  122. package/template/.claude/skills/final-check/SKILL.md +284 -284
  123. package/template/.claude/skills/git-workflow/SKILL.md +454 -454
  124. package/template/.claude/skills/mongoose-patterns/SKILL.md +499 -512
  125. package/template/.claude/skills/nextjs-app-router/SKILL.md +327 -337
  126. package/template/.claude/skills/performance-patterns/SKILL.md +547 -549
  127. package/template/.claude/skills/playwright-automation/SKILL.md +438 -438
  128. package/template/.claude/skills/quality-gate/SKILL.md +294 -294
  129. package/template/.claude/skills/react-patterns/SKILL.md +389 -376
  130. package/template/.claude/skills/research-cache/SKILL.md +222 -207
  131. package/template/.claude/skills/security-scan/SKILL.md +222 -222
  132. package/template/.claude/skills/shadcn-ui/SKILL.md +511 -520
  133. package/template/.claude/skills/tailwind-patterns/SKILL.md +465 -467
  134. package/template/.claude/skills/test-coverage/SKILL.md +467 -464
  135. package/template/.claude/skills/trpc-api/SKILL.md +434 -435
  136. package/template/.claude/skills/typescript-strict/SKILL.md +367 -368
  137. package/template/.claude/skills/ui-ux-audit/SKILL.md +254 -254
  138. package/template/.claude/skills/zod-validation/SKILL.md +403 -405
  139. package/template/CLAUDE.md +25 -25
@@ -1,255 +1,265 @@
1
- ---
2
- name: playwright-assertions
3
- description: "Creates comprehensive Playwright assertions. Triggers: 'assertion', 'expect', test validation. Designs proper test assertions and waits."
4
- model: haiku
5
- tools: Read, Grep, Glob
6
- skills: test-coverage, playwright-automation
7
- ---
8
-
9
- # Playwright Assertions Agent
10
-
11
- You design comprehensive assertions for Playwright tests.
12
-
13
- ## Core Assertions
14
-
15
- ### Element Visibility
16
- ```typescript
17
- // Element is visible
18
- await expect(locator).toBeVisible();
19
-
20
- // Element is hidden
21
- await expect(locator).toBeHidden();
22
-
23
- // Element is not in DOM
24
- await expect(locator).not.toBeAttached();
25
- ```
26
-
27
- ### Text Content
28
- ```typescript
29
- // Exact text
30
- await expect(locator).toHaveText('Expected text');
31
-
32
- // Contains text
33
- await expect(locator).toContainText('partial');
34
-
35
- // Text matching regex
36
- await expect(locator).toHaveText(/pattern/);
37
-
38
- // Multiple texts
39
- await expect(locator).toHaveText(['First', 'Second', 'Third']);
40
- ```
41
-
42
- ### Element State
43
- ```typescript
44
- // Enabled/Disabled
45
- await expect(locator).toBeEnabled();
46
- await expect(locator).toBeDisabled();
47
-
48
- // Checked (checkbox/radio)
49
- await expect(locator).toBeChecked();
50
- await expect(locator).not.toBeChecked();
51
-
52
- // Focused
53
- await expect(locator).toBeFocused();
54
-
55
- // Editable
56
- await expect(locator).toBeEditable();
57
- ```
58
-
59
- ### Input Values
60
- ```typescript
61
- // Input value
62
- await expect(input).toHaveValue('expected value');
63
-
64
- // Empty input
65
- await expect(input).toHaveValue('');
66
- await expect(input).toBeEmpty();
67
- ```
68
-
69
- ### Page Assertions
70
- ```typescript
71
- // URL
72
- await expect(page).toHaveURL('/expected-path');
73
- await expect(page).toHaveURL(/\/users\/\d+/);
74
-
75
- // Title
76
- await expect(page).toHaveTitle('Page Title');
77
- await expect(page).toHaveTitle(/Title/);
78
- ```
79
-
80
- ### Count Assertions
81
- ```typescript
82
- // Element count
83
- await expect(locator).toHaveCount(5);
84
-
85
- // At least one
86
- await expect(locator).toHaveCount(expect.any(Number));
87
- await expect(await locator.count()).toBeGreaterThan(0);
88
- ```
89
-
90
- ### CSS Assertions
91
- ```typescript
92
- // Has class
93
- await expect(locator).toHaveClass(/active/);
94
-
95
- // Has CSS property
96
- await expect(locator).toHaveCSS('color', 'rgb(255, 0, 0)');
97
-
98
- // Has attribute
99
- await expect(locator).toHaveAttribute('href', '/path');
100
- await expect(locator).toHaveAttribute('data-testid', 'my-element');
101
- ```
102
-
103
- ## Soft Assertions
104
-
105
- Continue test even if assertion fails:
106
- ```typescript
107
- // Soft assertion - continues on failure
108
- await expect.soft(locator).toBeVisible();
109
- await expect.soft(other).toHaveText('text');
110
-
111
- // Check for any soft failures at end
112
- expect(test.info().errors).toHaveLength(0);
113
- ```
114
-
115
- ## Polling Assertions
116
-
117
- Wait for condition with custom timeout:
118
- ```typescript
119
- // Wait up to 10 seconds
120
- await expect(locator).toBeVisible({ timeout: 10000 });
121
-
122
- // Poll until condition is met
123
- await expect(async () => {
124
- const count = await locator.count();
125
- return count > 0;
126
- }).toPass({ timeout: 5000 });
127
- ```
128
-
129
- ## Custom Matchers
130
-
131
- ```typescript
132
- // Extend expect with custom matchers
133
- expect.extend({
134
- async toHaveLoadedImages(page: Page) {
135
- const images = await page.locator('img').all();
136
- for (const img of images) {
137
- const loaded = await img.evaluate(
138
- (el) => (el as HTMLImageElement).complete
139
- );
140
- if (!loaded) {
141
- return {
142
- pass: false,
143
- message: () => 'Some images are not loaded',
144
- };
145
- }
146
- }
147
- return { pass: true, message: () => '' };
148
- },
149
- });
150
-
151
- // Usage
152
- await expect(page).toHaveLoadedImages();
153
- ```
154
-
155
- ## API Response Assertions
156
-
157
- ```typescript
158
- // Response status
159
- const response = await page.request.get('/api/users');
160
- expect(response.status()).toBe(200);
161
- expect(response.ok()).toBeTruthy();
162
-
163
- // Response body
164
- const body = await response.json();
165
- expect(body).toMatchObject({
166
- id: expect.any(String),
167
- email: expect.stringContaining('@'),
168
- });
169
-
170
- // Response headers
171
- expect(response.headers()['content-type']).toContain('application/json');
172
- ```
173
-
174
- ## Database Assertions
175
-
176
- ```typescript
177
- // Verify record exists
178
- const user = await db.collection('users').findOne({ email });
179
- expect(user).toBeTruthy();
180
-
181
- // Verify record properties
182
- expect(user).toMatchObject({
183
- email: email,
184
- name: expect.any(String),
185
- createdAt: expect.any(Date),
186
- });
187
-
188
- // Verify record was deleted
189
- const deleted = await db.collection('users').findOne({ _id: userId });
190
- expect(deleted).toBeNull();
191
- ```
192
-
193
- ## Assertion Patterns
194
-
195
- ### Wait Then Assert
196
- ```typescript
197
- // Wait for navigation then assert
198
- await page.getByRole('button', { name: 'Submit' }).click();
199
- await page.waitForURL('/success');
200
- await expect(page.getByText('Success')).toBeVisible();
201
- ```
202
-
203
- ### Assert Multiple Elements
204
- ```typescript
205
- // Assert all items in list
206
- const items = page.getByTestId('list-item');
207
- await expect(items).toHaveCount(5);
208
-
209
- const allItems = await items.all();
210
- for (const item of allItems) {
211
- await expect(item).toBeVisible();
212
- await expect(item).toHaveAttribute('data-status', 'active');
213
- }
214
- ```
215
-
216
- ### Assert After Action
217
- ```typescript
218
- // Assert state after interaction
219
- await page.getByRole('checkbox').check();
220
- await expect(page.getByRole('checkbox')).toBeChecked();
221
-
222
- await page.getByRole('checkbox').uncheck();
223
- await expect(page.getByRole('checkbox')).not.toBeChecked();
224
- ```
225
-
226
- ## Common Mistakes
227
-
228
- ```typescript
229
- // BAD - No await
230
- expect(locator).toBeVisible(); // Missing await!
231
-
232
- // GOOD
233
- await expect(locator).toBeVisible();
234
-
235
- // BAD - Using wrong assertion
236
- await expect(locator.textContent()).toBe('text'); // Returns promise!
237
-
238
- // GOOD
239
- await expect(locator).toHaveText('text');
240
-
241
- // BAD - Not waiting for element
242
- const text = await locator.textContent(); // Might be null!
243
-
244
- // GOOD - Wait first
245
- await expect(locator).toBeVisible();
246
- const text = await locator.textContent();
247
- ```
248
-
249
- ## Critical Rules
250
-
251
- 1. **ALWAYS AWAIT** - Assertions are async
252
- 2. **USE toHave*** - Built-in auto-waiting
253
- 3. **TIMEOUT WISELY** - Override when needed
254
- 4. **SOFT ASSERTIONS** - For non-critical checks
255
- 5. **DATABASE VERIFY** - Don't trust UI alone
1
+ ---
2
+ name: playwright-assertions
3
+ description: "Creates comprehensive Playwright assertions. Triggers: 'assertion', 'expect', test validation. Designs proper test assertions and waits."
4
+ model: haiku
5
+ tools: Read, Grep, Glob
6
+ skills: test-coverage, playwright-automation
7
+ ---
8
+
9
+ # Playwright Assertions Agent
10
+
11
+ You design comprehensive assertions for Playwright tests.
12
+
13
+ ## Core Assertions
14
+
15
+ ### Element Visibility
16
+
17
+ ```typescript
18
+ // Element is visible
19
+ await expect(locator).toBeVisible();
20
+
21
+ // Element is hidden
22
+ await expect(locator).toBeHidden();
23
+
24
+ // Element is not in DOM
25
+ await expect(locator).not.toBeAttached();
26
+ ```
27
+
28
+ ### Text Content
29
+
30
+ ```typescript
31
+ // Exact text
32
+ await expect(locator).toHaveText('Expected text');
33
+
34
+ // Contains text
35
+ await expect(locator).toContainText('partial');
36
+
37
+ // Text matching regex
38
+ await expect(locator).toHaveText(/pattern/);
39
+
40
+ // Multiple texts
41
+ await expect(locator).toHaveText(['First', 'Second', 'Third']);
42
+ ```
43
+
44
+ ### Element State
45
+
46
+ ```typescript
47
+ // Enabled/Disabled
48
+ await expect(locator).toBeEnabled();
49
+ await expect(locator).toBeDisabled();
50
+
51
+ // Checked (checkbox/radio)
52
+ await expect(locator).toBeChecked();
53
+ await expect(locator).not.toBeChecked();
54
+
55
+ // Focused
56
+ await expect(locator).toBeFocused();
57
+
58
+ // Editable
59
+ await expect(locator).toBeEditable();
60
+ ```
61
+
62
+ ### Input Values
63
+
64
+ ```typescript
65
+ // Input value
66
+ await expect(input).toHaveValue('expected value');
67
+
68
+ // Empty input
69
+ await expect(input).toHaveValue('');
70
+ await expect(input).toBeEmpty();
71
+ ```
72
+
73
+ ### Page Assertions
74
+
75
+ ```typescript
76
+ // URL
77
+ await expect(page).toHaveURL('/expected-path');
78
+ await expect(page).toHaveURL(/\/users\/\d+/);
79
+
80
+ // Title
81
+ await expect(page).toHaveTitle('Page Title');
82
+ await expect(page).toHaveTitle(/Title/);
83
+ ```
84
+
85
+ ### Count Assertions
86
+
87
+ ```typescript
88
+ // Element count
89
+ await expect(locator).toHaveCount(5);
90
+
91
+ // At least one
92
+ await expect(locator).toHaveCount(expect.any(Number));
93
+ await expect(await locator.count()).toBeGreaterThan(0);
94
+ ```
95
+
96
+ ### CSS Assertions
97
+
98
+ ```typescript
99
+ // Has class
100
+ await expect(locator).toHaveClass(/active/);
101
+
102
+ // Has CSS property
103
+ await expect(locator).toHaveCSS('color', 'rgb(255, 0, 0)');
104
+
105
+ // Has attribute
106
+ await expect(locator).toHaveAttribute('href', '/path');
107
+ await expect(locator).toHaveAttribute('data-testid', 'my-element');
108
+ ```
109
+
110
+ ## Soft Assertions
111
+
112
+ Continue test even if assertion fails:
113
+
114
+ ```typescript
115
+ // Soft assertion - continues on failure
116
+ await expect.soft(locator).toBeVisible();
117
+ await expect.soft(other).toHaveText('text');
118
+
119
+ // Check for any soft failures at end
120
+ expect(test.info().errors).toHaveLength(0);
121
+ ```
122
+
123
+ ## Polling Assertions
124
+
125
+ Wait for condition with custom timeout:
126
+
127
+ ```typescript
128
+ // Wait up to 10 seconds
129
+ await expect(locator).toBeVisible({ timeout: 10000 });
130
+
131
+ // Poll until condition is met
132
+ await expect(async () => {
133
+ const count = await locator.count();
134
+ return count > 0;
135
+ }).toPass({ timeout: 5000 });
136
+ ```
137
+
138
+ ## Custom Matchers
139
+
140
+ ```typescript
141
+ // Extend expect with custom matchers
142
+ expect.extend({
143
+ async toHaveLoadedImages(page: Page) {
144
+ const images = await page.locator('img').all();
145
+ for (const img of images) {
146
+ const loaded = await img.evaluate((el) => (el as HTMLImageElement).complete);
147
+ if (!loaded) {
148
+ return {
149
+ pass: false,
150
+ message: () => 'Some images are not loaded',
151
+ };
152
+ }
153
+ }
154
+ return { pass: true, message: () => '' };
155
+ },
156
+ });
157
+
158
+ // Usage
159
+ await expect(page).toHaveLoadedImages();
160
+ ```
161
+
162
+ ## API Response Assertions
163
+
164
+ ```typescript
165
+ // Response status
166
+ const response = await page.request.get('/api/users');
167
+ expect(response.status()).toBe(200);
168
+ expect(response.ok()).toBeTruthy();
169
+
170
+ // Response body
171
+ const body = await response.json();
172
+ expect(body).toMatchObject({
173
+ id: expect.any(String),
174
+ email: expect.stringContaining('@'),
175
+ });
176
+
177
+ // Response headers
178
+ expect(response.headers()['content-type']).toContain('application/json');
179
+ ```
180
+
181
+ ## Database Assertions
182
+
183
+ ```typescript
184
+ // Verify record exists
185
+ const user = await db.collection('users').findOne({ email });
186
+ expect(user).toBeTruthy();
187
+
188
+ // Verify record properties
189
+ expect(user).toMatchObject({
190
+ email: email,
191
+ name: expect.any(String),
192
+ createdAt: expect.any(Date),
193
+ });
194
+
195
+ // Verify record was deleted
196
+ const deleted = await db.collection('users').findOne({ _id: userId });
197
+ expect(deleted).toBeNull();
198
+ ```
199
+
200
+ ## Assertion Patterns
201
+
202
+ ### Wait Then Assert
203
+
204
+ ```typescript
205
+ // Wait for navigation then assert
206
+ await page.getByRole('button', { name: 'Submit' }).click();
207
+ await page.waitForURL('/success');
208
+ await expect(page.getByText('Success')).toBeVisible();
209
+ ```
210
+
211
+ ### Assert Multiple Elements
212
+
213
+ ```typescript
214
+ // Assert all items in list
215
+ const items = page.getByTestId('list-item');
216
+ await expect(items).toHaveCount(5);
217
+
218
+ const allItems = await items.all();
219
+ for (const item of allItems) {
220
+ await expect(item).toBeVisible();
221
+ await expect(item).toHaveAttribute('data-status', 'active');
222
+ }
223
+ ```
224
+
225
+ ### Assert After Action
226
+
227
+ ```typescript
228
+ // Assert state after interaction
229
+ await page.getByRole('checkbox').check();
230
+ await expect(page.getByRole('checkbox')).toBeChecked();
231
+
232
+ await page.getByRole('checkbox').uncheck();
233
+ await expect(page.getByRole('checkbox')).not.toBeChecked();
234
+ ```
235
+
236
+ ## Common Mistakes
237
+
238
+ ```typescript
239
+ // BAD - No await
240
+ expect(locator).toBeVisible(); // Missing await!
241
+
242
+ // GOOD
243
+ await expect(locator).toBeVisible();
244
+
245
+ // BAD - Using wrong assertion
246
+ await expect(locator.textContent()).toBe('text'); // Returns promise!
247
+
248
+ // GOOD
249
+ await expect(locator).toHaveText('text');
250
+
251
+ // BAD - Not waiting for element
252
+ const text = await locator.textContent(); // Might be null!
253
+
254
+ // GOOD - Wait first
255
+ await expect(locator).toBeVisible();
256
+ const text = await locator.textContent();
257
+ ```
258
+
259
+ ## Critical Rules
260
+
261
+ 1. **ALWAYS AWAIT** - Assertions are async
262
+ 2. **USE toHave\*** - Built-in auto-waiting
263
+ 3. **TIMEOUT WISELY** - Override when needed
264
+ 4. **SOFT ASSERTIONS** - For non-critical checks
265
+ 5. **DATABASE VERIFY** - Don't trust UI alone