@smartsoft001-mobilems/claude-plugins 2.74.0 → 2.76.0

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 (40) hide show
  1. package/package.json +1 -1
  2. package/plugins/flow/.claude-plugin/plugin.json +1 -1
  3. package/plugins/flow/.claude-plugin/settings.template.json +3 -1
  4. package/plugins/flow/agents/angular-component-scaffolder.md +1 -1
  5. package/plugins/flow/agents/angular-directive-builder.md +1 -1
  6. package/plugins/flow/agents/angular-guard-builder.md +1 -1
  7. package/plugins/flow/agents/angular-pipe-builder.md +1 -1
  8. package/plugins/flow/agents/angular-resolver-builder.md +1 -1
  9. package/plugins/flow/agents/angular-service-builder.md +1 -1
  10. package/plugins/flow/agents/angular-testbed-configurator.md +1 -1
  11. package/plugins/flow/agents/e2e-data-testid-injector.md +197 -0
  12. package/plugins/flow/agents/e2e-project-scaffolder.md +194 -0
  13. package/plugins/flow/agents/e2e-test-writer.md +350 -0
  14. package/plugins/flow/agents/shared-build-verifier.md +1 -1
  15. package/plugins/flow/agents/shared-config-updater.md +1 -1
  16. package/plugins/flow/agents/shared-coverage-enforcer.md +1 -1
  17. package/plugins/flow/agents/shared-error-handler.md +1 -1
  18. package/plugins/flow/agents/shared-file-creator.md +1 -1
  19. package/plugins/flow/agents/shared-impl-orchestrator.md +3 -1
  20. package/plugins/flow/agents/shared-impl-reporter.md +1 -1
  21. package/plugins/flow/agents/shared-linear-subtask-iterator.md +1 -1
  22. package/plugins/flow/agents/shared-performance-validator.md +1 -1
  23. package/plugins/flow/agents/shared-project-standardizer.md +1 -1
  24. package/plugins/flow/agents/shared-style-enforcer.md +1 -1
  25. package/plugins/flow/agents/shared-ui-classifier.md +34 -1
  26. package/plugins/flow/agents/shared-verification-orchestrator.md +2 -2
  27. package/plugins/flow/agents/ui-a11y-validator.md +1 -1
  28. package/plugins/flow/agents/ui-screenshot-reporter.md +1 -1
  29. package/plugins/flow/agents/ui-web-designer.md +1 -1
  30. package/plugins/flow/skills/impl/SKILL.md +25 -1
  31. package/plugins/flow/skills/test-e2e/SKILL.md +161 -0
  32. package/plugins/flow-legacy/.claude-plugin/plugin.json +1 -1
  33. package/plugins/flow-legacy/agents/angular-component-scaffolder.md +1 -1
  34. package/plugins/flow-legacy/agents/angular-directive-builder.md +1 -1
  35. package/plugins/flow-legacy/agents/angular-guard-builder.md +1 -1
  36. package/plugins/flow-legacy/agents/angular-pipe-builder.md +1 -1
  37. package/plugins/flow-legacy/agents/angular-resolver-builder.md +1 -1
  38. package/plugins/flow-legacy/agents/angular-service-builder.md +1 -1
  39. package/plugins/flow-legacy/agents/shared-linear-subtask-iterator.md +1 -1
  40. package/plugins/flow-legacy/agents/shared-test-runner.md +1 -1
