@sun-asterisk/sungen 2.5.2 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/dist/cli/commands/add-flow.d.ts +3 -0
  2. package/dist/cli/commands/add-flow.d.ts.map +1 -0
  3. package/dist/cli/commands/add-flow.js +27 -0
  4. package/dist/cli/commands/add-flow.js.map +1 -0
  5. package/dist/cli/commands/delivery.d.ts.map +1 -1
  6. package/dist/cli/commands/delivery.js +95 -60
  7. package/dist/cli/commands/delivery.js.map +1 -1
  8. package/dist/cli/commands/generate.d.ts.map +1 -1
  9. package/dist/cli/commands/generate.js +38 -6
  10. package/dist/cli/commands/generate.js.map +1 -1
  11. package/dist/cli/index.js +3 -1
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/generators/test-generator/adapters/adapter-interface.d.ts +16 -0
  14. package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
  15. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts +3 -0
  16. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts.map +1 -1
  17. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js.map +1 -1
  18. package/dist/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -2
  19. package/dist/generators/test-generator/adapters/playwright/templates/scenario.hbs +20 -1
  20. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-accept-action.hbs +1 -1
  21. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-dismiss-action.hbs +1 -1
  22. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-fill-action.hbs +1 -1
  23. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/alert-text-assertion.hbs +2 -2
  24. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +1 -0
  25. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +2 -1
  26. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +1 -2
  27. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -1
  28. package/dist/generators/test-generator/adapters/playwright/templates/test-file.hbs +84 -4
  29. package/dist/generators/test-generator/code-generator.d.ts +2 -0
  30. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  31. package/dist/generators/test-generator/code-generator.js +105 -17
  32. package/dist/generators/test-generator/code-generator.js.map +1 -1
  33. package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +1 -1
  34. package/dist/generators/test-generator/patterns/interaction-patterns.js +22 -3
  35. package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
  36. package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +1 -1
  37. package/dist/generators/test-generator/patterns/navigation-patterns.js +8 -3
  38. package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -1
  39. package/dist/generators/test-generator/step-mapper.d.ts +4 -0
  40. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
  41. package/dist/generators/test-generator/step-mapper.js +7 -0
  42. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  43. package/dist/generators/test-generator/template-engine.d.ts +14 -0
  44. package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
  45. package/dist/generators/test-generator/template-engine.js +1 -1
  46. package/dist/generators/test-generator/template-engine.js.map +1 -1
  47. package/dist/generators/test-generator/utils/data-resolver.d.ts +3 -20
  48. package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
  49. package/dist/generators/test-generator/utils/data-resolver.js +23 -66
  50. package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
  51. package/dist/generators/test-generator/utils/selector-resolver.d.ts +2 -6
  52. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
  53. package/dist/generators/test-generator/utils/selector-resolver.js +18 -80
  54. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
  55. package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
  56. package/dist/orchestrator/ai-rules-updater.js +4 -0
  57. package/dist/orchestrator/ai-rules-updater.js.map +1 -1
  58. package/dist/orchestrator/flow-manager.d.ts +22 -0
  59. package/dist/orchestrator/flow-manager.d.ts.map +1 -0
  60. package/dist/orchestrator/flow-manager.js +251 -0
  61. package/dist/orchestrator/flow-manager.js.map +1 -0
  62. package/dist/orchestrator/project-initializer.d.ts.map +1 -1
  63. package/dist/orchestrator/project-initializer.js +1 -0
  64. package/dist/orchestrator/project-initializer.js.map +1 -1
  65. package/dist/orchestrator/screen-manager.d.ts.map +1 -1
  66. package/dist/orchestrator/screen-manager.js +3 -1
  67. package/dist/orchestrator/screen-manager.js.map +1 -1
  68. package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-flow.md +88 -0
  69. package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +11 -8
  70. package/dist/orchestrator/templates/ai-instructions/claude-cmd-review.md +8 -6
  71. package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +15 -11
  72. package/dist/orchestrator/templates/ai-instructions/claude-config.md +41 -10
  73. package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +12 -0
  74. package/dist/orchestrator/templates/ai-instructions/claude-skill-delivery.md +19 -18
  75. package/dist/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md +12 -0
  76. package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +122 -10
  77. package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +31 -3
  78. package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +45 -0
  79. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +92 -0
  80. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +30 -0
  81. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-flow.md +86 -0
  82. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +13 -10
  83. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-delivery.md +16 -15
  84. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-review.md +9 -7
  85. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +21 -17
  86. package/dist/orchestrator/templates/ai-instructions/copilot-config.md +40 -9
  87. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +12 -0
  88. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +19 -18
  89. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-error-mapping.md +12 -0
  90. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +122 -10
  91. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +31 -3
  92. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +45 -0
  93. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +93 -0
  94. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +30 -0
  95. package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -1
  96. package/dist/orchestrator/templates/playwright.config.js +3 -1
  97. package/dist/orchestrator/templates/playwright.config.js.map +1 -1
  98. package/dist/orchestrator/templates/playwright.config.ts +4 -1
  99. package/dist/orchestrator/templates/specs-base.d.ts +3 -4
  100. package/dist/orchestrator/templates/specs-base.d.ts.map +1 -1
  101. package/dist/orchestrator/templates/specs-base.js +60 -91
  102. package/dist/orchestrator/templates/specs-base.js.map +1 -1
  103. package/dist/orchestrator/templates/specs-base.ts +61 -101
  104. package/dist/orchestrator/templates/specs-test-data.d.ts +3 -1
  105. package/dist/orchestrator/templates/specs-test-data.d.ts.map +1 -1
  106. package/dist/orchestrator/templates/specs-test-data.js +53 -2
  107. package/dist/orchestrator/templates/specs-test-data.js.map +1 -1
  108. package/dist/orchestrator/templates/specs-test-data.ts +56 -2
  109. package/package.json +1 -1
  110. package/src/cli/commands/add-flow.ts +25 -0
  111. package/src/cli/commands/delivery.ts +109 -58
  112. package/src/cli/commands/generate.ts +43 -6
  113. package/src/cli/index.ts +3 -1
  114. package/src/generators/test-generator/adapters/adapter-interface.ts +6 -1
  115. package/src/generators/test-generator/adapters/playwright/playwright-adapter.ts +1 -1
  116. package/src/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -2
  117. package/src/generators/test-generator/adapters/playwright/templates/scenario.hbs +20 -1
  118. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-accept-action.hbs +1 -1
  119. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-dismiss-action.hbs +1 -1
  120. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-fill-action.hbs +1 -1
  121. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/alert-text-assertion.hbs +2 -2
  122. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +1 -0
  123. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +2 -1
  124. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +1 -2
  125. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -1
  126. package/src/generators/test-generator/adapters/playwright/templates/test-file.hbs +84 -4
  127. package/src/generators/test-generator/code-generator.ts +119 -20
  128. package/src/generators/test-generator/patterns/interaction-patterns.ts +25 -3
  129. package/src/generators/test-generator/patterns/navigation-patterns.ts +8 -3
  130. package/src/generators/test-generator/step-mapper.ts +8 -0
  131. package/src/generators/test-generator/template-engine.ts +5 -2
  132. package/src/generators/test-generator/utils/data-resolver.ts +25 -77
  133. package/src/generators/test-generator/utils/selector-resolver.ts +23 -109
  134. package/src/orchestrator/ai-rules-updater.ts +5 -0
  135. package/src/orchestrator/flow-manager.ts +243 -0
  136. package/src/orchestrator/project-initializer.ts +1 -0
  137. package/src/orchestrator/screen-manager.ts +3 -1
  138. package/src/orchestrator/templates/ai-instructions/claude-cmd-add-flow.md +88 -0
  139. package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +11 -8
  140. package/src/orchestrator/templates/ai-instructions/claude-cmd-review.md +8 -6
  141. package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +15 -11
  142. package/src/orchestrator/templates/ai-instructions/claude-config.md +41 -10
  143. package/src/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +12 -0
  144. package/src/orchestrator/templates/ai-instructions/claude-skill-delivery.md +19 -18
  145. package/src/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md +12 -0
  146. package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +122 -10
  147. package/src/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +31 -3
  148. package/src/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +45 -0
  149. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +92 -0
  150. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +30 -0
  151. package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-flow.md +86 -0
  152. package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +13 -10
  153. package/src/orchestrator/templates/ai-instructions/copilot-cmd-delivery.md +16 -15
  154. package/src/orchestrator/templates/ai-instructions/copilot-cmd-review.md +9 -7
  155. package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +21 -17
  156. package/src/orchestrator/templates/ai-instructions/copilot-config.md +40 -9
  157. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +12 -0
  158. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +19 -18
  159. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-error-mapping.md +12 -0
  160. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +122 -10
  161. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +31 -3
  162. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +45 -0
  163. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +93 -0
  164. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +30 -0
  165. package/src/orchestrator/templates/playwright.config.ts +4 -1
  166. package/src/orchestrator/templates/specs-base.ts +61 -101
  167. package/src/orchestrator/templates/specs-test-data.ts +56 -2
  168. package/dist/utils/feature-finder.d.ts +0 -9
  169. package/dist/utils/feature-finder.d.ts.map +0 -1
  170. package/dist/utils/feature-finder.js +0 -67
  171. package/dist/utils/feature-finder.js.map +0 -1
  172. package/dist/utils/screen-paths.d.ts +0 -10
  173. package/dist/utils/screen-paths.d.ts.map +0 -1
  174. package/dist/utils/screen-paths.js +0 -73
  175. package/dist/utils/screen-paths.js.map +0 -1
  176. package/dist/utils/selector-loader.d.ts +0 -6
  177. package/dist/utils/selector-loader.d.ts.map +0 -1
  178. package/dist/utils/selector-loader.js +0 -20
  179. package/dist/utils/selector-loader.js.map +0 -1
  180. package/dist/utils/test-data-loader.d.ts +0 -6
  181. package/dist/utils/test-data-loader.d.ts.map +0 -1
  182. package/dist/utils/test-data-loader.js +0 -20
  183. package/dist/utils/test-data-loader.js.map +0 -1
  184. package/src/utils/feature-finder.ts +0 -33
  185. package/src/utils/screen-paths.ts +0 -37
  186. package/src/utils/selector-loader.ts +0 -23
  187. package/src/utils/test-data-loader.ts +0 -23
