@sun-asterisk/sungen 2.5.2 → 2.6.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.
- package/dist/cli/commands/add-flow.d.ts +3 -0
- package/dist/cli/commands/add-flow.d.ts.map +1 -0
- package/dist/cli/commands/add-flow.js +27 -0
- package/dist/cli/commands/add-flow.js.map +1 -0
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +95 -60
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +38 -6
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/index.js +3 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts +1 -0
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts +1 -0
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/imports.hbs +2 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-accept-action.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-dismiss-action.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-fill-action.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/alert-text-assertion.hbs +2 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +1 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -1
- package/dist/generators/test-generator/code-generator.d.ts +1 -0
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +30 -12
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/step-mapper.d.ts +4 -0
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +7 -0
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts +1 -0
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +1 -1
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/generators/test-generator/utils/data-resolver.d.ts +3 -20
- package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/data-resolver.js +23 -66
- package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +2 -6
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +18 -80
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
- package/dist/orchestrator/ai-rules-updater.js +4 -0
- package/dist/orchestrator/ai-rules-updater.js.map +1 -1
- package/dist/orchestrator/flow-manager.d.ts +22 -0
- package/dist/orchestrator/flow-manager.d.ts.map +1 -0
- package/dist/orchestrator/flow-manager.js +251 -0
- package/dist/orchestrator/flow-manager.js.map +1 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +1 -0
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-flow.md +88 -0
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +11 -8
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-review.md +8 -6
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +15 -11
- package/dist/orchestrator/templates/ai-instructions/claude-config.md +41 -10
- package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +12 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-delivery.md +19 -18
- package/dist/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md +12 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +52 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +31 -3
- package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +45 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +69 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +30 -0
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-flow.md +86 -0
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +13 -10
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-delivery.md +16 -15
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-review.md +9 -7
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +21 -17
- package/dist/orchestrator/templates/ai-instructions/copilot-config.md +40 -9
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +12 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +19 -18
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-error-mapping.md +12 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +52 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +31 -3
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +45 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +70 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +30 -0
- package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -1
- package/dist/orchestrator/templates/playwright.config.js +3 -1
- package/dist/orchestrator/templates/playwright.config.js.map +1 -1
- package/dist/orchestrator/templates/playwright.config.ts +4 -1
- package/dist/orchestrator/templates/specs-base.d.ts.map +1 -1
- package/dist/orchestrator/templates/specs-base.js +11 -56
- package/dist/orchestrator/templates/specs-base.js.map +1 -1
- package/dist/orchestrator/templates/specs-base.ts +11 -61
- package/dist/orchestrator/templates/specs-test-data.d.ts +3 -1
- package/dist/orchestrator/templates/specs-test-data.d.ts.map +1 -1
- package/dist/orchestrator/templates/specs-test-data.js +10 -2
- package/dist/orchestrator/templates/specs-test-data.js.map +1 -1
- package/dist/orchestrator/templates/specs-test-data.ts +9 -2
- package/package.json +1 -1
- package/src/cli/commands/add-flow.ts +25 -0
- package/src/cli/commands/delivery.ts +109 -58
- package/src/cli/commands/generate.ts +43 -6
- package/src/cli/index.ts +3 -1
- package/src/generators/test-generator/adapters/adapter-interface.ts +1 -1
- package/src/generators/test-generator/adapters/playwright/playwright-adapter.ts +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/imports.hbs +2 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-accept-action.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-dismiss-action.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-fill-action.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/alert-text-assertion.hbs +2 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +1 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -1
- package/src/generators/test-generator/code-generator.ts +32 -14
- package/src/generators/test-generator/step-mapper.ts +8 -0
- package/src/generators/test-generator/template-engine.ts +2 -2
- package/src/generators/test-generator/utils/data-resolver.ts +25 -77
- package/src/generators/test-generator/utils/selector-resolver.ts +23 -109
- package/src/orchestrator/ai-rules-updater.ts +5 -0
- package/src/orchestrator/flow-manager.ts +243 -0
- package/src/orchestrator/project-initializer.ts +1 -0
- package/src/orchestrator/templates/ai-instructions/claude-cmd-add-flow.md +88 -0
- package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +11 -8
- package/src/orchestrator/templates/ai-instructions/claude-cmd-review.md +8 -6
- package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +15 -11
- package/src/orchestrator/templates/ai-instructions/claude-config.md +41 -10
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +12 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-delivery.md +19 -18
- package/src/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md +12 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +52 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +31 -3
- package/src/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +45 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +69 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +30 -0
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-flow.md +86 -0
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +13 -10
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-delivery.md +16 -15
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-review.md +9 -7
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +21 -17
- package/src/orchestrator/templates/ai-instructions/copilot-config.md +40 -9
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +12 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +19 -18
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-error-mapping.md +12 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +52 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +31 -3
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +45 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +70 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +30 -0
- package/src/orchestrator/templates/playwright.config.ts +4 -1
- package/src/orchestrator/templates/specs-base.ts +11 -61
- package/src/orchestrator/templates/specs-test-data.ts +9 -2
- package/dist/utils/feature-finder.d.ts +0 -9
- package/dist/utils/feature-finder.d.ts.map +0 -1
- package/dist/utils/feature-finder.js +0 -67
- package/dist/utils/feature-finder.js.map +0 -1
- package/dist/utils/screen-paths.d.ts +0 -10
- package/dist/utils/screen-paths.d.ts.map +0 -1
- package/dist/utils/screen-paths.js +0 -73
- package/dist/utils/screen-paths.js.map +0 -1
- package/dist/utils/selector-loader.d.ts +0 -6
- package/dist/utils/selector-loader.d.ts.map +0 -1
- package/dist/utils/selector-loader.js +0 -20
- package/dist/utils/selector-loader.js.map +0 -1
- package/dist/utils/test-data-loader.d.ts +0 -6
- package/dist/utils/test-data-loader.d.ts.map +0 -1
- package/dist/utils/test-data-loader.js +0 -20
- package/dist/utils/test-data-loader.js.map +0 -1
- package/src/utils/feature-finder.ts +0 -33
- package/src/utils/screen-paths.ts +0 -37
- package/src/utils/selector-loader.ts +0 -23
- package/src/utils/test-data-loader.ts +0 -23
|
@@ -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
|
-
- **
|
|
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
|
|
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
|
|
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:
|
|
29
|
-
- **`/sungen-create-test ${input:
|
|
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: '[
|
|
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 **
|
|
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
|
|
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 <
|
|
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 <
|
|
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 <
|
|
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
|
|
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
|
-
# ✅
|
|
68
|
-
PLAYWRIGHT_JSON_OUTPUT_NAME=specs/generated/<
|
|
69
|
-
npx playwright test specs/generated/<
|
|
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
|
-
|
|
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/<
|
|
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/<
|
|
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
|
|
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
|
|
99
|
-
- **`/sungen
|
|
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
|
|
@@ -21,22 +21,28 @@ You generate 3 files for sungen — a Gherkin compiler that produces Playwright
|
|
|
21
21
|
| `sungen-capture-live` | Capture a live running page via Playwright MCP (snapshot + screenshot) |
|
|
22
22
|
| `sungen-figma-source` | Figma URL → spec_figma.md + ui/*.png + provisional selectors |
|
|
23
23
|
|
|
24
|
-
## Workflow (
|
|
24
|
+
## Workflow (6 AI commands)
|
|
25
25
|
|
|
26
26
|
| Command | What it does |
|
|
27
27
|
|---|---|
|
|
28
28
|
| `/sungen-add-screen <name> <path>` | Scaffold `qa/screens/<name>/` directories |
|
|
29
|
-
| `/sungen-
|
|
30
|
-
| `/sungen-
|
|
31
|
-
| `/sungen-
|
|
29
|
+
| `/sungen-add-flow <name> [--path <url>]` | Scaffold `qa/flows/<name>/` directories for E2E cross-screen testing |
|
|
30
|
+
| `/sungen-create-test <name>` | Generate `.feature` + `test-data.yaml` (auto-detects screen or flow) |
|
|
31
|
+
| `/sungen-review <name>` | Score syntax, coverage, viewpoint quality (auto-detects screen or flow) |
|
|
32
|
+
| `/sungen-run-test <name>` | Generate `selectors.yaml`, compile, run, auto-fix (auto-detects screen or flow) |
|
|
32
33
|
| `/sungen-delivery [name...]` | Export test cases → CSV for QA delivery (all screens if no arg) |
|
|
33
34
|
|
|
34
|
-
**
|
|
35
|
+
**Screen path:** add-screen → create-test → review → run-test → delivery.
|
|
36
|
+
**Flow path:** add-flow → create-test → review → run-test → delivery.
|
|
37
|
+
|
|
38
|
+
`create-test`, `review`, and `run-test` auto-detect context: if `qa/flows/<name>/` exists → flow mode, else `qa/screens/<name>/` → screen mode.
|
|
35
39
|
|
|
36
40
|
After each command completes, present the next actions as selectable options. Never just print text — always give clickable choices so the user can continue the workflow seamlessly.
|
|
37
41
|
|
|
38
42
|
## File Structure
|
|
39
43
|
|
|
44
|
+
### Screen (single-screen testing)
|
|
45
|
+
|
|
40
46
|
```
|
|
41
47
|
qa/screens/<screen-name>/
|
|
42
48
|
├── features/<screen>.feature # Gherkin scenarios
|
|
@@ -47,9 +53,27 @@ qa/screens/<screen-name>/
|
|
|
47
53
|
└── requirements/
|
|
48
54
|
├── spec.md # Screen specification (primary source)
|
|
49
55
|
└── ui/ # Screenshots, mockups
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Flow (E2E cross-screen testing)
|
|
50
59
|
|
|
51
|
-
|
|
52
|
-
qa/
|
|
60
|
+
```
|
|
61
|
+
qa/flows/<flow-name>/
|
|
62
|
+
├── features/<flow>.feature # Gherkin with @flow tag, [Screen:Element] refs
|
|
63
|
+
├── selectors/<flow>.yaml # Namespaced keys: "login:submit", "awards:title"
|
|
64
|
+
├── test-data/<flow>.yaml # Namespaced data: login.email, submission.nominee
|
|
65
|
+
├── test-data/<flow>.staging.yaml # Environment override (optional)
|
|
66
|
+
├── test-data/<flow>.production.yaml # Environment override (optional)
|
|
67
|
+
└── requirements/
|
|
68
|
+
├── spec.md # Flow specification (screens, steps, transitions)
|
|
69
|
+
└── ui/ # Screenshots, mockups
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Flows are **independent** from screens — own selectors, own test-data. Selectors use colon-namespaced keys (`"login:submit":`) to avoid duplicate element names across screens.
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
qa/deliverables/<name>-testcases.csv # Exported test cases (from /sungen-delivery)
|
|
76
|
+
qa/deliverables/<name>-testcases.xlsx # Styled workbook for client hand-off
|
|
53
77
|
```
|
|
54
78
|
|
|
55
79
|
## Test Data
|
|
@@ -61,11 +85,18 @@ qa/deliverables/<screen>-testcases.xlsx # Styled workbook for client hand-off
|
|
|
61
85
|
## CLI Commands
|
|
62
86
|
|
|
63
87
|
```bash
|
|
88
|
+
# Screen
|
|
64
89
|
sungen add --screen <name> --path <url-path> # Scaffold screen directories
|
|
65
90
|
sungen add --screen <name> --path <path> --feature <name> # Scaffold with sub-feature
|
|
66
91
|
sungen generate --screen <name> # Compile .feature → .spec.ts (runtime data)
|
|
67
92
|
sungen generate --screen <name> --inline-data # Compile with hardcoded data (legacy)
|
|
68
|
-
|
|
93
|
+
|
|
94
|
+
# Flow
|
|
95
|
+
sungen add-flow --flow <name> --path <start-url> # Scaffold flow directories
|
|
96
|
+
sungen generate --flow <name> # Compile flow .feature → .spec.ts
|
|
97
|
+
|
|
98
|
+
# All
|
|
99
|
+
sungen generate --all # Compile all screens and flows
|
|
69
100
|
sungen delivery # Export all screens → CSV + XLSX
|
|
70
|
-
sungen delivery <
|
|
101
|
+
sungen delivery <name> # Export a single screen or flow
|
|
71
102
|
```
|
|
@@ -61,6 +61,18 @@ Where `<timestamp>` is `YYYYMMDD-HHMM` in local time (e.g. `live-20260421-1430.p
|
|
|
61
61
|
|
|
62
62
|
This gives users a visual record they can reference later without re-scanning.
|
|
63
63
|
|
|
64
|
+
### 6a. Verify unauthenticated redirect target (flow capture only)
|
|
65
|
+
|
|
66
|
+
When capturing for a **flow** that includes security scenarios (e.g., "unauthenticated user cannot access X"):
|
|
67
|
+
|
|
68
|
+
1. Open a **fresh incognito/unauthenticated** browser context (no storage state).
|
|
69
|
+
2. `browser_navigate` to the protected route (e.g., `/dashboard`).
|
|
70
|
+
3. Record the **actual redirect URL** — do NOT assume it goes to `/login`. The app may redirect to `/register`, `/`, or any other route.
|
|
71
|
+
4. Report the redirect target to the caller: *"Unauthenticated access to `/dashboard` redirects to `/register`"*.
|
|
72
|
+
5. The caller must use the **actual redirect URL** in Gherkin assertions (e.g., `Then User is on [Register] page`), never an assumed one.
|
|
73
|
+
|
|
74
|
+
Skip this step if the flow has no security scenarios or the user explicitly says to skip.
|
|
75
|
+
|
|
64
76
|
### 6. Detect discrepancies vs spec
|
|
65
77
|
|
|
66
78
|
If `spec.md` exists, briefly cross-check the snapshot against spec sections:
|
|
@@ -6,7 +6,7 @@ user-invocable: false
|
|
|
6
6
|
|
|
7
7
|
## Purpose
|
|
8
8
|
|
|
9
|
-
Export test cases from Sungen screens to a standardized CSV file (format BM-2-901-13) for QA delivery.
|
|
9
|
+
Export test cases from Sungen screens and flows to a standardized CSV file (format BM-2-901-13) for QA delivery.
|
|
10
10
|
|
|
11
11
|
**This skill delegates all heavy work to the `sungen delivery` CLI.** The CLI is the single source of truth for parsing logic — do NOT re-parse files in AI. Your role is only to:
|
|
12
12
|
|
|
@@ -19,18 +19,19 @@ Export test cases from Sungen screens to a standardized CSV file (format BM-2-90
|
|
|
19
19
|
## Architecture
|
|
20
20
|
|
|
21
21
|
```
|
|
22
|
-
User → /sungen:delivery [
|
|
22
|
+
User → /sungen:delivery [name...]
|
|
23
23
|
│
|
|
24
24
|
▼
|
|
25
25
|
sungen delivery CLI (deterministic — no AI tokens)
|
|
26
|
-
├─ Scope detection (no-arg = all screens)
|
|
27
|
-
├─
|
|
26
|
+
├─ Scope detection (no-arg = all screens + flows)
|
|
27
|
+
├─ Auto-detect: qa/flows/<name>/ → flow, qa/screens/<name>/ → screen
|
|
28
|
+
├─ Pre-flight source checks per target
|
|
28
29
|
├─ Parse .feature (metadata)
|
|
29
30
|
├─ Parse .spec.ts (resolved Playwright code — source of truth)
|
|
30
31
|
├─ Parse test-data.yaml (resolve {{vars}})
|
|
31
32
|
├─ Parse test-results/results.json (match test titles)
|
|
32
33
|
├─ Merge sources + generate CSV rows
|
|
33
|
-
└─ Write qa/deliverables/<
|
|
34
|
+
└─ Write qa/deliverables/<name>-testcases.csv
|
|
34
35
|
```
|
|
35
36
|
|
|
36
37
|
Source modules: `src/exporters/*.ts`
|
|
@@ -39,18 +40,18 @@ Source modules: `src/exporters/*.ts`
|
|
|
39
40
|
|
|
40
41
|
## Required sources (CLI pre-flight checks these)
|
|
41
42
|
|
|
42
|
-
| # | Source |
|
|
43
|
-
|
|
44
|
-
| 1 | Feature file | `qa/screens/<
|
|
45
|
-
| 2 | Test data | `qa/screens/<
|
|
46
|
-
| 3 | Selectors | `qa/screens/<
|
|
47
|
-
| 4 | Compiled spec | `specs/generated/<
|
|
48
|
-
| 5 | Test results | `specs/generated/<
|
|
43
|
+
| # | Source | Screen path | Flow path | Created by |
|
|
44
|
+
|---|--------|-------------|-----------|------------|
|
|
45
|
+
| 1 | Feature file | `qa/screens/<name>/features/<name>.feature` | `qa/flows/<name>/features/<name>.feature` | `add-screen`/`add-flow` + `create-test` |
|
|
46
|
+
| 2 | Test data | `qa/screens/<name>/test-data/<name>.yaml` | `qa/flows/<name>/test-data/<name>.yaml` | `create-test` |
|
|
47
|
+
| 3 | Selectors | `qa/screens/<name>/selectors/<name>.yaml` | `qa/flows/<name>/selectors/<name>.yaml` | `run-test` |
|
|
48
|
+
| 4 | Compiled spec | `specs/generated/<name>/<name>.spec.ts` | `specs/generated/flows/<name>/<name>.spec.ts` | `sungen generate` |
|
|
49
|
+
| 5 | Test results | `specs/generated/<name>/<name>-test-result.json` or `test-results/results.json` | `specs/generated/flows/<name>/<name>-test-result.json` or global fallback | `run-test` |
|
|
49
50
|
|
|
50
51
|
**Sources 1-4 are blocking** — CLI aborts if any is missing.
|
|
51
52
|
**Source 5 is optional** — CSV is still generated but Test Result/Date/Executor/Env columns are empty (all tests show as Pending).
|
|
52
53
|
|
|
53
|
-
The CLI reads the **per-
|
|
54
|
+
The CLI reads the **per-target result file first** (co-located with `.spec.ts`), then falls back to the global `test-results/results.json`. Per-target is preferred because the global file gets OVERWRITTEN each time Playwright runs, losing results from earlier targets.
|
|
54
55
|
|
|
55
56
|
---
|
|
56
57
|
|
|
@@ -87,17 +88,17 @@ The CLI reads the **per-screen result file first** (co-located with `.spec.ts`),
|
|
|
87
88
|
## CLI command reference
|
|
88
89
|
|
|
89
90
|
```bash
|
|
90
|
-
# Export all screens
|
|
91
|
+
# Export all screens and flows
|
|
91
92
|
sungen delivery
|
|
92
93
|
|
|
93
|
-
# Export specific
|
|
94
|
-
sungen delivery kudos awards
|
|
94
|
+
# Export specific targets (auto-detects screen vs flow)
|
|
95
|
+
sungen delivery kudos awards nomination-flow
|
|
95
96
|
|
|
96
97
|
# Skip pre-flight (CI only)
|
|
97
98
|
sungen delivery --skip-preflight
|
|
98
99
|
|
|
99
|
-
# Skip
|
|
100
|
+
# Skip targets with blocking misses
|
|
100
101
|
sungen delivery --continue-on-missing
|
|
101
102
|
```
|
|
102
103
|
|
|
103
|
-
Output: `qa/deliverables/<
|
|
104
|
+
Output: `qa/deliverables/<name>-testcases.csv` (UTF-8 with BOM)
|
|
@@ -101,6 +101,18 @@ If `toHaveText` fails on an input → the Gherkin step has wrong target type. Fi
|
|
|
101
101
|
|
|
102
102
|
---
|
|
103
103
|
|
|
104
|
+
## Flow-Specific Errors
|
|
105
|
+
|
|
106
|
+
| Error | Diagnosis | Fix |
|
|
107
|
+
|---|---|---|
|
|
108
|
+
| Navigation timeout between screens | Cross-screen transition takes too long or URL mismatch | Add explicit `wait for page` step between screen transitions in `.feature`. Verify target URL path |
|
|
109
|
+
| Selector `"screen:element"` not found | Namespace key missing or wrong format | Ensure colon-namespaced key in `selectors.yaml` is **quoted**: `"login:submit":`. Check screen prefix matches `[Screen:Element]` ref in Gherkin |
|
|
110
|
+
| Test data `screen.key` undefined | Phase namespace mismatch | Verify `test-data.yaml` uses dot-namespaced keys: `login.email`, `submission.nominee`. Keys must match `{{screen.key}}` refs in `.feature` |
|
|
111
|
+
| State lost between screens | Auth/session expired during multi-screen flow | Ensure all screens in the flow share the same `@auth:role` tag. Check if the app invalidates sessions on navigation |
|
|
112
|
+
| Duplicate selector key across screens | Two screens use same element name without namespace | Always use `[Screen:Element]` format in flow `.feature`. Selectors must use `"screen:element":` quoted keys |
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
104
116
|
## Performance & Infrastructure Errors → Fix in `specs/base.ts`
|
|
105
117
|
|
|
106
118
|
All generated `.spec.ts` import from `specs/base.ts` — shared context caching, navigation, overlay cleanup. AI **can and should** tune `base.ts` to match the project.
|
|
@@ -160,6 +160,57 @@ Options: `nth` `exact` `scope` `match` `variant` `frame` `contenteditable` `colu
|
|
|
160
160
|
| `@afterEach` | Hook: runs after each test → `test.afterEach()` (custom cleanup) |
|
|
161
161
|
| `@afterAll` | Hook: runs once after all tests → `test.afterAll()` |
|
|
162
162
|
|
|
163
|
+
### `@flow` tag (E2E cross-screen testing)
|
|
164
|
+
|
|
165
|
+
`@flow` marks a feature as a **flow** — an E2E journey spanning multiple screens. Flows live in `qa/flows/<name>/` with their own selectors, test-data, and requirements.
|
|
166
|
+
|
|
167
|
+
**Key differences from screen tests:**
|
|
168
|
+
|
|
169
|
+
| Aspect | Screen (`qa/screens/`) | Flow (`qa/flows/`) |
|
|
170
|
+
|---|---|---|
|
|
171
|
+
| Scope | Single page | Multiple pages |
|
|
172
|
+
| Selectors | `[Element]` → own YAML | `[Screen:Element]` → own YAML (namespaced) |
|
|
173
|
+
| Test data | `{{variable}}` | `{{phase.variable}}` (namespaced by phase) |
|
|
174
|
+
| Tag | `@auto` / `@smoke` etc. | `@flow` (required at feature level) |
|
|
175
|
+
|
|
176
|
+
**Selector namespace format:** `[Screen:Element]` where colon separates screen prefix from element name. The YAML key is `"screen:element"` (quoted, lowercase).
|
|
177
|
+
|
|
178
|
+
```gherkin
|
|
179
|
+
# Feature file
|
|
180
|
+
When User fill [Login:Email] field with {{login.email}}
|
|
181
|
+
And User click [Login:Submit] button
|
|
182
|
+
Then User see [Dashboard] page
|
|
183
|
+
When User click [Dashboard:Awards] link
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
```yaml
|
|
187
|
+
# selectors.yaml — keys are namespaced, quoted due to colon
|
|
188
|
+
"login:email":
|
|
189
|
+
type: 'testid'
|
|
190
|
+
value: 'email-input'
|
|
191
|
+
|
|
192
|
+
"login:submit":
|
|
193
|
+
type: 'role'
|
|
194
|
+
value: 'button'
|
|
195
|
+
name: 'Login'
|
|
196
|
+
|
|
197
|
+
dashboard:
|
|
198
|
+
type: 'page'
|
|
199
|
+
value: '/dashboard'
|
|
200
|
+
|
|
201
|
+
"dashboard:awards":
|
|
202
|
+
type: 'role'
|
|
203
|
+
value: 'link'
|
|
204
|
+
name: 'Awards'
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Flow structure:**
|
|
208
|
+
- `Background:` — set starting page only (e.g., `Given User is on [Login] page`)
|
|
209
|
+
- Each `Scenario:` — one phase/step of the flow (login, navigate, submit, etc.)
|
|
210
|
+
- Page navigation between scenarios uses `[Screen] page` references
|
|
211
|
+
|
|
212
|
+
**CLI:** `sungen add-flow --flow <name>`, `sungen generate --flow <name>`, `sungen generate --all` (includes flows)
|
|
213
|
+
|
|
163
214
|
### @extend behavior
|
|
164
215
|
|
|
165
216
|
- Tool executes **only Given→When** of `@steps` scenario (skips Then)
|
|
@@ -185,6 +236,7 @@ Options: `nth` `exact` `scope` `match` `variant` `frame` `contenteditable` `colu
|
|
|
185
236
|
| Missing target type | `fill [email] with {{v}}` | `fill [email] field with {{v}}` |
|
|
186
237
|
| Background with scope | `Background: ... And User is on [X] dialog` | Use `@steps` + `@extend` for scope-dependent flows |
|
|
187
238
|
| `is on` after When | `When ... And User is on [X] dialog` | `And User see [X] dialog` or separate Given |
|
|
239
|
+
| Literal URL navigate | `User navigate to "/dashboard"` | `User is on [Dashboard] page` (add page selector in `selectors.yaml`) |
|
|
188
240
|
|
|
189
241
|
## Background vs @steps/@extend
|
|
190
242
|
|
|
@@ -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**: *"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. **
|
|
43
|
-
8. **
|
|
44
|
-
9. **
|
|
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
|
|
|
@@ -265,6 +288,7 @@ Array.from(document.querySelectorAll('[data-testid]'))
|
|
|
265
288
|
Common fixes:
|
|
266
289
|
- Name mismatch → copy exact name from snapshot
|
|
267
290
|
- Multiple matches → add `nth` or `exact: true`
|
|
291
|
+
- Substring ambiguity (e.g., `"Submit"` matches `"Submit"` and `"Submit & Continue"`) → add `exact: true`
|
|
268
292
|
- No accessible name → use `testid` or `locator` (CSS)
|
|
269
293
|
- Element in iframe → add `frame` field
|
|
270
294
|
- Dynamic content → use `testid` or structural `role` + `nth`
|
|
@@ -273,7 +297,11 @@ Common fixes:
|
|
|
273
297
|
|
|
274
298
|
Always recompile before re-running:
|
|
275
299
|
```bash
|
|
300
|
+
# Screen
|
|
276
301
|
sungen generate --screen <screen>
|
|
302
|
+
|
|
303
|
+
# Flow
|
|
304
|
+
sungen generate --flow <flow>
|
|
277
305
|
```
|
|
278
306
|
|
|
279
307
|
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:
|
|
@@ -251,3 +251,73 @@ valid_password: StagingPass456
|
|
|
251
251
|
```
|
|
252
252
|
|
|
253
253
|
**Do NOT generate**: `selectors.yaml` (created during run-test), Playwright code (sungen compiles).
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Flow Test Generation
|
|
258
|
+
|
|
259
|
+
When generating tests for a **flow** (`qa/flows/<name>/`), adapt the strategy:
|
|
260
|
+
|
|
261
|
+
### Structure
|
|
262
|
+
|
|
263
|
+
- **Background** — starting page only: `Given User is on [Login] page`
|
|
264
|
+
- **Scenarios** — each phase of the E2E journey as a separate scenario
|
|
265
|
+
- **Selector refs** — use `[Screen:Element]` namespace format (see `sungen-gherkin-syntax`)
|
|
266
|
+
- **Test data** — namespace by phase: `login.email`, `submission.nominee`
|
|
267
|
+
- **Feature tag** — `@flow` required at feature level
|
|
268
|
+
|
|
269
|
+
### Flow vs Screen Differences
|
|
270
|
+
|
|
271
|
+
| Aspect | Screen | Flow |
|
|
272
|
+
|---|---|---|
|
|
273
|
+
| Section focus | UI patterns per section | Journey phases across screens |
|
|
274
|
+
| Viewpoints | VP-UI, VP-VAL, VP-LOGIC, VP-SEC per section | VP-LOGIC (flow transitions), VP-SEC (auth persistence), VP-VAL (cross-screen data) |
|
|
275
|
+
| Tier 1 focus | Happy path + required validation per section | Happy path through entire flow + auth + key error recovery |
|
|
276
|
+
| Background | Navigate to screen | Navigate to starting page |
|
|
277
|
+
|
|
278
|
+
### Flow-specific scenarios to generate
|
|
279
|
+
|
|
280
|
+
| Category | Examples |
|
|
281
|
+
|---|---|
|
|
282
|
+
| **Happy path** | Complete flow end-to-end with valid data |
|
|
283
|
+
| **Auth persistence** | Auth state maintained across screen transitions |
|
|
284
|
+
| **Error recovery** | Invalid input mid-flow → fix → continue |
|
|
285
|
+
| **Incomplete flow** | User abandons at each phase → state cleanup |
|
|
286
|
+
| **Cross-screen data** | Data entered on screen A visible on screen B |
|
|
287
|
+
|
|
288
|
+
### Output Format (Flow)
|
|
289
|
+
|
|
290
|
+
```gherkin
|
|
291
|
+
@flow @auth:user
|
|
292
|
+
Feature: Award Submission Flow
|
|
293
|
+
|
|
294
|
+
Background:
|
|
295
|
+
Given User is on [Login] page
|
|
296
|
+
|
|
297
|
+
@critical
|
|
298
|
+
Scenario: User login successfully
|
|
299
|
+
When User fill [Login:Email] field with {{login.email}}
|
|
300
|
+
And User fill [Login:Password] field with {{login.password}}
|
|
301
|
+
And User click [Login:Submit] button
|
|
302
|
+
Then User see [Dashboard] page
|
|
303
|
+
|
|
304
|
+
@critical
|
|
305
|
+
Scenario: User navigates to awards and submits
|
|
306
|
+
Given User is on [Awards] page
|
|
307
|
+
When User fill [Awards:Nominee] field with {{submission.nominee}}
|
|
308
|
+
And User fill [Awards:Reason] field with {{submission.reason}}
|
|
309
|
+
And User click [Awards:Submit] button
|
|
310
|
+
Then User see [Awards:Success Message] text with {{submission.success_message}}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
```yaml
|
|
314
|
+
# test-data — namespaced by phase
|
|
315
|
+
login:
|
|
316
|
+
email: "user@example.com"
|
|
317
|
+
password: "Password123"
|
|
318
|
+
|
|
319
|
+
submission:
|
|
320
|
+
nominee: "John Doe"
|
|
321
|
+
reason: "Outstanding contribution to the team"
|
|
322
|
+
success_message: "Award submitted successfully"
|
|
323
|
+
```
|
|
@@ -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
|
## Unverified Selectors metric
|
|
93
123
|
|
|
94
124
|
**When to check**: if `qa/screens/<screen>/selectors/<screen>.yaml` exists, count lines matching the pattern `@needs-live-verify`.
|