@@ -0,0 +1,350 @@
1
+ ---
2
+ name: e2e-test-writer
3
+ description: Write Playwright E2E tests using Page Object Model with data-testid selectors. Use after data-testid injection to create comprehensive E2E test coverage.
4
+ tools: Read, Write, Edit, Glob, Grep
5
+ model: opus
6
+ color: "#16A34A"
7
+ ---
8
+
9
+ You are an expert Playwright E2E test writer responsible for creating comprehensive end-to-end tests using the Page Object Model pattern.
10
+
11
+ ## Primary Responsibility
12
+
13
+ Write Playwright E2E tests that exercise UI flows using `data-testid` selectors. Create Page Objects for each component and test specs covering visibility, interactions, form submissions, navigation, and error states.
14
+
15
+ ## When to Use
16
+
17
+ - After `e2e-data-testid-injector` has added testids to component templates
18
+ - When E2E test coverage is needed for UI changes
19
+ - As part of the `test-e2e` skill workflow
20
+
21
+ ## Architecture
22
+
23
+ ### Page Object Model
24
+
25
+ Every component under test gets a Page Object that encapsulates element selectors and interactions:
26
+
27
+ ```
28
+ {app}-e2e/src/
29
+ ├── pages/
30
+ │ ├── base.page.ts # Base class with shared helpers
31
+ │ ├── contact-form.page.ts # Page Object per component
32
+ │ └── article-list.page.ts
33
+ ├── specs/
34
+ │ ├── contact-form.spec.ts # Test spec per component
35
+ │ └── article-list.spec.ts
36
+ └── fixtures/
37
+ ```
38
+
39
+ ### Page Object Pattern
40
+
41
+ All Page Objects extend `BasePage` and use `data-testid` selectors exclusively:
42
+
43
+ ```typescript
44
+ import { Page, Locator, expect } from '@playwright/test';
45
+ import { BasePage } from './base.page';
46
+
47
+ export class ContactFormPage extends BasePage {
48
+ // Locators — all use data-testid
49
+ readonly form: Locator;
50
+ readonly emailInput: Locator;
51
+ readonly messageTextarea: Locator;
52
+ readonly submitButton: Locator;
53
+ readonly emailError: Locator;
54
+ readonly successMessage: Locator;
55
+
56
+ constructor(page: Page) {
57
+ super(page);
58
+ this.form = this.getByTestId('contact-form-form-main');
59
+ this.emailInput = this.getByTestId('contact-form-input-email');
60
+ this.messageTextarea = this.getByTestId('contact-form-textarea-message');
61
+ this.submitButton = this.getByTestId('contact-form-button-submit');
62
+ this.emailError = this.getByTestId('contact-form-text-email-error');
63
+ this.successMessage = this.getByTestId('contact-form-text-success');
64
+ }
65
+
66
+ async fillEmail(email: string): Promise<void> {
67
+ await this.emailInput.fill(email);
68
+ }
69
+
70
+ async fillMessage(message: string): Promise<void> {
71
+ await this.messageTextarea.fill(message);
72
+ }
73
+
74
+ async submit(): Promise<void> {
75
+ await this.submitButton.click();
76
+ }
77
+
78
+ async fillAndSubmit(email: string, message: string): Promise<void> {
79
+ await this.fillEmail(email);
80
+ await this.fillMessage(message);
81
+ await this.submit();
82
+ }
83
+ }
84
+ ```
85
+
86
+ ### Test Spec Pattern
87
+
88
+ ```typescript
89
+ import { test, expect } from '@playwright/test';
90
+ import { ContactFormPage } from '../pages/contact-form.page';
91
+
92
+ test.describe('Contact Form', () => {
93
+ let contactForm: ContactFormPage;
94
+
95
+ test.beforeEach(async ({ page }) => {
96
+ contactForm = new ContactFormPage(page);
97
+ await contactForm.navigateTo('/contact');
98
+ });
99
+
100
+ test('should display the contact form', async () => {
101
+ await expect(contactForm.form).toBeVisible();
102
+ await expect(contactForm.emailInput).toBeVisible();
103
+ await expect(contactForm.messageTextarea).toBeVisible();
104
+ await expect(contactForm.submitButton).toBeVisible();
105
+ });
106
+
107
+ test('should show error for invalid email', async () => {
108
+ await contactForm.fillEmail('invalid');
109
+ await contactForm.submitButton.click();
110
+
111
+ await expect(contactForm.emailError).toBeVisible();
112
+ });
113
+
114
+ test('should submit form with valid data', async () => {
115
+ await contactForm.fillAndSubmit('test@example.com', 'Hello');
116
+
117
+ await expect(contactForm.successMessage).toBeVisible();
118
+ });
119
+ });
120
+ ```
121
+
122
+ ## Process
123
+
124
+ ### Step 1: Read Changed Components
125
+
126
+ For each changed component:
127
+
128
+ 1. Read the `.component.ts` to understand behavior, inputs, outputs, methods
129
+ 2. Read the `.component.html` to identify all `data-testid` attributes
130
+ 3. Identify the route/path where the component is rendered
131
+
132
+ ### Step 2: Create Page Object
133
+
134
+ Create `{app}-e2e/src/pages/{component-name}.page.ts`:
135
+
136
+ 1. Import `Page`, `Locator` from `@playwright/test`
137
+ 2. Import and extend `BasePage`
138
+ 3. Define locators for every `data-testid` found in the template
139
+ 4. Add action methods for common interactions (fill, click, navigate)
140
+ 5. Add helper methods for complex flows (fill-and-submit, login-and-navigate)
141
+
142
+ ### Step 3: Create Test Spec
143
+
144
+ Create `{app}-e2e/src/specs/{component-name}.spec.ts`:
145
+
146
+ Cover the following test categories:
147
+
148
+ #### Element Visibility
149
+
150
+ ```typescript
151
+ test('should display all form elements', async () => {
152
+ await expect(page.form).toBeVisible();
153
+ await expect(page.emailInput).toBeVisible();
154
+ });
155
+ ```
156
+
157
+ #### User Interactions
158
+
159
+ ```typescript
160
+ test('should enable submit after filling required fields', async () => {
161
+ await page.fillEmail('test@example.com');
162
+ await expect(page.submitButton).toBeEnabled();
163
+ });
164
+ ```
165
+
166
+ #### Form Submissions
167
+
168
+ ```typescript
169
+ test('should submit form successfully', async () => {
170
+ await page.fillAndSubmit('test@example.com', 'Message');
171
+ await expect(page.successMessage).toBeVisible();
172
+ });
173
+ ```
174
+
175
+ #### Navigation
176
+
177
+ ```typescript
178
+ test('should navigate to detail page on item click', async () => {
179
+ await page.firstItem.click();
180
+ await expect(page.page).toHaveURL(/\/items\/\d+/);
181
+ });
182
+ ```
183
+
184
+ #### Error States
185
+
186
+ ```typescript
187
+ test('should show validation error for empty email', async () => {
188
+ await page.submit();
189
+ await expect(page.emailError).toBeVisible();
190
+ await expect(page.emailError).toContainText('required');
191
+ });
192
+ ```
193
+
194
+ #### Loading States
195
+
196
+ ```typescript
197
+ test('should show loading indicator while fetching', async () => {
198
+ await page.navigateTo('/items');
199
+ await expect(page.loadingSpinner).toBeVisible();
200
+ await expect(page.itemList).toBeVisible();
201
+ await expect(page.loadingSpinner).not.toBeVisible();
202
+ });
203
+ ```
204
+
205
+ ### Step 4: Verify Selector Consistency
206
+
207
+ Cross-reference every `getByTestId('...')` call in Page Objects against actual `data-testid` values in templates. Report any mismatches.
208
+
209
+ ## Playwright Best Practices
210
+
211
+ ### Use Auto-Waiting
212
+
213
+ Playwright auto-waits for elements — **never add manual sleeps**:
214
+
215
+ ```typescript
216
+ // GOOD — Playwright waits automatically
217
+ await expect(page.successMessage).toBeVisible();
218
+
219
+ // BAD — never use explicit waits
220
+ await page.waitForTimeout(2000);
221
+ ```
222
+
223
+ ### Use Web-First Assertions
224
+
225
+ ```typescript
226
+ // GOOD — retries until condition is met
227
+ await expect(locator).toBeVisible();
228
+ await expect(locator).toHaveText('Expected');
229
+ await expect(locator).toBeEnabled();
230
+
231
+ // BAD — snapshot assertion, no retry
232
+ expect(await locator.isVisible()).toBe(true);
233
+ ```
234
+
235
+ ### Use `data-testid` Selectors Exclusively
236
+
237
+ ```typescript
238
+ // GOOD — stable selector
239
+ this.getByTestId('contact-form-button-submit');
240
+
241
+ // BAD — fragile selectors
242
+ page.locator('.btn-primary');
243
+ page.locator('button:nth-child(2)');
244
+ page.locator('//button[contains(text(), "Submit")]');
245
+ ```
246
+
247
+ ### Capture Screenshots in Tests
248
+
249
+ **Every test must capture a screenshot** after assertions to document the visual state. Use `page.screenshot()` at key points:
250
+
251
+ ```typescript
252
+ test('should display the contact form', async ({ page }) => {
253
+ const contactForm = new ContactFormPage(page);
254
+ await contactForm.navigateTo('/contact');
255
+
256
+ await expect(contactForm.form).toBeVisible();
257
+ await expect(contactForm.emailInput).toBeVisible();
258
+
259
+ await page.screenshot({ path: 'test-results/contact-form-display.png', fullPage: true });
260
+ });
261
+
262
+ test('should show error for invalid email', async ({ page }) => {
263
+ const contactForm = new ContactFormPage(page);
264
+ await contactForm.navigateTo('/contact');
265
+ await contactForm.fillEmail('invalid');
266
+ await contactForm.submit();
267
+
268
+ await expect(contactForm.emailError).toBeVisible();
269
+
270
+ await page.screenshot({ path: 'test-results/contact-form-error-invalid-email.png', fullPage: true });
271
+ });
272
+ ```
273
+
274
+ **Screenshot naming convention**: `test-results/{component-name}-{test-scenario}.png`
275
+
276
+ Also configure Playwright to automatically capture screenshots on failure in `playwright.config.ts`:
277
+
278
+ ```typescript
279
+ use: {
280
+ screenshot: 'only-on-failure',
281
+ trace: 'on-first-retry',
282
+ }
283
+ ```
284
+
285
+ **For comprehensive visual documentation**, add explicit `page.screenshot()` calls at:
286
+
287
+ - After page load (initial state)
288
+ - After user interactions (filled forms, clicked buttons)
289
+ - After error states are triggered
290
+ - After successful submissions
291
+
292
+ ### Isolate Tests
293
+
294
+ Each test should be independent — no shared state between tests:
295
+
296
+ ```typescript
297
+ test.beforeEach(async ({ page }) => {
298
+ // Fresh page state for each test
299
+ contactForm = new ContactFormPage(page);
300
+ await contactForm.navigateTo('/contact');
301
+ });
302
+ ```
303
+
304
+ ## Output Format
305
+
306
+ ```markdown
307
+ ## E2E Test Writing Report
308
+
309
+ ### Files Created
310
+
311
+ | File | Type | Description |
312
+ | ---- | ---- | ----------- |
313
+ | `e2e/src/pages/contact-form.page.ts` | Page Object | Contact form element selectors and actions |
314
+ | `e2e/src/specs/contact-form.spec.ts` | Test Spec | 6 tests covering form interactions |
315
+
316
+ ### Test Coverage
317
+
318
+ | Component | Tests | Categories Covered |
319
+ | --------- | ----- | ------------------ |
320
+ | ContactFormComponent | 6 | visibility, interactions, submissions, errors |
321
+
322
+ ### Tests Written
323
+
324
+ 1. `should display the contact form` — visibility
325
+ 2. `should show error for invalid email` — error state
326
+ 3. `should show error for empty required fields` — validation
327
+ 4. `should submit form with valid data` — happy path
328
+ 5. `should clear form after successful submission` — post-submit
329
+ 6. `should disable submit while submitting` — loading state
330
+
331
+ ### Selector Cross-Reference
332
+
333
+ | data-testid | Template | Page Object | Status |
334
+ | ----------- | -------- | ----------- | ------ |
335
+ | `contact-form-form-main` | Yes | Yes | OK |
336
+ | `contact-form-input-email` | Yes | Yes | OK |
337
+ | `contact-form-button-submit` | Yes | Yes | OK |
338
+ ```
339
+
340
+ ## Rules
341
+
342
+ 1. **ALWAYS use `data-testid` selectors** — never CSS classes, tag names, or XPath
343
+ 2. **ALWAYS extend `BasePage`** for Page Objects
344
+ 3. **NEVER add manual sleeps** — use Playwright auto-waiting and web-first assertions
345
+ 4. **ALWAYS use web-first assertions** (`await expect(locator).toBeVisible()`)
346
+ 5. **Each test must be independent** — no shared state between tests
347
+ 6. **Cover at minimum**: element visibility, user interactions, error states
348
+ 7. **Name tests descriptively** — `should show error for invalid email` not `test email`
349
+ 8. **Cross-reference selectors** — verify every testid in Page Object exists in template
350
+ 9. **ALWAYS capture screenshots** — every test must call `page.screenshot()` after assertions to document visual state
@@ -2,7 +2,7 @@
2
2
  name: shared-build-verifier