@@ -24,6 +24,28 @@ Run tests in priority waves — catch fundamental issues early, fix critical pat
24
24
 
25
25
  If existing selectors already cover the feature file, **skip Phase 0** and go straight to compile + Phase 1.
26
26
 
27
+ ### Flow Mode: Screen Selector Reference
28
+
29
+ When running Phase 0 for a **flow** (`qa/flows/<name>/`), check existing screen selectors first before snapshotting live pages. Screen selectors are already verified and proven — reuse them to save time and reduce errors.
30
+
31
+ **Steps (before the standard Phase 0 steps):**
32
+
33
+ 1. **Parse screen references**: read the `.feature` file for `[Screen:Element]` references. Group by screen name (e.g., `Login`, `Awards`, `Dashboard`).
34
+ 2. **For each referenced screen**, check `qa/screens/<screen>/selectors/<screen>.yaml`:
35
+ - **If exists** → copy matching entries to the flow's `selectors.yaml`, remapping keys to namespace format:
36
+ - Screen key `submit` with screen `login` → flow key `"login:submit"`
37
+ - Screen key `email-field` with screen `login` → flow key `"login:email-field"`
38
+ - Preserve the full selector definition (type, value, name, etc.)
39
+ - Mark these entries as **verified** (no `@needs-live-verify` comment needed)
40
+ - **If not found** → add this screen to the "needs live snapshot" list
41
+ 3. **Elements not found in any screen selector** → also added to the "needs live snapshot" list
42
+ 4. **If "needs live snapshot" list is empty** → Phase 0 screen-reference covered everything, skip to compile
43
+ 5. **If "needs live snapshot" list is non-empty** → continue with the standard Phase 0 steps below, but only generate selectors for the missing elements (don't re-snapshot elements already copied from screens)
44
+
45
+ **Merge rule**: screen-referenced entries take priority over provisional (Figma-sourced) entries. If an element was previously generated from Figma with `@needs-live-verify`, the screen-verified entry replaces it.
46
+
47
+ **Important**: flow selectors remain private — they live in the flow's own YAML file. This is just initialization from screen data, not a runtime dependency.
48
+
27
49
  ### Steps
28
50
 
29
51
  1. **Confirm with the user** via `AskUserQuestion`: *"Generate selectors from the live page via Playwright MCP now?"* — offer **Yes, scan live page** / **Skip (use existing selectors.yaml)** / **Cancel**.
@@ -39,9 +61,10 @@ If existing selectors already cover the feature file, **skip Phase 0** and go st
39
61
  - Selector priority: follow the table in **Diagnosis & Fix § Step 3** (`testid` > `role`+name > `placeholder` > `label` > `locator` > `text`).
40
62
  - Copy names **character-for-character** from the snapshot. Never infer from the Gherkin label.
41
63
  - If an element is auto-inferable per `sungen-selector-keys` § Auto-Infer, **omit it** from YAML — keep the file minimal.
42
- 7. **Merge, don't overwrite**: preserve the page selector and any user-authored entries in `selectors.yaml`. Only add missing keys.
43
- 8. **Show summary + confirm**: list the keys that will be added, ask the user to approve, then write the file.
44
- 9. **Compile**: `sungen generate --screen <screen>` then proceed to Phase 1.
64
+ 7. **Substring ambiguity check**: for each `role` + `name` selector, check if any other element in the snapshot has a name that **contains** this name as a substring (e.g., `"Đăng ký"` vs `"Đăng ký bằng Google"`). If yes → add `exact: true` to prevent strict mode violation at runtime.
65
+ 8. **Merge, don't overwrite**: preserve the page selector and any user-authored entries in `selectors.yaml`. Only add missing keys.
66
+ 9. **Show summary + confirm**: list the keys that will be added, ask the user to approve, then write the file.
67
+ 10. **Compile**: **Screen**: `sungen generate --screen <screen>`. **Flow**: `sungen generate --flow <flow>`. Then proceed to Phase 1.
45
68
 
46
69
  ### Common Phase 0 pitfalls
47
70
 
@@ -204,6 +227,7 @@ Array.from(document.querySelectorAll('[data-testid]'))
204
227
  Common fixes:
205
228
  - Name mismatch → copy exact name from snapshot
206
229
  - Multiple matches → add `nth` or `exact: true`
230
+ - Substring ambiguity (e.g., `"Submit"` matches `"Submit"` and `"Submit & Continue"`) → add `exact: true`
207
231
  - No accessible name → use `testid` or `locator` (CSS)
208
232
  - Element in iframe → add `frame` field
209
233
  - Dynamic content → use `testid` or structural `role` + `nth`
@@ -212,7 +236,11 @@ Common fixes:
212
236
 
213
237
  Always recompile before re-running:
214
238
  ```bash
239
+ # Screen
215
240
  sungen generate --screen <screen>
241
+
242
+ # Flow
243
+ sungen generate --flow <flow>
216
244
  ```
217
245
 
218
246
  Then re-run only the current phase's failing tests, not all tests.
@@ -27,6 +27,51 @@ Copy the text from `[Reference]` as-is, then lowercase. Unicode characters (Viet
27
27
  4. **Keep all Unicode characters as-is** (Vietnamese diacritics, Japanese, etc.)
28
28
  5. **Keys use spaces** (not dots) as word separators
29
29
 
30
+ ## Flow Namespaced Keys
31
+
32
+ In `@flow` features, selectors are namespaced by screen using colon: `[Screen:Element]` → YAML key `"screen:element"` (quoted).
33
+
34
+ ```
35
+ [Login:Email] → "login:email"
36
+ [Login:Submit] → "login:submit"
37
+ [Dashboard:Awards] → "dashboard:awards"
38
+ [Awards:Submit] → "awards:submit"
39
+ ```
40
+
41
+ **Rules:**
42
+ 1. Same lowercase + Unicode rules as standard keys
43
+ 2. Colon separates screen prefix from element name
44
+ 3. **YAML keys must be quoted** because of the colon: `"login:email":`
45
+ 4. Page references don't need prefix: `[Login]` → `login:` (page type)
46
+ 5. Prevents duplicate names across screens (e.g., `"login:submit"` vs `"awards:submit"`)
47
+
48
+ ```yaml
49
+ # Flow selectors — each screen section namespaced
50
+ login:
51
+ type: 'page'
52
+ value: '/login'
53
+
54
+ "login:email":
55
+ type: 'testid'
56
+ value: 'email-input'
57
+
58
+ "login:submit":
59
+ type: 'role'
60
+ value: 'button'
61
+ name: 'Login'
62
+
63
+ awards:
64
+ type: 'page'
65
+ value: '/awards'
66
+
67
+ "awards:submit":
68
+ type: 'role'
69
+ value: 'button'
70
+ name: 'Submit Award'
71
+ ```
72
+
73
+ **Type and nth suffixes still apply:** `"login:submit--button"`, `"awards:item--3"`
74
+
30
75
  ## Type-Suffixed Keys
31
76
 
32
77
  When the same label is used for different element types, add `--type` suffix:
@@ -161,6 +161,29 @@ Scenario: Reset filters to default
161
161
 
162
162
  For one-time setup/teardown. Most screens don't need these.
163
163
 
164
+ ### `@parallel` — when tests need independent browser state
165
+
166
+ Add `@parallel` at feature level when:
167
+
168
+ 1. **Multiple auth groups** (required) — e.g., `@auth:user` + `@no-auth` scenarios. Serial mode uses one shared context and cannot mix auth roles. Compiler will error without this tag.
169
+ 2. **Validation-heavy features** (recommended) — each scenario fills forms with different invalid data and needs a clean form. Serial shared page keeps previous test's input.
170
+
171
+ Serial (default) is best for: CRUD flows, sequential user journeys, UI checks on the same page.
172
+
173
+ ```gherkin
174
+ @parallel @auth:user
175
+ @cleanup:forms
176
+ Feature: kudos Screen
177
+
178
+ @critical
179
+ Scenario: Send kudos
180
+ ...
181
+
182
+ @critical @no-auth
183
+ Scenario: Unauthenticated user is redirected
184
+ ...
185
+ ```
186
+
164
187
  ## Output Format
165
188
 
166
189
  **Feature file** — `qa/screens/<screen>/features/<screen>.feature`
@@ -237,4 +260,73 @@ valid_email: admin@staging.example.com
237
260
  valid_password: StagingPass456
238
261
  ```
239
262
 
263
+ ## Flow Test Generation
264
+
265
+ When generating tests for a **flow** (`qa/flows/<name>/`), adapt the strategy:
266
+
267
+ ### Structure
268
+
269
+ - **Background** — starting page only: `Given User is on [Login] page`
270
+ - **Scenarios** — each phase of the E2E journey as a separate scenario
271
+ - **Selector refs** — use `[Screen:Element]` namespace format (see `sungen-gherkin-syntax`)
272
+ - **Test data** — namespace by phase: `login.email`, `submission.nominee`
273
+ - **Feature tag** — `@flow` required at feature level
274
+
275
+ ### Flow vs Screen Differences
276
+
277
+ | Aspect | Screen | Flow |
278
+ |---|---|---|
279
+ | Section focus | UI patterns per section | Journey phases across screens |
280
+ | Viewpoints | VP-UI, VP-VAL, VP-LOGIC, VP-SEC per section | VP-LOGIC (flow transitions), VP-SEC (auth persistence), VP-VAL (cross-screen data) |
281
+ | Tier 1 focus | Happy path + required validation per section | Happy path through entire flow + auth + key error recovery |
282
+ | Background | Navigate to screen | Navigate to starting page |
283
+
284
+ ### Flow-specific scenarios to generate
285
+
286
+ | Category | Examples |
287
+ |---|---|
288
+ | **Happy path** | Complete flow end-to-end with valid data |
289
+ | **Auth persistence** | Auth state maintained across screen transitions |
290
+ | **Error recovery** | Invalid input mid-flow → fix → continue |
291
+ | **Incomplete flow** | User abandons at each phase → state cleanup |
292
+ | **Cross-screen data** | Data entered on screen A visible on screen B |
293
+
294
+ ### Output Format (Flow)
295
+
296
+ ```gherkin
297
+ @flow @auth:user
298
+ Feature: Award Submission Flow
299
+
300
+ Background:
301
+ Given User is on [Login] page
302
+
303
+ @critical
304
+ Scenario: User login successfully
305
+ When User fill [Login:Email] field with {{login.email}}
306
+ And User fill [Login:Password] field with {{login.password}}
307
+ And User click [Login:Submit] button
308
+ Then User see [Dashboard] page
309
+
310
+ @critical
311
+ Scenario: User navigates to awards and submits
312
+ When User click [Dashboard:Awards] link
313
+ Then User see [Awards] page
314
+ When User fill [Awards:Nominee] field with {{submission.nominee}}
315
+ And User click [Awards:Submit] button
316
+ Then User see {{success_message}} message
317
+ ```
318
+
319
+ **Test data** — `qa/flows/<name>/test-data/<name>.yaml`, namespaced by phase:
320
+
321
+ ```yaml
322
+ login:
323
+ email: "admin@example.com"
324
+ password: "secret123"
325
+ submission:
326
+ nominee: "John Doe"
327
+ success_message: "Award submitted successfully"
328
+ ```
329
+
330
+ **Environment overrides** work the same: `<name>.<env>.yaml` merged at runtime via `SUNGEN_ENV`.
331
+
240
332
  **Do NOT generate**: `selectors.yaml` (created during run-test), Playwright code (sungen compiles).
@@ -89,6 +89,36 @@ Do NOT mark `@manual` when data is visible in snapshot or documented in spec —
89
89
 
90
90
  ---
91
91
 
92
+ ## Flow Review Additions
93
+
94
+ When reviewing a `@flow` feature (`qa/flows/<name>/`), apply standard scoring PLUS these flow-specific checks:
95
+
96
+ ### Syntax — additional checks
97
+ - `[Screen:Element]` format used consistently (not mixing bare `[Element]` refs)
98
+ - YAML keys quoted with colon: `"login:submit":` not `login:submit:`
99
+ - `@flow` tag present at feature level
100
+
101
+ ### Coverage — additional dimensions
102
+ | Dimension | Pts (from existing 40) | What to check |
103
+ |---|---|---|
104
+ | Screen transitions | (part of State transitions) | Each screen-to-screen navigation tested |
105
+ | Auth persistence | (part of Happy paths) | Auth state maintained across transitions |
106
+ | Error recovery mid-flow | (part of Negative cases) | Invalid input at each phase → fix → continue |
107
+ | Cross-screen data | (part of Edge cases) | Data entered on screen A asserted on screen B |
108
+
109
+ ### Viewpoint — flow-specific classification
110
+ - **VP-LOGIC** — screen transitions, navigation flow, auth persistence
111
+ - **VP-VAL** — cross-screen data consistency, form data carried across pages
112
+ - **VP-SEC** — auth state across redirects, permission changes mid-flow
113
+ - VP-UI is typically minimal in flows (focus on functionality over layout)
114
+
115
+ ### Checklist — flow-specific items
116
+ 11. **Missing screen transitions** — flow visits 4 screens but only 2 transitions tested? Add missing
117
+ 12. **Orphan scenarios** — scenario doesn't connect to previous/next phase? Flag broken flow
118
+ 13. **Selector namespace consistency** — mixing `[Submit]` and `[Login:Submit]` in same flow? Standardize
119
+
120
+ ---
121
+
92
122
  ## Output Format
93
123
 
94
124
  ```markdown
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: sungen-add-flow
3
+ description: 'Add a new Sungen flow — scaffolds directories for E2E cross-screen testing, helps fill spec.md, and can capture visuals via the capture skills'
4
+ argument-hint: '[flow-name] [--path <start-url>]'
5
+ agent: 'agent'
6
+ tools: [vscode, execute, read, agent, edit, search, todo]
7
+ ---
8
+
9
+ **Input**: Flow name and optional starting URL (e.g., `/sungen-add-flow award-submission --path /login`).
10
+
11
+ You are adding a new Sungen flow for E2E cross-screen test generation.
12
+
13
+ ## Parameters
14
+
15
+ - **flow** — ${input:flow:flow name (e.g., award-submission, user-onboarding)}
16
+ - **--path \<url\>** — starting page URL path (default: `/login`)
17
+ - **--description \<text\>** — flow description (optional)
18
+
19
+ ## Steps
20
+
21
+ ### 1. Scaffold the flow
22
+
23
+ Run with #tool:terminal:
24
+ ```bash
25
+ sungen add-flow --flow ${input:flow} --path ${input:path}
26
+ ```
27
+
28
+ This creates:
29
+ ```
30
+ qa/flows/${input:flow}/
31
+ ├── features/${input:flow}.feature # Gherkin with @flow tag, Background, sample scenarios
32
+ ├── selectors/${input:flow}.yaml # Namespaced keys: "login:submit", "awards:submit"
33
+ ├── test-data/${input:flow}.yaml # Namespaced data: login.email, submission.nominee
34
+ └── requirements/
35
+ ├── spec.md # Flow specification
36
+ └── ui/ # Screenshots, mockups
37
+ ```
38
+
39
+ ### 1a. Identify the screens in the flow
40
+
41
+ Ask the user: "Which screens does this flow visit, in order? (e.g., login → dashboard → award-form → confirmation)"
42
+
43
+ Record the screen list — you will need it for:
44
+ - Filling `spec.md` (Step 3)
45
+ - Suggesting `[Screen:Element]` namespace prefixes
46
+ - Capturing visuals per screen (Step 2)
47
+
48
+ ### 2. Capture visual source
49
+
50
+ Ask: *"Pick a visual source for this flow's screens:"*
51
+ - **Figma designs** (Recommended for pre-launch) — invoke `sungen-capture-figma` skill for each screen
52
+ - **Live page scan** (dev/staging is up) — invoke `sungen-capture-live` skill for each screen URL
53
+ - **Local images** — invoke `sungen-capture-local` skill to load from `requirements/ui/`
54
+ - **Skip** — user will drop images manually into `requirements/ui/` later
55
+
56
+ Each capture skill writes outputs into `qa/flows/${input:flow}/requirements/ui/` and reports back a summary. Do not inline capture logic here — always delegate to the skill.
57
+
58
+ ### 3. Fill spec.md
59
+
60
+ Ask: *"Fill `spec.md` now? (You can reference the captured visuals)"* — offer **Yes, fill now (Recommended)** / **Skip, fill later**.
61
+
62
+ If yes → open `qa/flows/${input:flow}/requirements/spec.md` and help the user fill:
63
+ - **Screens list** — ordered list of screens with URL paths
64
+ - **Flow steps** — what the user does at each screen
65
+ - **Transitions** — what triggers navigation between screens
66
+ - **Business rules** — cross-screen validation, state that persists
67
+ - **Test data** — what data is entered at each screen
68
+
69
+ Reference the captured visuals from Step 2 to suggest field names, form elements, and UI states.
70
+
71
+ ### 4. Next steps
72
+
73
+ Tell the user what was created and offer next steps:
74
+
75
+ - **`/sungen-create-test ${input:flow}`** — Generate test scenarios for the flow (Recommended)
76
+ - **Done for now** — I'll come back later
77
+
78
+ ## Key Rules
79
+
80
+ - Flows are **independent** from screens — own selectors, own test-data
81
+ - Selectors use `[Screen:Element]` namespace format with colon
82
+ - YAML keys must be **quoted** due to colon: `"login:submit":`
83
+ - Test data namespaced by phase: `login.email`, `submission.nominee`
84
+ - `@flow` tag required at feature level
85
+ - `Background:` should only contain the starting page navigation
86
+ - Each scenario = one phase of the journey
@@ -6,7 +6,7 @@ agent: 'agent'
6
6
  tools: [vscode, execute, read, agent, edit, search, web, browser, todo, 'playwright/*']
7
7
  ---
8
8
 
9
- **Input**: Screen name (e.g., `/sungen-create-test admin-users`).
9
+ **Input**: Screen or flow name (e.g., `/sungen-create-test admin-users`).
10
10
 
11
11
  ## Role
12
12
 
@@ -14,13 +14,16 @@ You are a **Senior QA Engineer**. You structure test cases by viewpoint categori
14
14
 
15
15
  ## Parameters
16
16
 
17
- - **screen** — ${input:screen:screen name (e.g., login, dashboard)}
17
+ - **name** — ${input:name:screen or flow name (e.g., login, award-submission)}
18
+
19
+ **Auto-detect context**: check if `qa/flows/<name>/` exists → flow mode (base path: `qa/flows/<name>/`). Else check `qa/screens/<name>/` → screen mode (base path: `qa/screens/<name>/`).
18
20
 
19
21
  ## Steps
20
22
 
21
- 1. Verify `qa/screens/${input:screen}/` exists. If not → run `/sungen-add-screen` first.
23
+ 1. **Flow**: Verify `qa/flows/${input:name}/` exists. If not → `/sungen-add-flow` first.
24
+ **Screen**: Verify `qa/screens/${input:name}/` exists. If not → `/sungen-add-screen` first.
22
25
  2. Check if `.feature` already has scenarios. If yes → summarize existing coverage and ask: **1) Add new sections**, **2) Add viewpoints to existing sections**, or **3) Replace all**. See `sungen-tc-generation` skill for update mode details.
