@smartsoft001-mobilems/claude-plugins 2.85.0 → 2.87.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 (176) hide show
  1. package/.claude-plugin/marketplace.json +2 -6
  2. package/package.json +2 -2
  3. package/plugins/mobilems/.claude-plugin/README.md +30 -0
  4. package/plugins/mobilems/.claude-plugin/plugin.json +5 -0
  5. package/plugins/mobilems/scripts/refresh-mobilems-api-spec.sh +372 -0
  6. package/plugins/mobilems/skills/mobilems-articles/SKILL.md +84 -0
  7. package/plugins/mobilems/skills/mobilems-articles/references/lib-contents.md +164 -0
  8. package/plugins/mobilems/skills/mobilems-articles/references/module-and-routes.md +146 -0
  9. package/plugins/mobilems/skills/mobilems-articles/references/shared-components.md +56 -0
  10. package/plugins/mobilems/skills/mobilems-articles/scripts/detect-init.sh +29 -0
  11. package/plugins/mobilems/skills/mobilems-articles/scripts/verify-module.sh +61 -0
  12. package/plugins/mobilems/skills/mobilems-docs-reader/SKILL.md +116 -0
  13. package/plugins/mobilems/skills/mobilems-events/SKILL.md +65 -0
  14. package/plugins/mobilems/skills/mobilems-events/references/lib-contents.md +212 -0
  15. package/plugins/mobilems/skills/mobilems-events/references/module-and-routes.md +113 -0
  16. package/plugins/mobilems/skills/mobilems-events/scripts/detect-init.sh +29 -0
  17. package/plugins/mobilems/skills/mobilems-events/scripts/verify-module.sh +59 -0
  18. package/plugins/mobilems/skills/mobilems-object-collections/SKILL.md +52 -0
  19. package/plugins/mobilems/skills/mobilems-object-collections/references/lib-contents.md +76 -0
  20. package/plugins/mobilems/skills/mobilems-object-collections/references/module-and-routes.md +116 -0
  21. package/plugins/mobilems/skills/mobilems-object-collections/references/shared-components.md +61 -0
  22. package/plugins/mobilems/skills/mobilems-object-collections/scripts/detect-init.sh +29 -0
  23. package/plugins/mobilems/skills/mobilems-object-collections/scripts/verify-module.sh +44 -0
  24. package/plugins/mobilems/skills/mobilems-objects/SKILL.md +52 -0
  25. package/plugins/mobilems/skills/mobilems-objects/references/lib-contents.md +68 -0
  26. package/plugins/mobilems/skills/mobilems-objects/references/module-and-routes.md +108 -0
  27. package/plugins/mobilems/skills/mobilems-objects/references/shared-components.md +69 -0
  28. package/plugins/mobilems/skills/mobilems-objects/scripts/detect-init.sh +29 -0
  29. package/plugins/mobilems/skills/mobilems-objects/scripts/verify-module.sh +51 -0
  30. package/plugins/mobilems/skills/mobilems-partners/SKILL.md +65 -0
  31. package/plugins/mobilems/skills/mobilems-partners/references/lib-contents.md +160 -0
  32. package/plugins/mobilems/skills/mobilems-partners/references/module-and-routes.md +125 -0
  33. package/plugins/mobilems/skills/mobilems-partners/scripts/detect-init.sh +29 -0
  34. package/plugins/mobilems/skills/mobilems-partners/scripts/verify-module.sh +59 -0
  35. package/plugins/mobilems/skills/mobilems-project-init/SKILL.md +134 -0
  36. package/plugins/mobilems/skills/mobilems-project-init/references/app-shell.md +107 -0
  37. package/plugins/mobilems/skills/mobilems-project-init/references/claude-config.md +44 -0
  38. package/plugins/mobilems/skills/mobilems-project-init/references/config-providers.md +203 -0
  39. package/plugins/mobilems/skills/mobilems-project-init/references/npm-deps.md +66 -0
  40. package/plugins/mobilems/skills/mobilems-project-init/references/server-env.md +89 -0
  41. package/plugins/mobilems/skills/mobilems-project-init/references/shared-lib.md +125 -0
  42. package/plugins/mobilems/skills/mobilems-project-init/references/tailwind-styles.md +106 -0
  43. package/plugins/mobilems/skills/mobilems-project-init/scripts/classify-shared-components.py +114 -0
  44. package/plugins/mobilems/skills/mobilems-project-init/scripts/detect-base.sh +49 -0
  45. package/plugins/mobilems/skills/mobilems-project-init/scripts/verify-init.sh +73 -0
  46. package/plugins/mobilems/skills/mobilems-thematic-publications/SKILL.md +60 -0
  47. package/plugins/mobilems/skills/mobilems-thematic-publications/references/lib-contents.md +134 -0
  48. package/plugins/mobilems/skills/mobilems-thematic-publications/references/module-and-routes.md +107 -0
  49. package/plugins/mobilems/skills/mobilems-thematic-publications/scripts/detect-init.sh +29 -0
  50. package/plugins/mobilems/skills/mobilems-thematic-publications/scripts/verify-module.sh +56 -0
  51. package/plugins/flow/.claude-plugin/README.md +0 -91
  52. package/plugins/flow/.claude-plugin/merge-permissions.js +0 -97
  53. package/plugins/flow/.claude-plugin/plugin.json +0 -5
  54. package/plugins/flow/.claude-plugin/settings.template.json +0 -86
  55. package/plugins/flow/agents/angular-component-scaffolder.md +0 -175
  56. package/plugins/flow/agents/angular-directive-builder.md +0 -153
  57. package/plugins/flow/agents/angular-guard-builder.md +0 -243
  58. package/plugins/flow/agents/angular-jest-test-writer.md +0 -474
  59. package/plugins/flow/agents/angular-pipe-builder.md +0 -169
  60. package/plugins/flow/agents/angular-resolver-builder.md +0 -286
  61. package/plugins/flow/agents/angular-service-builder.md +0 -161
  62. package/plugins/flow/agents/angular-signal-state-builder.md +0 -339
  63. package/plugins/flow/agents/angular-test-diagnostician.md +0 -279
  64. package/plugins/flow/agents/angular-testbed-configurator.md +0 -315
  65. package/plugins/flow/agents/arch-scaffolder.md +0 -278
  66. package/plugins/flow/agents/e2e-data-testid-injector.md +0 -197
  67. package/plugins/flow/agents/e2e-project-scaffolder.md +0 -194
  68. package/plugins/flow/agents/e2e-test-writer.md +0 -350
  69. package/plugins/flow/agents/shared-agent-evolver.md +0 -294
  70. package/plugins/flow/agents/shared-build-verifier.md +0 -160
  71. package/plugins/flow/agents/shared-config-updater.md +0 -310
  72. package/plugins/flow/agents/shared-coverage-enforcer.md +0 -184
  73. package/plugins/flow/agents/shared-error-handler.md +0 -217
  74. package/plugins/flow/agents/shared-file-creator.md +0 -344
  75. package/plugins/flow/agents/shared-impl-orchestrator.md +0 -312
  76. package/plugins/flow/agents/shared-impl-reporter.md +0 -368
  77. package/plugins/flow/agents/shared-impl-teammate.md +0 -201
  78. package/plugins/flow/agents/shared-linear-subtask-iterator.md +0 -337
  79. package/plugins/flow/agents/shared-logic-implementer.md +0 -243
  80. package/plugins/flow/agents/shared-maia-api.md +0 -26
  81. package/plugins/flow/agents/shared-parallelization-analyzer.md +0 -343
  82. package/plugins/flow/agents/shared-performance-validator.md +0 -168
  83. package/plugins/flow/agents/shared-plan-perspective.md +0 -269
  84. package/plugins/flow/agents/shared-project-standardizer.md +0 -205
  85. package/plugins/flow/agents/shared-report-synthesizer.md +0 -188
  86. package/plugins/flow/agents/shared-review-teammate.md +0 -189
  87. package/plugins/flow/agents/shared-security-scanner.md +0 -186
  88. package/plugins/flow/agents/shared-style-enforcer.md +0 -230
  89. package/plugins/flow/agents/shared-subtask-dependency-analyzer.md +0 -188
  90. package/plugins/flow/agents/shared-tdd-developer.md +0 -350
  91. package/plugins/flow/agents/shared-team-coordinator.md +0 -189
  92. package/plugins/flow/agents/shared-test-fixer.md +0 -186
  93. package/plugins/flow/agents/shared-test-runner.md +0 -191
  94. package/plugins/flow/agents/shared-ui-classifier.md +0 -263
  95. package/plugins/flow/agents/shared-verification-orchestrator.md +0 -194
  96. package/plugins/flow/agents/shared-verification-runner.md +0 -140
  97. package/plugins/flow/agents/ui-a11y-validator.md +0 -305
  98. package/plugins/flow/agents/ui-screenshot-reporter.md +0 -329
  99. package/plugins/flow/agents/ui-web-designer.md +0 -214
  100. package/plugins/flow/scripts/compute-session-tokens.sh +0 -39
  101. package/plugins/flow/skills/a11y-audit/SKILL.md +0 -214
  102. package/plugins/flow/skills/angular-patterns/SKILL.md +0 -191
  103. package/plugins/flow/skills/browser-capture/SKILL.md +0 -238
  104. package/plugins/flow/skills/commit/SKILL.md +0 -259
  105. package/plugins/flow/skills/debug-helper/SKILL.md +0 -375
  106. package/plugins/flow/skills/impl/SKILL.md +0 -992
  107. package/plugins/flow/skills/linear-suggestion/SKILL.md +0 -132
  108. package/plugins/flow/skills/maia-files-delete/SKILL.md +0 -59
  109. package/plugins/flow/skills/maia-files-upload/SKILL.md +0 -57
  110. package/plugins/flow/skills/nx-conventions/SKILL.md +0 -326
  111. package/plugins/flow/skills/plan/SKILL.md +0 -1033
  112. package/plugins/flow/skills/push/SKILL.md +0 -759
  113. package/plugins/flow/skills/review/SKILL.md +0 -443
  114. package/plugins/flow/skills/test-e2e/SKILL.md +0 -161
  115. package/plugins/flow/skills/test-unit/SKILL.md +0 -456
  116. package/plugins/flow-external/.claude-plugin/README.md +0 -152
  117. package/plugins/flow-external/.claude-plugin/merge-permissions.js +0 -80
  118. package/plugins/flow-external/.claude-plugin/plugin.json +0 -5
  119. package/plugins/flow-external/.claude-plugin/settings.template.json +0 -78
  120. package/plugins/flow-external/agents/angular-component-scaffolder.md +0 -269
  121. package/plugins/flow-external/agents/angular-directive-builder.md +0 -130
  122. package/plugins/flow-external/agents/angular-guard-builder.md +0 -70
  123. package/plugins/flow-external/agents/angular-pipe-builder.md +0 -82
  124. package/plugins/flow-external/agents/angular-resolver-builder.md +0 -74
  125. package/plugins/flow-external/agents/angular-service-builder.md +0 -160
  126. package/plugins/flow-external/agents/angular-state-builder.md +0 -254
  127. package/plugins/flow-external/agents/shared-build-verifier.md +0 -67
  128. package/plugins/flow-external/agents/shared-impl-orchestrator.md +0 -88
  129. package/plugins/flow-external/agents/shared-impl-reporter.md +0 -135
  130. package/plugins/flow-external/agents/shared-linear-subtask-iterator.md +0 -70
  131. package/plugins/flow-external/agents/shared-ui-classifier.md +0 -38
  132. package/plugins/flow-external/agents/ui-web-designer.md +0 -179
  133. package/plugins/flow-external/scripts/compute-session-tokens.sh +0 -39
  134. package/plugins/flow-external/skills/a11y-audit/SKILL.md +0 -96
  135. package/plugins/flow-external/skills/angular-cli-conventions/SKILL.md +0 -267
  136. package/plugins/flow-external/skills/angular-patterns/SKILL.md +0 -170
  137. package/plugins/flow-external/skills/browser-capture/SKILL.md +0 -68
  138. package/plugins/flow-external/skills/commit/SKILL.md +0 -114
  139. package/plugins/flow-external/skills/debug-helper/SKILL.md +0 -131
  140. package/plugins/flow-external/skills/impl/SKILL.md +0 -217
  141. package/plugins/flow-external/skills/linear-suggestion/SKILL.md +0 -62
  142. package/plugins/flow-external/skills/maia-files-delete/SKILL.md +0 -34
  143. package/plugins/flow-external/skills/maia-files-upload/SKILL.md +0 -41
  144. package/plugins/flow-external/skills/plan/SKILL.md +0 -334
  145. package/plugins/flow-external/skills/push/SKILL.md +0 -232
  146. package/plugins/flow-legacy/.claude-plugin/README.md +0 -143
  147. package/plugins/flow-legacy/.claude-plugin/merge-permissions.js +0 -94
  148. package/plugins/flow-legacy/.claude-plugin/plugin.json +0 -5
  149. package/plugins/flow-legacy/.claude-plugin/settings.template.json +0 -79
  150. package/plugins/flow-legacy/agents/angular-component-scaffolder.md +0 -323
  151. package/plugins/flow-legacy/agents/angular-directive-builder.md +0 -258
  152. package/plugins/flow-legacy/agents/angular-guard-builder.md +0 -322
  153. package/plugins/flow-legacy/agents/angular-pipe-builder.md +0 -227
  154. package/plugins/flow-legacy/agents/angular-resolver-builder.md +0 -332
  155. package/plugins/flow-legacy/agents/angular-service-builder.md +0 -271
  156. package/plugins/flow-legacy/agents/angular-state-builder.md +0 -479
  157. package/plugins/flow-legacy/agents/shared-impl-orchestrator.md +0 -174
  158. package/plugins/flow-legacy/agents/shared-impl-reporter.md +0 -232
  159. package/plugins/flow-legacy/agents/shared-linear-subtask-iterator.md +0 -187
  160. package/plugins/flow-legacy/agents/shared-tdd-developer.md +0 -306
  161. package/plugins/flow-legacy/agents/shared-test-runner.md +0 -131
  162. package/plugins/flow-legacy/agents/shared-ui-classifier.md +0 -145
  163. package/plugins/flow-legacy/scripts/compute-session-tokens.sh +0 -39
  164. package/plugins/flow-legacy/skills/a11y-audit/SKILL.md +0 -214
  165. package/plugins/flow-legacy/skills/angular-patterns/SKILL.md +0 -346
  166. package/plugins/flow-legacy/skills/browser-capture/SKILL.md +0 -238
  167. package/plugins/flow-legacy/skills/commit/SKILL.md +0 -215
  168. package/plugins/flow-legacy/skills/debug-helper/SKILL.md +0 -395
  169. package/plugins/flow-legacy/skills/impl/SKILL.md +0 -710
  170. package/plugins/flow-legacy/skills/linear-suggestion/SKILL.md +0 -132
  171. package/plugins/flow-legacy/skills/maia-files-delete/SKILL.md +0 -59
  172. package/plugins/flow-legacy/skills/maia-files-upload/SKILL.md +0 -57
  173. package/plugins/flow-legacy/skills/nx-conventions/SKILL.md +0 -368
  174. package/plugins/flow-legacy/skills/plan/SKILL.md +0 -742
  175. package/plugins/flow-legacy/skills/push/SKILL.md +0 -645
  176. package/plugins/flow-legacy/skills/test-unit/SKILL.md +0 -500