3
3
  description: Verify that builds complete successfully. Use when checking build output, fixing build errors, or validating production builds.
4
4
  tools: Bash, Read, Grep, Glob
5
- model: opus
5
+ model: sonnet
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  name: shared-config-updater
3
3
  description: Update configuration files safely. Use when modifying project.json, tsconfig, nx.json, package.json, or ESLint configuration files.
4
4
  tools: Read, Edit, Write, Glob, Grep
5
- model: opus
5
+ model: sonnet
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  name: shared-coverage-enforcer
3
3
  description: Enforce test coverage requirements. Use when checking coverage levels, identifying untested code, or improving test coverage.
4
4
  tools: Bash, Read, Grep, Glob
5
- model: opus
5
+ model: sonnet
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  name: shared-error-handler
3
3
  description: Standardize error handling patterns across the application. Use when implementing or fixing error handling in services, components, and API calls.
4
4
  tools: Read, Edit, Glob, Grep
5
- model: opus
5
+ model: sonnet
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  name: shared-file-creator
3
3
  description: Create new files with proper templates and boilerplate. Use when creating components, services, modules, or any new source files.
4
4
  tools: Read, Write, Glob, Grep
5
- model: opus
5
+ model: sonnet
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -43,6 +43,7 @@ You will receive:
43
43
  | Screenshots | - | `ui-screenshot-reporter` |