23
- 3. **Read requirements & resolve visual source** — check `qa/screens/${input:screen}/requirements/`:
26
+ 3. **Read requirements & resolve visual source** — check `<base>/${input:name}/requirements/`:
24
27
  - If `spec.md` exists → read it as PRIMARY source (sections, fields, validation rules, business rules, states).
25
28
  - If `test-viewpoint.md` exists → read it. If it only contains HTML comments (scaffold template), ask:
26
29
  - **1) Fill test-viewpoint.md first** — identify edge cases, known issues, and design decisions before generating tests
@@ -30,7 +33,7 @@ You are a **Senior QA Engineer**. You structure test cases by viewpoint categori
30
33
  1. If `spec_figma.md` exists → read it as Figma supplement (PAT flow already completed during `add-screen`). Do NOT call any `mcp__figma__*` tool.
31
34
  2. If `ui/` has images (`.png`, `.jpg`, etc.) → read them for visual context (layout, element positions, states).
32
35
  3. If neither exists → ask: *"No visual source found. Pick one:"*
33
- - **1) Figma PAT** — ask for URL, run `sungen add --screen ${input:screen} --figma '<url>'`, then invoke `sungen-figma-source` skill
36
+ - **1) Figma PAT** — ask for URL, run `sungen add --screen ${input:name} --figma '<url>'`, then invoke `sungen-figma-source` skill
34
37
  - **2) Figma MCP** — invoke `sungen-capture-figma` skill
