@sun-asterisk/sungen 2.4.2 → 2.4.3
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.js +2 -2
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +27 -4
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
- package/dist/orchestrator/ai-rules-updater.js +2 -0
- package/dist/orchestrator/ai-rules-updater.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +4 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +20 -3
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts +8 -0
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +120 -0
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +6 -14
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +10 -2
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-review.md +5 -0
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +21 -13
- package/dist/orchestrator/templates/ai-instructions/claude-config.md +4 -97
- package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +48 -122
- package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +87 -23
- package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +62 -34
- package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +19 -14
- package/dist/orchestrator/templates/ai-instructions/claude-skill-test-design-techniques.md +99 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-viewpoint.md +151 -64
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +5 -10
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +10 -3
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-review.md +5 -0
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +21 -13
- package/dist/orchestrator/templates/ai-instructions/copilot-config.md +4 -97
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +48 -122
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +87 -23
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +63 -29
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +19 -14
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-test-design-techniques.md +99 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint.md +151 -64
- package/dist/orchestrator/templates/readme.md +1 -1
- package/dist/orchestrator/templates/tsconfig.json +21 -0
- package/package.json +1 -1
- package/src/cli/commands/add.ts +2 -2
- package/src/cli/index.ts +1 -1
- package/src/generators/test-generator/code-generator.ts +29 -4
- package/src/orchestrator/ai-rules-updater.ts +2 -0
- package/src/orchestrator/project-initializer.ts +24 -3
- package/src/orchestrator/screen-manager.ts +124 -0
- package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +6 -14
- package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +10 -2
- package/src/orchestrator/templates/ai-instructions/claude-cmd-review.md +5 -0
- package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +21 -13
- package/src/orchestrator/templates/ai-instructions/claude-config.md +4 -97
- package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +48 -122
- package/src/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +87 -23
- package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +62 -34
- package/src/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +19 -14
- package/src/orchestrator/templates/ai-instructions/claude-skill-test-design-techniques.md +99 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-viewpoint.md +151 -64
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +5 -10
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +10 -3
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-review.md +5 -0
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +21 -13
- package/src/orchestrator/templates/ai-instructions/copilot-config.md +4 -97
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +48 -122
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +87 -23
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +63 -29
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +19 -14
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-test-design-techniques.md +99 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint.md +151 -64
- package/src/orchestrator/templates/readme.md +1 -1
- package/src/orchestrator/templates/tsconfig.json +21 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sungen-test-design-techniques
|
|
3
|
+
description: 'Test design techniques (EP, BVA, Decision Table, State Transition) for systematic scenario generation from spec constraints. Auto-loaded by create-test command.'
|
|
4
|
+
user-invocable: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## When to Apply
|
|
8
|
+
|
|
9
|
+
| Technique | Apply when spec mentions |
|
|
10
|
+
|---|---|
|
|
11
|
+
| EP (Equivalence Partitioning) | Input types, categories, roles, valid/invalid ranges |
|
|
12
|
+
| BVA (Boundary Value Analysis) | Numeric range, string length, date range, count limit |
|
|
13
|
+
| Decision Table | 2+ mutually dependent conditions with different outcomes |
|
|
14
|
+
| State Transition | Entity lifecycle, workflow states, status changes |
|
|
15
|
+
|
|
16
|
+
**Rule:** These techniques determine **how many** and **which** scenarios to generate. `sungen-viewpoint` determines **which viewpoints** to cover.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. Equivalence Partitioning (EP)
|
|
21
|
+
|
|
22
|
+
**Goal:** One representative per input class. If one value in a partition passes, all values in that partition pass.
|
|
23
|
+
|
|
24
|
+
**How to apply:**
|
|
25
|
+
1. Extract partitions from `spec.md` constraints (e.g., field accepts 1-100)
|
|
26
|
+
2. Valid class: 1 <= value <= 100
|
|
27
|
+
3. Invalid class (below): value < 1
|
|
28
|
+
4. Invalid class (above): value > 100
|
|
29
|
+
5. Write **one** scenario per class
|
|
30
|
+
|
|
31
|
+
**Anti-pattern:**
|
|
32
|
+
```gherkin
|
|
33
|
+
# BAD — 3 scenarios, same class, same result:
|
|
34
|
+
Scenario: VP-VAL-001 Enter value 10
|
|
35
|
+
Scenario: VP-VAL-002 Enter value 50
|
|
36
|
+
Scenario: VP-VAL-003 Enter value 80
|
|
37
|
+
```
|
|
38
|
+
```gherkin
|
|
39
|
+
# GOOD — one representative per class:
|
|
40
|
+
Scenario: VP-VAL-001 Valid range value is accepted # value = 50
|
|
41
|
+
Scenario: VP-VAL-002 Below minimum is rejected # value = 0
|
|
42
|
+
Scenario: VP-VAL-003 Above maximum is rejected # value = 101
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 2. Boundary Value Analysis (BVA)
|
|
48
|
+
|
|
49
|
+
**Goal:** Test exact edges where off-by-one errors occur (`>` vs `>=`, `<` vs `<=`).
|
|
50
|
+
|
|
51
|
+
### Two modes
|
|
52
|
+
|
|
53
|
+
| Mode | Values | Use when |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| **Compact (default)** | `min-1`, `min`, `max`, `max+1` | Most fields |
|
|
56
|
+
| **Full 6-point** | `min-1`, `min`, `min+1`, `max-1`, `max`, `max+1` | Critical fields with `@critical`/`@high` priority |
|
|
57
|
+
|
|
58
|
+
**How to apply** (example: "quantity must be 1-10"):
|
|
59
|
+
- `min-1` = 0 -> invalid
|
|
60
|
+
- `min` = 1 -> valid (lower boundary)
|
|
61
|
+
- `max` = 10 -> valid (upper boundary)
|
|
62
|
+
- `max+1` = 11 -> invalid
|
|
63
|
+
- Midpoint (e.g., 5) already covered by EP valid class
|
|
64
|
+
|
|
65
|
+
**BVA scenarios** (example: quantity 1-10):
|
|
66
|
+
- `@high VP-VAL-010 Below minimum (0) is rejected`
|
|
67
|
+
- `@high VP-VAL-011 Minimum boundary (1) is accepted`
|
|
68
|
+
- `@high VP-VAL-012 Maximum boundary (10) is accepted`
|
|
69
|
+
- `@high VP-VAL-013 Above maximum (11) is rejected`
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 3. Decision Table
|
|
74
|
+
|
|
75
|
+
**Goal:** Cover all condition combinations when 2+ conditions constrain each other.
|
|
76
|
+
|
|
77
|
+
**How to apply:** List conditions from `spec.md` → build combination→outcome table → one scenario per row.
|
|
78
|
+
|
|
79
|
+
**Cap:** When >3 boolean conditions (>8 rows), prioritize rows with **distinct outcomes** and add `@manual` for exhaustive combos.
|
|
80
|
+
|
|
81
|
+
**Example** — Submit requires valid form AND permission → 4 combos, 2 distinct outcomes:
|
|
82
|
+
- `@normal` Form invalid + no permission → disabled
|
|
83
|
+
- `@normal` Form valid + no permission → disabled
|
|
84
|
+
- `@normal` Has permission + form invalid → disabled
|
|
85
|
+
- `@critical` Form valid + has permission → succeeds
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 4. State Transition
|
|
90
|
+
|
|
91
|
+
**Goal:** Verify every valid transition AND block invalid ones.
|
|
92
|
+
|
|
93
|
+
**How to apply:** Extract state diagram from `spec.md` → one scenario per valid transition + key invalid transitions.
|
|
94
|
+
|
|
95
|
+
**Example** — Order lifecycle (Draft→Pending→Approved→Completed):
|
|
96
|
+
- `@high` Valid: Draft → Pending, Pending → Approved, Approved → Completed
|
|
97
|
+
- `@normal` Invalid: Completed → Draft (blocked), Pending → Completed (skip approval)
|
|
98
|
+
|
|
99
|
+
**test-data:** Use named state keys (`order_in_draft`, `order_in_pending`).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sungen-viewpoint
|
|
3
|
-
description: '
|
|
3
|
+
description: '10 UI patterns x 4 viewpoints — structured checklist for test case generation and review. Auto-loaded by create-test and review commands.'
|
|
4
4
|
user-invocable: false
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -13,148 +13,234 @@ user-invocable: false
|
|
|
13
13
|
| **Logic** | Business rules, interactions, state changes | VP-LOGIC |
|
|
14
14
|
| **Security** | Auth, injection, permissions | VP-SEC |
|
|
15
15
|
|
|
16
|
+
## Shared Checks (apply across all patterns)
|
|
17
|
+
|
|
18
|
+
These appear in multiple patterns — test once per screen, not per pattern:
|
|
19
|
+
|
|
20
|
+
| Check | ER |
|
|
21
|
+
|---|---|
|
|
22
|
+
| **Loading State** | Spinner/skeleton shown, UI interaction locked during fetch |
|
|
23
|
+
| **Empty State** | Clear message when no data, layout intact |
|
|
24
|
+
| **XSS/Injection** | Malicious input sanitized to plain text, never executed |
|
|
25
|
+
| **URL Manipulation** | Invalid URL params fallback to defaults, no server crash |
|
|
26
|
+
|
|
16
27
|
---
|
|
17
28
|
|
|
18
|
-
## 1
|
|
29
|
+
## GROUP 1: DATA ENTRY
|
|
30
|
+
|
|
31
|
+
### 1. Form & Inputs
|
|
19
32
|
|
|
20
33
|
**UI/UX**
|
|
21
|
-
- Field States: disabled/readonly fields
|
|
22
|
-
- Button States: Submit disabled when invalid, enabled when valid
|
|
23
|
-
-
|
|
24
|
-
- Keyboard Navigation: Tab order correct, Enter submits form
|
|
34
|
+
- Field States: disabled/readonly fields dimmed and locked, no interaction allowed
|
|
35
|
+
- Button States: Submit disabled when form invalid, auto-enabled when valid
|
|
36
|
+
- Keyboard Nav: Tab order correct, Enter submits form
|
|
25
37
|
|
|
26
38
|
**Data & Validate**
|
|
27
|
-
-
|
|
28
|
-
- Boundaries &
|
|
29
|
-
- Whitespace:
|
|
30
|
-
- Error
|
|
39
|
+
- Required/Optional: blank required field shows error; optional allows blank
|
|
40
|
+
- Boundaries & Format: min/max length, format (email, number) with error messages
|
|
41
|
+
- Whitespace: auto-trim or reject spaces-only input
|
|
42
|
+
- Error Recovery: error at correct field, disappears immediately when user corrects data
|
|
31
43
|
|
|
32
44
|
**Logic**
|
|
33
|
-
- Dependencies: Field A value determines Field B status/
|
|
34
|
-
-
|
|
35
|
-
- Success Flow: redirect / success toast / reset
|
|
45
|
+
- Field Dependencies: Field A value determines Field B status/options
|
|
46
|
+
- Double Submit Prevention: button disabled after first click, only 1 request sent
|
|
47
|
+
- Success Flow: redirect / success toast / form reset
|
|
36
48
|
- Failure Flow: server error retains form data + shows system error
|
|
37
49
|
|
|
38
50
|
**Security**
|
|
39
|
-
-
|
|
51
|
+
- → Shared: XSS/Injection
|
|
40
52
|
|
|
41
53
|
---
|
|
42
54
|
|
|
43
|
-
## 2
|
|
55
|
+
## GROUP 2: DATA MANAGEMENT
|
|
56
|
+
|
|
57
|
+
### 2. Data Table
|
|
44
58
|
|
|
45
59
|
**UI/UX**
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
- Layout & Truncation: long content truncated with tooltip, column width stable
|
|
60
|
+
- → Shared: Empty State, Loading State
|
|
61
|
+
- Truncation: long content shows `...` with tooltip on hover, column width stable
|
|
49
62
|
- Sticky Elements: fixed header on vertical scroll, fixed action column on horizontal scroll
|
|
50
63
|
|
|
51
64
|
**Data & Validate**
|
|
52
|
-
-
|
|
53
|
-
- Row Limit: displayed rows never exceed page size
|
|
54
|
-
- Cell Integrity: cell data matches database, correct format (date, currency, status)
|
|
55
|
-
- **Use `table match data:` with inline DataTable** for multi-row content verification (filter-based, resilient to data changes)
|
|
56
|
-
- Use row scope (`row in [Table] table with {{v}}` + `column with {{v}}`) for single-row detail checks or when you need actions on a row
|
|
65
|
+
- Record Count: "Total records" on UI matches server data exactly
|
|
66
|
+
- Row Limit: displayed rows never exceed configured page size
|
|
67
|
+
- Cell Integrity: cell data matches database, correct format (date, currency, status label)
|
|
57
68
|
|
|
58
69
|
**Logic**
|
|
59
|
-
- Sorting: column sort refreshes
|
|
70
|
+
- Sorting: column sort refreshes table with correct order, updates header icon
|
|
60
71
|
- Row Actions: Edit/Delete/View buttons act on correct row ID
|
|
61
72
|
|
|
62
73
|
**Security**
|
|
63
|
-
-
|
|
64
|
-
-
|
|
74
|
+
- RBAC: hide sensitive columns or privileged action buttons without authority
|
|
75
|
+
- → Shared: XSS/Injection (data from DB displayed safely)
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### 3. Create / Add
|
|
80
|
+
|
|
81
|
+
**UI/UX**
|
|
82
|
+
- Blank Slate: all fields empty or BA-specified defaults, NO cache from previous operation
|
|
83
|
+
- Required Indicator: required fields marked with visual cue (e.g., red *)
|
|
84
|
+
- Unsaved Changes: navigate away with dirty form → browser/system warning popup
|
|
85
|
+
|
|
86
|
+
**Data & Validate**
|
|
87
|
+
- → Inherited: all Form & Inputs validation rules apply
|
|
88
|
+
- Unique Constraint: duplicate unique field (e.g., Employee ID) → reject save, inline error
|
|
89
|
+
- Data Dependency: selecting parent field loads correct child options
|
|
90
|
+
|
|
91
|
+
**Logic**
|
|
92
|
+
- Save & Close: toast notification, redirect to list, new record visible per sort rule
|
|
93
|
+
- Save & Add Another: save to DB, form resets to blank for next entry
|
|
94
|
+
- Double Submit Prevention: → same as Form & Inputs
|
|
95
|
+
- Cancel: form closes, NO garbage record in DB, next open shows blank form
|
|
96
|
+
|
|
97
|
+
**Security**
|
|
98
|
+
- API Bypass / 403: unauthorized POST → system blocks (403 Forbidden), no record created
|
|
99
|
+
- → Shared: XSS/Injection (persisted safely, not executed on display)
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### 4. Update / Edit
|
|
104
|
+
|
|
105
|
+
**UI/UX**
|
|
106
|
+
- Pre-fill / Data Binding: all fields display exact current DB data (text, dropdown, radio, date...)
|
|
107
|
+
- Readonly Fields: identity fields (ID, username, employee code) disabled, no interaction
|
|
108
|
+
- Cancel: no data changed in DB; if dirty → unsaved changes warning
|
|
109
|
+
|
|
110
|
+
**Data & Validate**
|
|
111
|
+
- → Inherited: all Form & Inputs validation rules apply
|
|
112
|
+
- Unique Self: saving without changing unique field → success, no self-duplicate error
|
|
113
|
+
- Unique Conflict: changing unique field to existing value → duplicate error, block save
|
|
114
|
+
- Unchanged Submit: Save disabled until dirty, or success without DB UPDATE
|
|
115
|
+
|
|
116
|
+
**Logic**
|
|
117
|
+
- Update Success: toast "Updated successfully", new data reflects on UI immediately without reload
|
|
118
|
+
- Concurrent Edit: another user already edited → conflict warning, require reload
|
|
119
|
+
|
|
120
|
+
**Security**
|
|
121
|
+
- Authorization / 403: access edit without permission → 403 page
|
|
122
|
+
- Not Found / 404: edit deleted object → 404
|
|
65
123
|
|
|
66
124
|
---
|
|
67
125
|
|
|
68
|
-
|
|
126
|
+
### 5. Delete
|
|
69
127
|
|
|
70
128
|
**UI/UX**
|
|
71
|
-
-
|
|
72
|
-
-
|
|
129
|
+
- Confirmation: click Delete → MUST show confirmation dialog, delete button in warning color
|
|
130
|
+
- Cancel: popup closes, record intact on UI and DB, no API called
|
|
131
|
+
- Success Update: toast "Deleted successfully", record disappears immediately without reload
|
|
132
|
+
- Pagination Fallback: delete only record on current page → auto-navigate to previous page
|
|
133
|
+
|
|
134
|
+
**Data & Validate — Dependencies**
|
|
135
|
+
- Independent: delete succeeds normally
|
|
136
|
+
- Referenced (Restrict): delete parent with children → blocked, clear error "in use at [Module]"
|
|
137
|
+
- Referenced (Cascade): warning first, then deletes parent AND all related children
|
|
138
|
+
- Referenced (Set Null): parent deleted, child reference set to Unassigned/Empty
|
|
139
|
+
|
|
140
|
+
**Logic — Storage**
|
|
141
|
+
- Soft Delete: record hidden from UI, DB retains with status flag (is_deleted, deleted_at)
|
|
142
|
+
- Hard Delete: record removed from UI AND permanently deleted from DB
|
|
143
|
+
|
|
144
|
+
**Security**
|
|
145
|
+
- Deleted Access / 404: soft or hard delete → direct URL/API returns 404
|
|
146
|
+
- API Bypass: API delete on restricted object → backend rejects with business error, no 500
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
### 6. Search
|
|
151
|
+
|
|
152
|
+
**UI/UX**
|
|
153
|
+
- → Shared: Empty State ("No results found"), Loading State
|
|
73
154
|
- Clear Action: search box empties, list reloads default data
|
|
74
155
|
|
|
75
156
|
**Data & Validate**
|
|
76
|
-
-
|
|
77
|
-
- Input Limits: prevent
|
|
78
|
-
- Normalization: case-insensitive
|
|
157
|
+
- Whitespace: auto-trim, results match cleaned keyword
|
|
158
|
+
- Input Limits: prevent beyond max length or show error
|
|
159
|
+
- Normalization: case-insensitive, handles accented characters correctly
|
|
79
160
|
|
|
80
161
|
**Logic**
|
|
81
|
-
- Matching: partial/exact match returns correct results, no 500
|
|
82
|
-
- Multi-keyword: results based on AND/OR logic
|
|
83
|
-
-
|
|
162
|
+
- Matching: partial/exact match returns correct results, no 500
|
|
163
|
+
- Multi-keyword: results based on AND/OR logic per spec
|
|
164
|
+
- Debounce: ~300ms delay before API call
|
|
84
165
|
|
|
85
166
|
**Security**
|
|
86
|
-
-
|
|
87
|
-
- Wildcards:
|
|
167
|
+
- → Shared: XSS/Injection
|
|
168
|
+
- Wildcards: `%`, `_`, `*` treated as literal text (escaped), not DB commands
|
|
88
169
|
|
|
89
170
|
---
|
|
90
171
|
|
|
91
|
-
|
|
172
|
+
### 7. Filter
|
|
92
173
|
|
|
93
174
|
**UI/UX**
|
|
94
175
|
- Feedback: selected filters displayed as tags/badges
|
|
95
176
|
- Persistence: collapse/expand retains selected values
|
|
96
|
-
- Conflicts: conflicting conditions show "No data" message,
|
|
177
|
+
- Conflicts: conflicting conditions show "No data" message, layout intact
|
|
97
178
|
|
|
98
179
|
**Data & Validate**
|
|
99
|
-
- Range Validation: start > end or min > max
|
|
180
|
+
- Range Validation: start > end or min > max → field error, Apply disabled
|
|
100
181
|
- Dropdown Integrity: options match 100% of actual data, hide unauthorized values
|
|
101
182
|
|
|
102
183
|
**Logic**
|
|
103
|
-
-
|
|
184
|
+
- AND/OR Logic: results satisfy correct filter logic, total count updated
|
|
104
185
|
- Dependent Filters: selecting Filter A updates Filter B options
|
|
105
|
-
- Reset & Navigation: reset returns original data or preserves state
|
|
186
|
+
- Reset & Navigation: reset returns original data or preserves state per spec
|
|
106
187
|
|
|
107
188
|
**Security**
|
|
108
|
-
-
|
|
189
|
+
- → Shared: URL Manipulation
|
|
109
190
|
|
|
110
191
|
---
|
|
111
192
|
|
|
112
|
-
|
|
193
|
+
### 8. Pagination
|
|
113
194
|
|
|
114
195
|
**UI/UX**
|
|
115
196
|
- Boundary States: Previous/First disabled on page 1, Next/Last disabled on last page
|
|
116
|
-
- Active
|
|
117
|
-
- Hidden
|
|
197
|
+
- Active Page: highlighted, loading effect during page transition
|
|
198
|
+
- Hidden: pagination bar hidden when data fits one page
|
|
118
199
|
|
|
119
200
|
**Data & Validate**
|
|
120
|
-
- Label Consistency: "Viewing X of Y" matches actual data
|
|
201
|
+
- Label Consistency: "Viewing X of Y" matches actual data exactly
|
|
121
202
|
- Zero Records: pagination hidden, empty state displayed
|
|
122
203
|
|
|
123
204
|
**Logic**
|
|
124
205
|
- Navigation: loads correct dataset for page (page 2, limit 10 = records 11-20)
|
|
125
206
|
- Change Page Size: shows correct quantity, resets to page 1
|
|
126
207
|
- Interaction Resets: new search/filter resets to page 1
|
|
127
|
-
- Delete Fallback: deleting all records on last page pushes to previous page
|
|
128
208
|
|
|
129
209
|
**Security**
|
|
130
|
-
-
|
|
210
|
+
- → Shared: URL Manipulation
|
|
131
211
|
|
|
132
212
|
---
|
|
133
213
|
|
|
134
|
-
##
|
|
214
|
+
## GROUP 3: NAVIGATION & CONTAINERS
|
|
215
|
+
|
|
216
|
+
### 9. Modal / Dialog
|
|
135
217
|
|
|
136
218
|
**UI/UX**
|
|
137
|
-
- Overlay
|
|
219
|
+
- Overlay: centered modal, backdrop blur, background scroll locked
|
|
138
220
|
- Focus Trapping: Tab key cycles only within modal elements
|
|
139
221
|
- Responsive: modal resizes, action buttons always visible or scrollable
|
|
140
222
|
|
|
141
223
|
**Data & Validate**
|
|
142
|
-
- Dismiss Actions: close via X, Cancel, Escape, backdrop click
|
|
224
|
+
- Dismiss Actions: close via X, Cancel, Escape, backdrop click → resets data to default on reopen
|
|
143
225
|
|
|
144
226
|
**Logic**
|
|
145
|
-
-
|
|
146
|
-
- Failure: modal stays open
|
|
227
|
+
- Submit Success: action button shows loading, modal closes, background data updated
|
|
228
|
+
- Submit Failure: modal stays open, shows error message, retains entered data
|
|
147
229
|
- Stacked Modals: Modal B over A has higher z-index, closing B keeps A intact
|
|
148
230
|
|
|
149
231
|
**Security**
|
|
150
|
-
-
|
|
232
|
+
- DOM Cleanup: remove HTML from DOM on close to protect sensitive data
|
|
233
|
+
- Reload: handles deep linking if present
|
|
151
234
|
|
|
152
235
|
---
|
|
153
236
|
|
|
154
|
-
##
|
|
237
|
+
## GROUP 4: DISPLAY PATTERNS
|
|
238
|
+
|
|
239
|
+
### 10. List / Card
|
|
155
240
|
|
|
156
241
|
**UI/UX**
|
|
157
|
-
-
|
|
242
|
+
- → Shared: Empty State, Loading State
|
|
243
|
+
- Hover Effect: shadow/scale on card hover
|
|
158
244
|
- Content: text truncation without breaking card height, placeholder image on broken image
|
|
159
245
|
|
|
160
246
|
**Data & Validate**
|
|
@@ -164,25 +250,26 @@ user-invocable: false
|
|
|
164
250
|
**Logic**
|
|
165
251
|
- Navigation: clicking card navigates to correct detail page
|
|
166
252
|
- Direct Actions: Like/Add to Cart updates immediately without reloading list
|
|
167
|
-
-
|
|
253
|
+
- Infinite Scroll / Load More: appends records, maintains scroll position
|
|
168
254
|
- Layout Toggle: Grid/List view switch changes UI but preserves data
|
|
169
255
|
|
|
170
256
|
**Security**
|
|
171
|
-
- RBAC
|
|
257
|
+
- RBAC: hide sensitive data or privileged buttons from DOM
|
|
258
|
+
- Network Resilience: error message + "Retry" button on connection loss
|
|
172
259
|
|
|
173
260
|
---
|
|
174
261
|
|
|
175
262
|
## Security Tag Rules
|
|
176
263
|
|
|
177
|
-
For VP-SEC scenarios testing **unauthorized access** (no login, wrong role, direct URL
|
|
178
|
-
- Use **`@no-auth`** tag —
|
|
179
|
-
- Do NOT use `@manual` for these — they are automatable
|
|
264
|
+
For VP-SEC scenarios testing **unauthorized access** (no login, wrong role, direct URL):
|
|
265
|
+
- Use **`@no-auth`** tag — runs without authentication to verify redirect/block.
|
|
266
|
+
- Do NOT use `@manual` for these — they are automatable.
|
|
180
267
|
|
|
181
268
|
```gherkin
|
|
182
|
-
@no-auth
|
|
269
|
+
@critical @no-auth
|
|
183
270
|
Scenario: VP-SEC-001 Unauthenticated user cannot access admin page
|
|
184
271
|
Given User is on [Admin] page
|
|
185
272
|
Then User see [Login] page
|
|
186
273
|
```
|
|
187
274
|
|
|
188
|
-
Use `@manual` only when the environment truly cannot be set up automatically
|
|
275
|
+
Use `@manual` only when the environment truly cannot be set up automatically.
|
|
@@ -32,15 +32,10 @@ Ask the user: "Would you like to fill in `requirements/spec.md` now? This helps
|
|
|
32
32
|
- If they have UI designs (screenshots, Figma exports, mockups) → suggest copying them to `requirements/ui/`.
|
|
33
33
|
- If no → proceed to step 3.
|
|
34
34
|
|
|
35
|
-
### 3.
|
|
35
|
+
### 3. Next steps
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
Tell the user what was created and offer next steps:
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
If the user declined test case creation, tell them next steps:
|
|
44
|
-
- Fill `requirements/spec.md` with screen specs (if not done)
|
|
45
|
-
- Run `/sungen-create-test` to create test cases
|
|
46
|
-
- Run `/sungen-run-test` to generate selectors, compile, and run tests
|
|
39
|
+
- **`/sungen-create-test ${input:screen}`** — Create test cases from requirements/designs (Recommended)
|
|
40
|
+
- **Fill `requirements/spec.md`** — Write screen specs first for better test quality
|
|
41
|
+
- **Done for now** — I'll come back later
|
|
@@ -23,15 +23,22 @@ You are a **Senior QA Engineer**. You structure test cases by viewpoint categori
|
|
|
23
23
|
3. **Read requirements** — check `qa/screens/${input:screen}/requirements/`:
|
|
24
24
|
- If `spec.md` exists → read it as PRIMARY source (sections, fields, validation rules, business rules, states).
|
|
25
25
|
- If `ui/` has images → read them for visual context (layout, element positions, states).
|
|
26
|
-
- If `
|
|
26
|
+
- If `test-viewpoint.md` exists → read it. If it only contains HTML comments (scaffold template), ask:
|
|
27
|
+
- **1) Fill test-viewpoint.md first** — identify edge cases, known issues, and design decisions before generating tests
|
|
28
|
+
- **2) Continue without it** — generate tests from spec and other sources only
|
|
27
29
|
- Summarize what you found in requirements and present to the user.
|
|
28
30
|
4. **Screen input** (supplements requirements, or is primary source if no requirements):
|
|
29
31
|
- Ask: "How should I get the screen design? **1) Figma design** (provide Figma URL — recommended), **2) UI images** (screenshots/mockups in `requirements/ui/`), or **3) Live page scan** (optional, via Playwright MCP)?"
|
|
30
32
|
- Recommend Figma or UI images first. Live page scan is optional — useful to verify specs vs actual UI or capture real data.
|
|
31
|
-
- If live page
|
|
33
|
+
- If live page: `browser_navigate` → ONE `browser_snapshot`. If auth redirect → ask user to log in manually. Never use `browser_run_code` or `browser_evaluate` to inject cookies.
|
|
32
34
|
- If exploring, verify and supplement requirements — flag any discrepancies found.
|
|
33
35
|
5. 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.
|
|
34
36
|
6. Generate or update `.feature` + `test-data.yaml` following `sungen-gherkin-syntax` and `sungen-tc-generation` skills.
|
|
35
|
-
7. Show summary
|
|
37
|
+
7. Show summary and offer next steps:
|
|
38
|
+
|
|
39
|
+
- **`/sungen-review ${input:screen}`** — Review syntax, coverage, viewpoint quality (Recommended)
|
|
40
|
+
- **`/sungen-run-test ${input:screen}`** — Skip review, generate selectors and run tests now
|
|
41
|
+
- **`/sungen-create-test ${input:screen}`** — Add more test cases for another section/viewpoint
|
|
42
|
+
- **Done for now** — I'll come back later
|
|
36
43
|
|
|
37
44
|
**No selectors.yaml** — selectors are generated during `/sungen-run-test`.
|
|
@@ -22,3 +22,8 @@ You are a **Senior QA Reviewer**. You evaluate Gherkin test cases using the `sun
|
|
|
22
22
|
2. Follow the `sungen-tc-review` skill — score 3 dimensions: Syntax (30pts), Coverage (40pts), Viewpoint (30pts). Use `sungen-viewpoint` for pattern checklists.
|
|
23
23
|
3. Output review report per `sungen-tc-review` format. **>= 60%**: PASS. **< 60%**: FAIL with recommendations.
|
|
24
24
|
4. If FAIL and user confirms → update test cases following `sungen-gherkin-syntax` and `sungen-tc-generation` skills, then re-review.
|
|
25
|
+
5. After PASS (or user decides to proceed), offer next steps:
|
|
26
|
+
|
|
27
|
+
- **`/sungen-run-test ${input:screen}`** — Generate selectors, compile, and run tests (Recommended)
|
|
28
|
+
- **`/sungen-create-test ${input:screen}`** — Add more test cases before running
|
|
29
|
+
- **Done for now** — I'll come back later
|
|
@@ -16,20 +16,28 @@ You are a **Senior Developer**. Use `sungen-selector-fix`, `sungen-selector-keys
|
|
|
16
16
|
|
|
17
17
|
- **screen** — ${input:screen:screen name (e.g., login, dashboard)}
|
|
18
18
|
|
|
19
|
-
##
|
|
19
|
+
## Compile
|
|
20
20
|
|
|
21
21
|
1. Verify `qa/screens/${input:screen}/` has `.feature` + `test-data.yaml`
|
|
22
22
|
2. Ensure `selectors.yaml` has page selector. If missing, ask user for URL path
|
|
23
23
|
3. `sungen generate --screen ${input:screen}`
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
6.
|
|
30
|
-
7.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
24
|
+
|
|
25
|
+
## Run & Fix (phased — per `sungen-selector-fix` skill)
|
|
26
|
+
|
|
27
|
+
4. **Phase 1 — Smoke Check**: Run first 5 `@critical`/`@high` scenarios only. If failures → diagnose, fix fundamentals (page selector, auth, base @steps), re-run. Max 2 attempts. If still broken → ask user.
|
|
28
|
+
5. **Phase 2 — Priority Wave**: Run all `@critical` + `@high` scenarios. Fix only failures from this wave. Max 2 attempts. Shared selectors fixed here cascade to later phases.
|
|
29
|
+
6. **Phase 3 — Full Run**: Run all tests. Fix only **new** failures (elements unique to `@normal`/`@low`). Max 1 attempt. Don't loop on low-priority failures.
|
|
30
|
+
7. **Phase 4 — Regression**: One final full run. Report results. No more fix loops.
|
|
31
|
+
|
|
32
|
+
## Next steps
|
|
33
|
+
|
|
34
|
+
After showing results, offer next steps:
|
|
35
|
+
|
|
36
|
+
If all tests **passed**:
|
|
37
|
+
- **`/sungen-create-test ${input:screen}`** — Add more test cases (Recommended)
|
|
38
|
+
- **Done** — All tests passed, I'm finished
|
|
39
|
+
|
|
40
|
+
If tests **failed** (after retries):
|
|
41
|
+
- **`/sungen-run-test ${input:screen}`** — Re-run after manual fixes
|
|
42
|
+
- **`/sungen-create-test ${input:screen}`** — Revise test cases
|
|
43
|
+
- **Done for now** — I'll fix manually later
|
|
@@ -10,8 +10,9 @@ You generate 3 files for sungen — a Gherkin compiler that produces Playwright
|
|
|
10
10
|
| `sungen-gherkin-syntax` | All 70+ step patterns, selector types, YAML key rules, tags, element types |
|
|
11
11
|
| `sungen-error-mapping` | Playwright & sungen error → fix mapping |
|
|
12
12
|
| `sungen-tc-generation` | Test case generation strategy, output format |
|
|
13
|
+
| `sungen-test-design-techniques` | EP, BVA, Decision Table, State Transition — systematic scenario generation |
|
|
13
14
|
| `sungen-tc-review` | Review scoring, quality rules, checklist |
|
|
14
|
-
| `sungen-viewpoint` |
|
|
15
|
+
| `sungen-viewpoint` | 10 UI patterns x 4 viewpoints — coverage checklists |
|
|
15
16
|
| `sungen-selector-keys` | YAML key generation from `[Reference]` names, suffixes, lookup priority |
|
|
16
17
|
| `sungen-selector-fix` | Selector generation from live page, auto-fix strategy |
|
|
17
18
|
|
|
@@ -26,6 +27,8 @@ You generate 3 files for sungen — a Gherkin compiler that produces Playwright
|
|
|
26
27
|
|
|
27
28
|
**Order:** add-screen → create-test → review → run-test.
|
|
28
29
|
|
|
30
|
+
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.
|
|
31
|
+
|
|
29
32
|
## File Structure
|
|
30
33
|
|
|
31
34
|
```
|
|
@@ -38,102 +41,6 @@ qa/screens/<screen-name>/
|
|
|
38
41
|
└── ui/ # Screenshots, mockups
|
|
39
42
|
```
|
|
40
43
|
|
|
41
|
-
## Complete Example
|
|
42
|
-
|
|
43
|
-
Given a login page, here are the 3 files you generate:
|
|
44
|
-
|
|
45
|
-
**qa/screens/login/features/login.feature**
|
|
46
|
-
```gherkin
|
|
47
|
-
@no-auth
|
|
48
|
-
Feature: Login Screen
|
|
49
|
-
|
|
50
|
-
Scenario: VP-LOGIC-001 Successful login
|
|
51
|
-
Given User is on [login] page
|
|
52
|
-
When User fill [Email] field with {{email}}
|
|
53
|
-
And User fill [Password] field with {{password}}
|
|
54
|
-
And User click [Submit] button
|
|
55
|
-
Then User see [Welcome] heading with {{welcome_text}}
|
|
56
|
-
And User see [Dashboard] link
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
**qa/screens/login/selectors/login.yaml**
|
|
60
|
-
```yaml
|
|
61
|
-
login:
|
|
62
|
-
type: 'page'
|
|
63
|
-
value: '/login'
|
|
64
|
-
|
|
65
|
-
email:
|
|
66
|
-
type: 'placeholder'
|
|
67
|
-
value: 'Enter your email'
|
|
68
|
-
|
|
69
|
-
password:
|
|
70
|
-
type: 'placeholder'
|
|
71
|
-
value: 'Enter your password'
|
|
72
|
-
|
|
73
|
-
submit:
|
|
74
|
-
type: 'role'
|
|
75
|
-
value: 'button'
|
|
76
|
-
name: 'Submit'
|
|
77
|
-
|
|
78
|
-
welcome:
|
|
79
|
-
type: 'role'
|
|
80
|
-
value: 'heading'
|
|
81
|
-
name: 'Welcome'
|
|
82
|
-
|
|
83
|
-
dashboard:
|
|
84
|
-
type: 'role'
|
|
85
|
-
value: 'link'
|
|
86
|
-
name: 'Dashboard'
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**qa/screens/login/test-data/login.yaml**
|
|
90
|
-
```yaml
|
|
91
|
-
email: 'admin@example.com'
|
|
92
|
-
password: 'password123'
|
|
93
|
-
welcome_text: 'Welcome back'
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
## Critical Gherkin Rules (quick reference)
|
|
97
|
-
|
|
98
|
-
1. **NEVER write `is visible`** — `User see [T] type` already asserts visibility. Only use `is hidden` to assert absence.
|
|
99
|
-
2. **Use `@no-auth` for pre-login pages** (login, register, forgot-password). Use `@auth:role` for authenticated pages.
|
|
100
|
-
3. **Scenario names use VP prefix** — `VP-UI-001`, `VP-VAL-001`, `VP-LOGIC-001`, `VP-SEC-001`.
|
|
101
|
-
4. **Values use `{{snake_case}}`** — never hardcode data in `.feature`. All values go in `test-data.yaml`.
|
|
102
|
-
5. **Selectors are deferred** — `selectors.yaml` is generated during `/sungen-run-test` from the live page, NOT during `/sungen-create-test`.
|
|
103
|
-
6. **Every `{{variable}}` must exist in `test-data.yaml`** — missing variables cause compile failures.
|
|
104
|
-
7. **Assertion type is determined by element type** — input types (`field`, `textarea`, `search`, `dropdown`, `slider`, `date-picker`) → `toHaveValue()`. Everything else → `toHaveText()`. Wrong type = wrong assertion = test failure.
|
|
105
|
-
|
|
106
|
-
## Using Playwright MCP to explore pages
|
|
107
|
-
|
|
108
|
-
When exploring a page to generate test files:
|
|
109
|
-
1. Read `playwright.config.ts` for `baseURL`
|
|
110
|
-
2. Use `browser_navigate` to open `baseURL + /path`
|
|
111
|
-
3. Use `browser_snapshot` to see all elements
|
|
112
|
-
4. Generate the 3 files from the snapshot
|
|
113
|
-
|
|
114
|
-
### Allowed MCP tools
|
|
115
|
-
|
|
116
|
-
| Tool | Use for |
|
|
117
|
-
|---|---|
|
|
118
|
-
| `browser_navigate` | Open pages |
|
|
119
|
-
| `browser_snapshot` | Capture all accessible elements |
|
|
120
|
-
| `browser_click` | Interact with elements (open dialogs, dropdowns) |
|
|
121
|
-
| `browser_fill_form` | Fill form fields |
|
|
122
|
-
| `browser_evaluate` | **Read-only DOM queries only** (e.g., detect `data-testid` attributes) |
|
|
123
|
-
|
|
124
|
-
**NEVER use `browser_run_code`** — fails with `require is not defined`.
|
|
125
|
-
|
|
126
|
-
### Authentication via MCP
|
|
127
|
-
|
|
128
|
-
1. `browser_navigate` to `baseURL`
|
|
129
|
-
2. If redirected to login, ask the user to log in manually:
|
|
130
|
-
> "This page requires login. Please log in using the browser. Confirm when you're done."
|
|
131
|
-
3. Once confirmed, `browser_navigate` to the target page and take `browser_snapshot`
|
|
132
|
-
|
|
133
|
-
**Never use `sungen makeauth`.** Always let the user log in manually via the MCP browser.
|
|
134
|
-
**NEVER use `browser_evaluate` to inject cookies or localStorage** — causes size limit issues and server 500 errors. Use `browser_evaluate` ONLY for read-only DOM queries.
|
|
135
|
-
**Minimize navigations** — take one snapshot per page, do not navigate repeatedly.
|
|
136
|
-
|
|
137
44
|
## CLI Commands
|
|
138
45
|
|
|
139
46
|
```bash
|