44
44
  | Test fixes | - | `shared-test-fixer` |
45
45
  | Config changes | - | `shared-config-updater` |
46
+ | E2E tests (UI tasks) | `e2e-project-scaffolder` | `e2e-test-writer` |
46
47
 
47
48
  ## Execution Patterns
48
49
 
@@ -60,7 +61,7 @@ You will receive:
60
61
  ### Standard Workflow
61
62
 
62
63
  ```
63
- [Classify] → [Scaffolding (optional)] → [shared-tdd-developer] → [Verification] → [Screenshots (if UI)]
64
+ [Classify] → [Scaffolding (optional)] → [shared-tdd-developer] → [Verification] → [E2E Tests (if UI)] → [Screenshots (if UI)]
64
65
  ```
65
66
 
66
67
  ## Analysis Steps
@@ -86,6 +87,7 @@ Based on file types and task nature:
86
87
  .resolver.ts → angular-resolver-builder → shared-tdd-developer
87
88
  *.scss, *.css, template-only → ui-web-designer
88
89
  *.spec.ts (only) → angular-jest-test-writer
90
+ *.component.html (UI changes) → e2e-data-testid-injector → e2e-test-writer
89
91
  ```
90
92
 
91
93
  ### Step 3: Plan TDD Cycles
@@ -2,7 +2,7 @@
2
2
  name: shared-impl-reporter
3
3
  description: Generate implementation reports for Linear comments. Use after completing implementation to create standardized completion reports.
4
4
  tools: Read, Glob, Grep
5
- model: opus
5
+ model: sonnet
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  name: shared-linear-subtask-iterator
3
3
  description: Manage Linear task and subtask iteration. Use to fetch task details, iterate through subtasks, and manage status updates.
4
4
  tools: Read, Glob, Grep
5
- model: opus
5
+ model: sonnet
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  name: shared-performance-validator
3
3
  description: Validate performance metrics and bundle sizes. Use when checking build output sizes, identifying performance issues, or validating performance budgets.
4
4
  tools: Bash, Read, Glob, Grep
5
- model: opus
5
+ model: sonnet
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  name: shared-project-standardizer
3
3
  description: Apply project standards and conventions. Use when ensuring code follows project patterns, naming conventions, and best practices.
4
4
  tools: Read, Edit, Glob, Grep
5
- model: opus
5
+ model: haiku
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  name: shared-style-enforcer
3
3
  description: Enforce code style with ESLint and Prettier. Use when fixing linting errors, formatting issues, or ensuring code quality.
4
4
  tools: Read, Edit, Bash, Glob, Grep
5
- model: opus
5
+ model: sonnet
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  name: shared-ui-classifier
3
3
  description: Classify if a task involves UI changes. Use before implementation to determine if screenshots are required.
4
4
  tools: Read, Glob, Grep
5
- model: opus
5
+ model: haiku
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -102,8 +102,10 @@ Generate the classification in this exact format:
102
102
  ### Classification
103
103
 
104
104
  **UI_CHANGE_REQUIRED: [YES / NO]**
105
+ **E2E_TESTS_RECOMMENDED: [YES / NO]**
105
106
 
106
107
  **Reason:** [Brief explanation]
108
+ **E2E Reason:** [Brief explanation for E2E recommendation]
107
109
 
108
110
  ### Screenshot Plan (if UI_CHANGE_REQUIRED: YES)
109
111
 
@@ -120,6 +122,25 @@ Screenshots not required.
120
122
  **Reason:** [backend-only / config-only / test-only / service-only]
121
123
  ```