35
38
  - **3) Live page scan** — invoke `sungen-capture-live` skill
36
39
  - **4) Skip** — generate from spec.md only
@@ -39,13 +42,13 @@ You are a **Senior QA Engineer**. You structure test cases by viewpoint categori
39
42
 
40
43
  Summarize what you found in requirements and present to the user.
41
44
 
42
- 4. Identify screen sections ask user which to focus on (per `sungen-tc-generation` skill). When requirements exist, use the "Requirements-Driven Generation" strategy. Present sections as a numbered list and let user pick.
43
- 5. Generate or update `.feature` + `test-data.yaml` following `sungen-gherkin-syntax` and `sungen-tc-generation` skills.
45
+ 4. Follow the `sungen-tc-generation` skill for section identification, viewpoint generation, and output format. **For flows**, use the "Flow Test Generation" section in the skill. When requirements exist, use the "Requirements-Driven Generation" strategy. Present sections as a numbered list and let user pick.
46
+ 5. Generate or update `.feature` + `test-data.yaml` following `sungen-gherkin-syntax` and `sungen-tc-generation` skills. **For flows**: use `[Screen:Element]` namespace format, namespace test-data by phase, add `@flow` tag.
44
47
  6. Show summary and offer next steps:
45
48
 
46
- - **`/sungen-review ${input:screen}`** — Review syntax, coverage, viewpoint quality (Recommended)
47
- - **`/sungen-run-test ${input:screen}`** — Skip review, generate selectors and run tests now
48
- - **`/sungen-create-test ${input:screen}`** — Expand coverage: add @normal + @low scenarios
49
+ - **`/sungen-review ${input:name}`** — Review syntax, coverage, viewpoint quality (Recommended)
50
+ - **`/sungen-run-test ${input:name}`** — Skip review, generate selectors and run tests now
51
+ - **`/sungen-create-test ${input:name}`** — Expand coverage: add @normal + @low scenarios
49
52
  - **Done for now** — I'll come back later