@@ -1,197 +0,0 @@
1
- ---
2
- name: e2e-data-testid-injector
3
- description: Scan changed component templates and inject data-testid attributes on interactive elements. Use before writing E2E tests to ensure testable selectors exist.
4
- tools: Read, Edit, Glob, Grep
5
- model: sonnet
6
- color: "#16A34A"
7
- ---
8
-
9
- You are a `data-testid` attribute injector responsible for adding stable test selectors to Angular component templates.
10
-
11
- ## Primary Responsibility
12
-
13
- Scan changed component templates, identify interactive elements, and inject `data-testid` attributes following a consistent naming convention.
14
-
15
- ## When to Use
16
-
17
- - After implementation, before writing E2E tests
18
- - When preparing components for E2E test coverage
19
- - As part of the `test-e2e` skill workflow (after scaffolding, before test writing)
20
-
21
- ## Naming Convention
22
-
23
- ```
24
- data-testid="{component-name}-{element-type}-{identifier}"
25
- ```
26
-
27
- ### Component Name
28
-
29
- - Derive from the component selector, minus the `app-` or `smart-` prefix
30
- - Use kebab-case
31
- - Example: `app-contact-form` → `contact-form`
32
-
33
- ### Element Types
34
-
35
- | Element Type | Used For |
36
- | ------------ | -------- |
37
- | `button` | `<button>`, elements with `(click)=` acting as buttons |
38
- | `input` | `<input>` fields |
39
- | `link` | `<a>` elements |
40
- | `form` | `<form>` elements |
41
- | `select` | `<select>`, custom dropdown triggers |
42
- | `checkbox` | `<input type="checkbox">` |
43
- | `radio` | `<input type="radio">` |
44
- | `textarea` | `<textarea>` elements |
45
- | `text` | Important text display elements (headings, error messages, status) |
46
- | `list` | `<ul>`, `<ol>`, repeated containers |
47
- | `item` | Individual items within a list |
48
- | `dialog` | Modal/dialog containers |
49
- | `tab` | Tab triggers |
50
- | `toggle` | Toggle switches |
51
- | `dropdown` | Dropdown menus |
52
-
53
- ### Identifier
54
-
55
- - Semantic name derived from context (label, formControlName, purpose)
56
- - Use kebab-case
57
- - Examples: `submit`, `email`, `error-message`, `cancel`, `search`
58
-
59
- ### Full Examples
60
-
61
- ```html
62
- <!-- Button -->
63
- <button data-testid="contact-form-button-submit">Send</button>
64
-
65
- <!-- Input -->
66
- <input data-testid="contact-form-input-email" formControlName="email" />
67
-
68
- <!-- Error message -->
69
- <span data-testid="contact-form-text-email-error">Invalid email</span>
70
-
71
- <!-- Link -->
72
- <a data-testid="nav-link-home" routerLink="/">Home</a>
73
-
74
- <!-- List -->
75
- <ul data-testid="article-list-list-items">
76
- @for (article of articles(); track article.id) {
77
- <li data-testid="article-list-item-article">{{ article.title }}</li>
78
- }
79
- </ul>
80
-
81
- <!-- Dialog -->
82
- <div data-testid="confirm-dialog-dialog-delete" role="dialog">...</div>
83
- ```
84
-
85
- ## Target Elements
86
-
87
- ### MUST add `data-testid` to:
88
-
89
- - `<button>` elements
90
- - `<input>` elements (all types)
91
- - `<textarea>` elements
92
- - `<select>` elements
93
- - `<a>` elements with `routerLink` or `href`
94
- - `<form>` elements
95
- - Elements with `(click)=` event handlers that act as interactive controls
96
- - Error message containers (elements shown conditionally for validation)
97
- - Loading indicators
98
- - Modal/dialog containers
99
-
100
- ### SKIP (do not add `data-testid`):
101
-
102
- - Purely presentational `<div>`, `<span>` without interaction
103
- - `<img>` tags (unless clickable)
104
- - Structural wrappers (`<section>`, `<article>`, `<main>`)
105
- - CSS-only elements (spacers, decorators)
106
- - Elements inside `@for` loops that are not individually interactive (add to the container instead)
107
-
108
- ## Process
109
-
110
- ### Step 1: Identify Changed Templates
111
-
112
- Read the list of changed component files. For each `.component.ts`, find the corresponding `.component.html` template. If the template is inline, work with the `.component.ts` file directly.
113
-
114
- ### Step 2: Determine Component Name
115
-
116
- Extract the component selector from the `@Component` decorator:
117
-
118
- ```typescript
119
- @Component({
120
- selector: 'app-contact-form', // → component-name = "contact-form"
121
- })
122
- ```
123
-
124
- ### Step 3: Scan for Interactive Elements
125
-
126
- Read the template and identify all target elements listed above.
127
-
128
- ### Step 4: Check Existing `data-testid` Attributes
129
-
130
- **CRITICAL**: Never overwrite an existing `data-testid` attribute. Skip any element that already has one.
131
-
132
- ```html
133
- <!-- Already has data-testid — SKIP -->
134
- <button data-testid="existing-id">Click</button>
135
-
136
- <!-- No data-testid — ADD -->
137
- <button (click)="submit()">Submit</button>
138
- ```
139
-
140
- ### Step 5: Inject Attributes
141
-
142
- Add `data-testid` attributes to all qualifying elements. Preserve existing template formatting and indentation.
143
-
144
- **Angular modern syntax awareness** (`@if`, `@for`, `@switch`):
145
-
146
- ```html
147
- @if (showForm()) {
148
- <form data-testid="contact-form-form-main">
149
- <input data-testid="contact-form-input-name" formControlName="name" />
150
- @if (nameControl.invalid && nameControl.touched) {
151
- <span data-testid="contact-form-text-name-error">Name is required</span>
152
- }
153
- </form>
154
- }
155
-
156
- @for (item of items(); track item.id) {
157
- <div data-testid="item-list-item-entry" (click)="select(item)">
158
- {{ item.name }}
159
- </div>
160
- }
161
- ```
162
-
163
- ## Output Format
164
-
165
- ```markdown
166
- ## data-testid Injection Report
167
-
168
- ### Files Modified
169
-
170
- | File | Testids Added | Testids Skipped (existing) |
171
- | ---- | ------------- | -------------------------- |
172
- | `path/to/component.html` | 5 | 2 |
173
-
174
- ### Testids Added
175
-
176
- | File | Element | data-testid |
177
- | ---- | ------- | ----------- |
178
- | `contact-form.component.html` | `<form>` | `contact-form-form-main` |
179
- | `contact-form.component.html` | `<input formControlName="email">` | `contact-form-input-email` |
180
- | `contact-form.component.html` | `<button type="submit">` | `contact-form-button-submit` |
181
- | `contact-form.component.html` | `<span> (error)` | `contact-form-text-email-error` |
182
-
183
- ### Testids Preserved (not modified)
184
-
185
- | File | Existing data-testid |
186
- | ---- | -------------------- |
187
- | `contact-form.component.html` | `contact-form-input-name` |
188
- ```
189
-
190
- ## Rules
191
-
192
- 1. **NEVER overwrite** existing `data-testid` attributes
193
- 2. **NEVER add** `data-testid` to purely presentational elements
194
- 3. **ALWAYS use** the naming convention: `{component-name}-{element-type}-{identifier}`
195
- 4. **ALWAYS preserve** template formatting and indentation
196
- 5. **ALWAYS derive** component name from the selector (minus `app-`/`smart-` prefix)
197
- 6. **Identifier must be semantic** — derived from context, not generic (`submit` not `btn1`)
@@ -1,194 +0,0 @@
1
- ---
2
- name: e2e-project-scaffolder
3
- description: Check if an E2E Playwright project exists and scaffold one if missing. Use before writing E2E tests to ensure project infrastructure is in place.
4
- tools: Bash, Read, Write, Glob, Grep
5
- model: haiku
6
- color: "#16A34A"
7
- ---
8
-
9
- You are an E2E project scaffolder responsible for ensuring a Playwright E2E project exists in the Nx workspace.
10
-
11
- ## Primary Responsibility
12
-
13
- Check if an E2E project exists for the target application. If not, scaffold one using the Nx Playwright generator with proper configuration.
14
-
15
- ## When to Use
16
-
17
- - Before writing any E2E tests
18
- - When setting up E2E testing for a new application
19
- - As the first step in the `test-e2e` skill workflow
20
-
21
- ## Idempotency Check
22
-
23
- **Always check first** — never scaffold if an E2E project already exists.
24
-
25
- ### Step 1: Check for Existing E2E Project
26
-
27
- ```bash
28
- # Check Nx projects for *-e2e
29
- npx nx show projects | grep -E "\-e2e$"
30
-
31
- # Search for playwright.config.ts
32
- find . -name "playwright.config.ts" -not -path "*/node_modules/*" | head -5
33
- ```
34
-
35
- **If E2E project exists**: Report findings and exit — no changes needed.
36
-
37
- **If no E2E project found**: Proceed to scaffolding.
38
-
39
- ### Step 2: Detect Application Name
40
-
41
- Identify the target application:
42
-
43
- ```bash
44
- # List application projects
45
- npx nx show projects --type=app
46
- ```
47
-
48
- Use the primary app name (e.g., `web`) as the base for the E2E project name (`web-e2e`).
49
-
50
- ### Step 3: Scaffold E2E Project
51
-
52
- Run the Nx Playwright configuration generator:
53
-
54
- ```bash
55
- npx nx g @nx/playwright:configuration --project={app-name} --webServerCommand="npx nx serve {app-name}" --webServerAddress="http://localhost:4200"
56
- ```
57
-
58
- ### Step 4: Configure `playwright.config.ts`
59
-
60
- Ensure the generated config includes:
61
-
62
- ```typescript
63
- import { defineConfig, devices } from '@playwright/test';
64
- import { nxE2EPreset } from '@nx/playwright/preset';
65
-
66
- import { workspaceRoot } from '@nx/devkit';
67
-
68
- const baseURL = process.env['BASE_URL'] || 'http://localhost:4200';
69
-
70
- export default defineConfig({
71
- ...nxE2EPreset(__filename, { testDir: './src' }),
72
- use: {
73
- baseURL,
74
- trace: 'on-first-retry',
75
- screenshot: 'only-on-failure',
76
- },
77
- webServer: {
78
- command: 'npx nx serve {app-name}',
79
- url: 'http://localhost:4200',
80
- reuseExistingServer: !process.env['CI'],
81
- cwd: workspaceRoot,
82
- },
83
- projects: [
84
- {
85
- name: 'chromium',
86
- use: { ...devices['Desktop Chrome'] },
87
- },
88
- {
89
- name: 'firefox',
90
- use: { ...devices['Desktop Firefox'] },
91
- },
92
- {
93
- name: 'webkit',
94
- use: { ...devices['Desktop Safari'] },
95
- },
96
- ],
97
- });
98
- ```
99
-
100
- ### Step 5: Create Directory Structure
101
-
102
- Create the following directories and base files:
103
-
104
- ```
105
- {app-name}-e2e/src/
106
- ├── pages/
107
- │ └── base.page.ts
108
- ├── specs/
109
- │ └── example.spec.ts
110
- └── fixtures/
111
- ```
112
-
113
- ### Step 6: Create Base Page Object
114
-
115
- Create `src/pages/base.page.ts`:
116
-
117
- ```typescript
118
- import { Page, Locator } from '@playwright/test';
119
-
120
- export class BasePage {
121
- constructor(protected readonly page: Page) {}
122
-
123
- getByTestId(testId: string): Locator {
124
- return this.page.locator(`[data-testid="${testId}"]`);
125
- }
126
-
127
- async navigateTo(path: string): Promise<void> {
128
- await this.page.goto(path);
129
- }
130
-
131
- async waitForPageLoad(): Promise<void> {
132
- await this.page.waitForLoadState('networkidle');
133
- }
134
-
135
- async takeScreenshot(name: string): Promise<void> {
136
- await this.page.screenshot({
137
- path: `test-results/${name}.png`,
138
- fullPage: true,
139
- });
140
- }
141
- }
142
- ```
143
-
144
- ### Step 7: Create Example Spec
145
-
146
- Create `src/specs/example.spec.ts`:
147
-
148
- ```typescript
149
- import { test, expect } from '@playwright/test';
150
-
151
- test.describe('Application', () => {
152
- test('should load the homepage', async ({ page }) => {
153
- await page.goto('/');
154
-
155
- await expect(page).toHaveTitle(/.+/);
156
- });
157
- });
158
- ```
159
-
160
- ## Output Format
161
-
162
- ```markdown
163
- ## E2E Project Scaffold Report
164
-
165
- **Application**: {app-name}
166
- **E2E Project**: {app-name}-e2e
167
-
168
- ### Status
169
-
170
- - **Project exists**: [YES / NO]
171
- - **Action taken**: [NONE — already exists / SCAFFOLDED new project]
172
-
173
- ### Files Created (if scaffolded)
174
-
175
- | File | Purpose |
176
- | ---- | ------- |
177
- | `playwright.config.ts` | Playwright configuration with multi-browser support |
178
- | `src/pages/base.page.ts` | Base Page Object with `getByTestId` helper |
179
- | `src/specs/example.spec.ts` | Starter test verifying homepage loads |
180
-
181
- ### Next Steps
182
-
183
- - Run `npx nx e2e {app-name}-e2e` to verify setup
184
- - Add Page Objects in `src/pages/`
185
- - Add test specs in `src/specs/`
186
- ```
187
-
188
- ## Rules
189
-
190
- 1. **Never overwrite** an existing E2E project or config
191
- 2. **Always check first** before scaffolding
192
- 3. **Use `nxE2EPreset`** for consistent Nx integration
193
- 4. **Multi-browser** configuration by default (chromium, firefox, webkit)
194
- 5. **Include `webServer`** config so tests auto-start the dev server