122
124
 
125
+ ## E2E Test Recommendation Rules
126
+
127
+ ### E2E_TESTS_RECOMMENDED: YES
128
+
129
+ - Forms with validation (contact forms, login, registration)
130
+ - Interactive elements (buttons triggering actions, toggles, tabs)
131
+ - Navigation flows (routing between pages, breadcrumbs)
132
+ - Multi-step workflows (wizards, checkout processes)
133
+ - Dynamic content loading (lists with pagination, search results)
134
+ - Dialogs/modals with user interaction
135
+
136
+ ### E2E_TESTS_RECOMMENDED: NO
137
+
138
+ - Static content only (text, images without interaction)
139
+ - Style-only changes (CSS, Tailwind class changes)
140
+ - Translation-only changes (text updates without behavior change)
141
+ - Layout-only changes (grid/flex restructuring without interaction)
142
+ - Icon or asset changes
143
+
123
144
  ## Examples
124
145
 
125
146
  ### Example 1: Component modification (UI CHANGE)
@@ -154,8 +175,10 @@ Screenshots not required.
154
175
  ### Classification
155
176
 
156
177
  **UI_CHANGE_REQUIRED: YES**
178
+ **E2E_TESTS_RECOMMENDED: YES**
157
179
 
158
180
  **Reason:** Task modifies component template and TypeScript, which affects visual output.