50
53
 
51
54
  **No selectors.yaml** — selectors are generated during `/sungen-run-test`.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: sungen-delivery
3
3
  description: 'Export Gherkin scenarios + Playwright results to CSV test case file for QA delivery.'
4
- argument-hint: "[screen-name...] (omit for all screens)"
4
+ argument-hint: "[name...] (omit for all screens and flows)"
5
5
  tools: [read, execute, edit, vscode/askQuestions]
6
6
  ---
7
7
 
@@ -11,9 +11,9 @@ You are a **QA Test Delivery Engineer**. Your job is to invoke the deterministic
11
11
 
12
12
  ## Parameters
13
13
 
14
- Parse **screens** from `$ARGUMENTS`:
15
- - If empty → CLI will process **all** screens in `qa/screens/`
16
- - If provided → pass them through to the CLI
14
+ Parse **names** from `$ARGUMENTS`:
15
+ - If empty → CLI will process **all** screens in `qa/screens/` and flows in `qa/flows/`
16
+ - If provided → pass them through to the CLI (auto-detects screen vs flow per name)
17
17
 
18
18
  ## Steps
19
19
 
@@ -22,28 +22,29 @@ Parse **screens** from `$ARGUMENTS`:
22
22
  Run via Bash (single command, no extra parsing):