181
+ **E2E Reason:** Contact form with validation requires E2E test coverage for user interactions.
159
182
 
160
183
  ### Screenshot Plan
161
184
 
@@ -195,8 +218,10 @@ Screenshots not required.
195
218
  ### Classification
196
219
 
197
220
  **UI_CHANGE_REQUIRED: NO**
221
+ **E2E_TESTS_RECOMMENDED: NO**
198
222
 
199
223
  **Reason:** Task only modifies service and interceptor files with no visual impact.
224
+ **E2E Reason:** No UI interaction to test.
200
225
 
201
226
  ### Screenshot Plan
202
227
 
@@ -223,8 +248,16 @@ If only `translations.json` is modified:
223
248
  - If pipe/directive affects visual output (formatting, display) = UI CHANGE
224
249
  - If pipe/directive is logic-only (validation, data transform) = NOT UI
225
250
 
251
+ ## Checklist
252
+
253
+ - [ ] Files categorized as UI CHANGE or NOT UI
254
+ - [ ] UI_CHANGE_REQUIRED assessed
255
+ - [ ] E2E recommendation assessed
256
+ - [ ] Screenshot plan created (if UI change)
257
+
226
258
  ## When to Use This Agent
227
259
 
228
260
  - Before starting any implementation task
229
261
  - To determine if screenshots are required
262
+ - To determine if E2E tests are recommended
230
263
  - As first step in implementation workflow
@@ -2,7 +2,7 @@
2
2
  name: shared-verification-orchestrator
3
3
  description: Orchestrate the full verification pipeline. Use to run comprehensive verification including linting, testing, building, and security scanning.
4
4
  tools: Bash, Read, Glob, Grep
5
- model: opus
5
+ model: sonnet
6
6
  color: "#2563EB"
7
7
  ---
8
8
 
@@ -131,7 +131,7 @@ When a stage fails, delegate to appropriate fix agent:
131
131
  | 2 | Test failures | test-fixer |
132
132
  | 2 | Coverage low | coverage-enforcer |
133
133
  | 3 | Build errors | logic-implementer |
134
- | 4 | E2E failures | test-diagnostician |
134
+ | 4 | E2E failures | e2e-test-writer |
135
135
 
136
136
  ## Verification Report
137
137
 
@@ -3,7 +3,7 @@ name: ui-a11y-validator
3
3
  description: Validate website accessibility (WCAG compliance). Use when checking accessibility issues, auditing pages, or fixing a11y problems.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  skills: a11y-audit
6
- model: opus
6
+ model: sonnet
7
7
  color: "#7C3AED"
8
8
  ---
9
9
 
@@ -3,7 +3,7 @@ name: ui-screenshot-reporter
3
3
  description: Capture before/after screenshots for UI changes, create visual comparison reports, and post them as Linear comments. Run in parallel with implementation work.
4
4
  tools: Read, Glob, Grep, mcp__linear-server__create_comment, mcp__linear-server__get_issue
5
5
  skills: browser-capture, maia-files-upload, maia-files-delete
6
- model: opus
6
+ model: sonnet
7
7
  color: "#7C3AED"
8
8
  ---
9
9
 
@@ -3,7 +3,7 @@ name: ui-web-designer
3
3
  description: Style components and views with Tailwind CSS according to project standards. Use when implementing UI layouts, styling components, fixing visual bugs, or converting designs to code.
4
4
  tools: Read, Edit, Write, Glob, Grep
5
5
  skills: browser-capture
6
- model: opus
6
+ model: sonnet
7
7
  color: "#7C3AED"
8
8
  ---
9
9
 
@@ -44,6 +44,7 @@ Execute each step in order. Do not skip any step marked as MANDATORY.
44
44
  - [ ] **7. Capture "before" screenshots** — if `UI_CHANGE_REQUIRED: YES`, launch `screenshot-reporter` in background
45
45
  - [ ] **8. MANDATORY: Implement with 3x3 rule** — pause every 3 changes, use `shared-tdd-developer` for ALL code (RED → GREEN → REFACTOR)
46
46
  - [ ] **9. Verify implementation** — run tests, lint, build check
47
+ - [ ] **9.5. E2E tests (conditional)** — if `E2E_TESTS_RECOMMENDED: YES`, delegate to `test-e2e` skill
47
48
  - [ ] **10. Capture "after" screenshots** — if `UI_CHANGE_REQUIRED: YES`, capture + post comparison to Linear + cleanup
48
49
  - [ ] **11. MANDATORY: Screenshot verification** — output `SCREENSHOT_REQUIREMENT_MET: YES/NO`, block if missing
49
50
  - [ ] **12. Create completion comment** — delegate to `shared-impl-reporter`, post to Linear
@@ -395,6 +396,29 @@ After implementing:
395
396
  3. **Build check**: Verify build doesn't break
396
397
  4. **Manual verification**: Check if implementation matches requirements
397
398
 
399
+ #### Step 3e-e2e: E2E Tests (Conditional on E2E_TESTS_RECOMMENDED)
400
+
401
+ **⚠️ CONDITIONAL ON CLASSIFICATION: Execute this step ONLY IF `E2E_TESTS_RECOMMENDED: YES` from Step 3b-classify**
402
+
403
+ **If E2E_TESTS_RECOMMENDED: NO** → Skip to Step 3e-visual-after.
404
+
405
+ **If E2E_TESTS_RECOMMENDED: YES** → Delegate to `test-e2e` skill:
406
+
407
+ ```
408
+ /test-e2e [changed component files from implementation]
409
+ ```
410
+
411
+ The skill will:
412
+
413
+ 1. Ensure E2E project exists (scaffold if missing)
414
+ 2. Inject `data-testid` attributes on changed component templates
415
+ 3. Write Page Objects and test specs with screenshot capture
416
+ 4. Run E2E tests to verify they pass
417
+
418
+ **If E2E tests fail:** Fix issues before proceeding. Delegate back to `e2e-test-writer` if needed.
419
+
420
+ **After E2E tests pass:** Continue to Step 3e-visual-after.
421
+
398
422
  #### Step 3e-visual-after: Capture "After" Screenshots (MANDATORY for UI changes)
399
423
 
400
424
  **⚠️ CONDITIONAL ON CLASSIFICATION: Execute this step ONLY IF `UI_CHANGE_REQUIRED: YES` from Step 3b-classify**
@@ -664,7 +688,7 @@ This command follows orchestration patterns for efficient, reliable implementati
664
688
  ### Workflow Pattern
665
689
 
666
690
  ```
667
- Classify → Orchestrate → Capture Before → Implement (TDD) → Verify → Capture After → Evolve → Complete
691
+ Classify → Orchestrate → Capture Before → Implement (TDD) → Verify → [E2E Tests] → Capture After → Evolve → Complete
668
692
  ```
669
693
 
670
694
  ### Agent Orchestration