23
23
 
24
24
  ```bash
25
- npx sungen delivery <screens>
25
+ npx sungen delivery <names>
26
26
  ```
27
27
 
28
- - If no screen args → just run `npx sungen delivery`
29
- - If screen args → pass them as positional arguments
28
+ - If no args → just run `npx sungen delivery` (exports all screens + flows)
29
+ - If args → pass them as positional arguments (auto-detects screen vs flow)
30
30
 
31
31
  The CLI handles:
32
- - Scope detection (all screens vs specific)
32
+ - Scope detection (all screens + flows vs specific names)
33
+ - Auto-detect: `qa/flows/<name>/` → flow, `qa/screens/<name>/` → screen
33
34
  - Pre-flight source checks with colorful output
34
35
  - Parsing `.feature`, `.spec.ts`, `test-data.yaml`, `test-results/results.json`
35
- - Generating CSV at `qa/deliverables/<screen>-testcases.csv`
36
+ - Generating CSV at `qa/deliverables/<name>-testcases.csv`
36
37
  - Printing summary table
37
38
 
38
39
  ### 2. Handle pre-flight failures (if CLI exits non-zero)
39
40
 
40
- If the CLI exits with blocking issues, it will have already printed a clear table showing exactly what's missing per screen.
41
+ If the CLI exits with blocking issues, it will have already printed a clear table showing exactly what's missing per target.
41
42
 
42
43
  Use `AskUserQuestion` to offer next steps:
43
44
 
44
45
  **Options:**
45
46
  - **Fix missing sources** (Recommended) — Print the suggested commands from CLI output and stop. User will run those commands manually, then re-invoke `/sungen:delivery`.
46
- - **Continue with available screens** — Re-run as `npx sungen delivery <screens> --continue-on-missing` to skip screens with blocking issues.
47
+ - **Continue with available targets** — Re-run as `npx sungen delivery <names> --continue-on-missing` to skip targets with blocking issues.
47
48
  - **Cancel** — Exit.
48
49
 
49
50
  ### 3. Show summary + offer next steps (on success)
@@ -51,8 +52,8 @@ Use `AskUserQuestion` to offer next steps:
51
52
  Forward the CLI's summary table to the user verbatim. Then use `AskUserQuestion`:
52
53
 
53
54
  - **Open a specific CSV** — Help user inspect one of the exported files with Read tool.
54
- - **Run tests to refresh results** — Suggest `/sungen:run-test <screen>` to update `test-results/results.json`, then re-run delivery.
55
- - **Export another screen** — User can run `/sungen:delivery <other-screen>`.
55
+ - **Run tests to refresh results** — Suggest `/sungen-run-test <name>` to update test results, then re-run delivery.
56
+ - **Export another target** — User can run `/sungen-delivery <other-name>`.
56
57
  - **Done** — Exit.
57
58
 
58
59
  ## Important notes
@@ -65,7 +66,7 @@ Forward the CLI's summary table to the user verbatim. Then use `AskUserQuestion`
65
66
  ## CLI Reference
66
67
 
67
68
  ```
68
- sungen delivery [screens...]
69
+ sungen delivery [names...]
69
70
  [--skip-preflight] Skip pre-flight checks (not recommended)
70
- [--continue-on-missing] Skip screens with blocking misses
71
+ [--continue-on-missing] Skip targets with blocking misses
71
72
  ```
@@ -6,7 +6,7 @@ agent: 'agent'
6
6
  tools: [vscode, read, edit, search, todo]
7
7
  ---
8
8
 
9
- **Input**: Screen name (e.g., `/sungen-review admin-users`).
9
+ **Input**: Screen or flow name (e.g., `/sungen-review admin-users`).
10
10
 
11
11
  ## Role
12
12
 
@@ -14,17 +14,19 @@ You are a **Senior QA Reviewer**. You evaluate Gherkin test cases using the `sun
14
14
 
15
15
  ## Parameters
16
16
 
17
- - **screen** — ${input:screen:screen name (e.g., login, dashboard)}
17
+ - **name** — ${input:name:screen or flow name (e.g., login, award-submission)}
18
+
19
+ **Auto-detect context**: check if `qa/flows/<name>/` exists → flow mode (base path: `qa/flows/<name>/`). Else check `qa/screens/<name>/` → screen mode (base path: `qa/screens/<name>/`).
18
20
 
19
21
  ## Steps
20
22
 
21
- 1. Read `qa/screens/${input:screen}/features/${input:screen}.feature` and `qa/screens/${input:screen}/test-data/${input:screen}.yaml`. If missing → `/sungen-create-test` first.
22
- 2. Follow the `sungen-tc-review` skill — score 3 dimensions: Syntax (30pts), Coverage (40pts), Viewpoint (30pts). Use `sungen-viewpoint` for pattern checklists.
23
- 3. **Unverified Selectors check** — if `qa/screens/${input:screen}/selectors/${input:screen}.yaml` exists, count lines matching `@needs-live-verify`. Include in the review report as a non-scoring metric (see `sungen-tc-review` skill for report format). Does NOT affect the 60% threshold.
23
+ 1. Read `<base>/<name>/features/<name>.feature` and `<base>/<name>/test-data/<name>.yaml`. If missing → `/sungen-create-test` first.
24
+ 2. Follow the `sungen-tc-review` skill — score 3 dimensions: Syntax (30pts), Coverage (40pts), Viewpoint (30pts). **For flows**, also apply the "Flow Review Additions" section. Use `sungen-viewpoint` for pattern checklists.
25
+ 3. **Unverified Selectors check** — if `<base>/<name>/selectors/<name>.yaml` exists, count lines matching `@needs-live-verify`. Include in the review report as a non-scoring metric. Does NOT affect the 60% threshold.
24
26
  4. Output review report per `sungen-tc-review` format. **>= 60%**: PASS. **< 60%**: FAIL with recommendations.
25
27
  5. If FAIL and user confirms → update test cases following `sungen-gherkin-syntax` and `sungen-tc-generation` skills, then re-review.
26
28
  6. After PASS (or user decides to proceed), offer next steps:
27
29
 
28
- - **`/sungen-run-test ${input:screen}`** — Generate selectors, compile, and run tests (Recommended)
29
- - **`/sungen-create-test ${input:screen}`** — Add more test cases before running
30
+ - **`/sungen-run-test ${input:name}`** — Generate selectors, compile, and run tests (Recommended)
31
+ - **`/sungen-create-test ${input:name}`** — Add more test cases before running
30
32
  - **Done for now** — I'll come back later
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: sungen-run-test
3
3
  description: 'Generate selectors + auth state via Playwright MCP, compile, and run Playwright tests — auto-fixes selectors on failure'
4
- argument-hint: '[screen-name]'
4
+ argument-hint: '[name]'
5
5
  tools: [read, execute, edit, vscode/askQuestions, playwright/*]
6
6
  ---
7
7
 
@@ -11,11 +11,13 @@ You are a **Senior Developer**. Use `sungen-selector-fix`, `sungen-selector-keys
11
11
 
12
12
  ## Parameters
13
13
 
14
- Parse **screen** from `$ARGUMENTS`. If missing, ask the user.
14
+ Parse **name** from `$ARGUMENTS`. If missing, ask the user.
15
+
16
+ **Auto-detect context**: check if `qa/flows/<name>/` exists → flow mode (base path: `qa/flows/<name>/`). Else check `qa/screens/<name>/` → screen mode (base path: `qa/screens/<name>/`).
15
17
 
16
18
  ## Pre-run (phased — per `sungen-selector-fix` skill)
17
19
 
18
- 1. Verify `qa/screens/<screen>/` has `.feature` + `test-data.yaml`.
20
+ 1. Verify `<base>/<name>/` has `.feature` + `test-data.yaml`.
19
21
  2. **Phase 0 — Selector Pre-gen**: if `selectors.yaml` is missing/empty or doesn't cover the feature file's `[Reference]`s, apply the following decision tree before running Phase 0 from `sungen-selector-fix`:
20
22
 
21
23
  ```
@@ -29,14 +31,14 @@ Parse **screen** from `$ARGUMENTS`. If missing, ask the user.
29
31
  2. Apply selector heuristics from sungen-figma-source skill (testid > role+name > placeholder > label > locator > text)
30
32
  3. Write selectors.yaml — every provisional entry gets this comment on the line above:
31
33
  # @needs-live-verify source=figma node_id=<id>
32
- 4. Compile: sungen generate --screen <screen> — must succeed
34
+ 4. Compile: Screen: sungen generate --screen <name>. Flow: sungen generate --flow <name> — must succeed
33
35
  5. Phase 1 smoke check runs; tests using unverified selectors may fail
34
36
  → auto-fix triggers on next run-test invocation when a live page is available
35
37
  NO → hard stop: print the following message and stop:
36
38
  "Cannot generate selectors: no live page URL and no spec_figma.md found.
37
39
  Options:
38
40
  • Provide the live URL so Playwright MCP can snapshot the page, OR
39
- • Run: sungen add --screen <screen> --figma <figma-url> to generate spec_figma.md first"
41
+ • Run: sungen add --screen <name> --figma <figma-url> to generate spec_figma.md first"
40
42
  ```
41
43
 
42
44
  **Auto-fix on subsequent runs**: when `run-test` is invoked again with a reachable live page, Phase 0 compares the DOM snapshot against existing `selectors.yaml` entries. Entries tagged `# @needs-live-verify` are treated as candidates — if the actual selector differs, the entry is replaced and the comment removed (entry becomes verified). Entries that already match are also promoted to verified (comment removed).
@@ -50,7 +52,7 @@ Parse **screen** from `$ARGUMENTS`. If missing, ask the user.
50
52
  name: "Submit"
51
53
  ```
52
54
  3. **Phase 0.5 — Auth Persistence**: if the feature has `@auth:<role>` tags and `specs/.auth/<role>.json` is missing/expired, run Phase 0.5 from `sungen-selector-fix` — user logs in manually in MCP browser → `browser_storage_state` → `specs/.auth/<role>.json`. Offer `sungen makeauth <role>` as CLI fallback only if `browser_storage_state` isn't available in this MCP version.
53
- 4. Compile: `sungen generate --screen <screen>` (default: runtime data loading from YAML). Use `--inline-data` only if user requests compile-time hardcoded values.
55
+ 4. Compile: **Screen**: `sungen generate --screen <name>`. **Flow**: `sungen generate --flow <name>`. Default: runtime data loading from YAML. Use `--inline-data` only if user requests compile-time hardcoded values.
54
56
 
55
57
  ## Run & Fix (phased — per `sungen-selector-fix` skill)
56
58
 
@@ -61,25 +63,27 @@ Parse **screen** from `$ARGUMENTS`. If missing, ask the user.
61
63
 
62
64
  ## Playwright command guidelines
63
65
 
64
- **Per-screen JSON results** — each run must write its JSON report to a dedicated path co-located with the `.spec.ts`, so `sungen delivery` can read the correct results per screen:
66
+ **Per-screen/flow JSON results** — each run must write its JSON report to a dedicated path co-located with the `.spec.ts`, so `sungen delivery` can read the correct results:
65
67
 
66
68
  ```bash
67
- # ✅ Correct — per-screen output file via env var
68
- PLAYWRIGHT_JSON_OUTPUT_NAME=specs/generated/<screen>/<screen>-test-result.json \
69
- npx playwright test specs/generated/<screen>/<screen>.spec.ts
70
- ```
69
+ # ✅ Screen
70
+ PLAYWRIGHT_JSON_OUTPUT_NAME=specs/generated/<name>/<name>-test-result.json \
71
+ npx playwright test specs/generated/<name>/<name>.spec.ts
71
72
 
72
- Output: `specs/generated/<screen>/<screen>-test-result.json`
73
+ # ✅ Flow
74
+ PLAYWRIGHT_JSON_OUTPUT_NAME=specs/generated/flows/<name>/<name>-test-result.json \
75
+ npx playwright test specs/generated/flows/<name>/<name>.spec.ts
76
+ ```
73
77
 
74
78
  **DO NOT** pass `--reporter=...` flag — it overrides the reporters from `playwright.config.ts` and disables the JSON reporter that `sungen delivery` depends on.
75
79
 
76
80
  ```bash
77
81
  # ❌ Wrong — --reporter flag disables the config's JSON reporter
78
- npx playwright test specs/generated/<screen>/<screen>.spec.ts --reporter=list
82
+ npx playwright test specs/generated/<name>/<name>.spec.ts --reporter=list
79
83
 
80
84
  # ❌ Wrong — no env var → writes to default test-results/results.json
81
85
  # (overwritten on every screen run, loses per-screen tracking)
82
- npx playwright test specs/generated/<screen>/<screen>.spec.ts
86
+ npx playwright test specs/generated/<name>/<name>.spec.ts
83
87
  ```
84
88
 
85
89
  If you want to filter scenarios, use `-g "<pattern>"` instead of a reporter override.
@@ -91,10 +95,10 @@ If you want to filter scenarios, use `-g "<pattern>"` instead of a reporter over
91
95
  After showing results, use `AskUserQuestion` to offer next steps:
92
96
 
93
97
  If all tests **passed**:
94
- - **`/sungen:create-test <screen>`** — Add more test cases (Recommended)
98
+ - **`/sungen-create-test <name>`** — Add more test cases (Recommended)
95
99
  - **Done** — All tests passed, I'm finished
96
100
 
97
101
  If tests **failed** (after retries):
98
- - **`/sungen:run-test <screen>`** — Re-run after manual fixes
99
- - **`/sungen:create-test <screen>`** — Revise test cases
102
+ - **`/sungen-run-test <name>`** — Re-run after manual fixes
103
+ - **`/sungen-create-test <name>`** — Revise test cases
100
104
  - **Done for now** — I'll fix manually later