@sun-asterisk/sungen 2.4.2 → 2.4.5

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 (73) hide show
  1. package/dist/cli/commands/add.d.ts.map +1 -1
  2. package/dist/cli/commands/add.js +7 -1
  3. package/dist/cli/commands/add.js.map +1 -1
  4. package/dist/cli/index.js +1 -1
  5. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  6. package/dist/generators/test-generator/code-generator.js +27 -4
  7. package/dist/generators/test-generator/code-generator.js.map +1 -1
  8. package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
  9. package/dist/orchestrator/ai-rules-updater.js +2 -0
  10. package/dist/orchestrator/ai-rules-updater.js.map +1 -1
  11. package/dist/orchestrator/project-initializer.d.ts +4 -0
  12. package/dist/orchestrator/project-initializer.d.ts.map +1 -1
  13. package/dist/orchestrator/project-initializer.js +20 -3
  14. package/dist/orchestrator/project-initializer.js.map +1 -1
  15. package/dist/orchestrator/screen-manager.d.ts +9 -0
  16. package/dist/orchestrator/screen-manager.d.ts.map +1 -1
  17. package/dist/orchestrator/screen-manager.js +120 -0
  18. package/dist/orchestrator/screen-manager.js.map +1 -1
  19. package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +22 -19
  20. package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +10 -2
  21. package/dist/orchestrator/templates/ai-instructions/claude-cmd-review.md +5 -0
  22. package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +25 -16
  23. package/dist/orchestrator/templates/ai-instructions/claude-config.md +4 -97
  24. package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +48 -122
  25. package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +172 -25
  26. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +62 -34
  27. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +19 -14
  28. package/dist/orchestrator/templates/ai-instructions/claude-skill-test-design-techniques.md +99 -0
  29. package/dist/orchestrator/templates/ai-instructions/claude-skill-viewpoint.md +151 -64
  30. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +21 -15
  31. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +10 -3
  32. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-review.md +5 -0
  33. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +24 -15
  34. package/dist/orchestrator/templates/ai-instructions/copilot-config.md +4 -97
  35. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +48 -122
  36. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +172 -25
  37. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +63 -29
  38. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +19 -14
  39. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-test-design-techniques.md +99 -0
  40. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint.md +151 -64
  41. package/dist/orchestrator/templates/readme.md +1 -1
  42. package/dist/orchestrator/templates/tsconfig.json +21 -0
  43. package/package.json +1 -1
  44. package/src/cli/commands/add.ts +8 -1
  45. package/src/cli/index.ts +1 -1
  46. package/src/generators/test-generator/code-generator.ts +29 -4
  47. package/src/orchestrator/ai-rules-updater.ts +2 -0
  48. package/src/orchestrator/project-initializer.ts +24 -3
  49. package/src/orchestrator/screen-manager.ts +125 -0
  50. package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +22 -19
  51. package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +10 -2
  52. package/src/orchestrator/templates/ai-instructions/claude-cmd-review.md +5 -0
  53. package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +25 -16
  54. package/src/orchestrator/templates/ai-instructions/claude-config.md +4 -97
  55. package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +48 -122
  56. package/src/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +172 -25
  57. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +62 -34
  58. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +19 -14
  59. package/src/orchestrator/templates/ai-instructions/claude-skill-test-design-techniques.md +99 -0
  60. package/src/orchestrator/templates/ai-instructions/claude-skill-viewpoint.md +151 -64
  61. package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +21 -15
  62. package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +10 -3
  63. package/src/orchestrator/templates/ai-instructions/copilot-cmd-review.md +5 -0
  64. package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +24 -15
  65. package/src/orchestrator/templates/ai-instructions/copilot-config.md +4 -97
  66. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +48 -122
  67. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +172 -25
  68. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +63 -29
  69. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +19 -14
  70. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-test-design-techniques.md +99 -0
  71. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint.md +151 -64
  72. package/src/orchestrator/templates/readme.md +1 -1
  73. package/src/orchestrator/templates/tsconfig.json +21 -0
@@ -44,6 +44,9 @@ export class ProjectInitializer {
44
44
  // Create playwright config if doesn't exist
45
45
  this.createPlaywrightConfig();
46
46
 
47
+ // Create tsconfig.json if doesn't exist
48
+ this.createTsConfig();
49
+
47
50
  // Create specs/base.ts for shared context
48
51
  this.createSpecsBase();
49
52
 
@@ -115,6 +118,22 @@ export class ProjectInitializer {
115
118
  this.createdItems.push('playwright.config.ts');
116
119
  }
117
120
 
121
+ /**
122
+ * Create TypeScript configuration
123
+ */
124
+ private createTsConfig(): void {
125
+ const configPath = path.join(this.cwd, 'tsconfig.json');
126
+
127
+ if (fs.existsSync(configPath)) {
128
+ this.skippedItems.push('tsconfig.json');
129
+ return;
130
+ }
131
+
132
+ const content = this.readTemplate('tsconfig.json');
133
+ fs.writeFileSync(configPath, content, 'utf-8');
134
+ this.createdItems.push('tsconfig.json');
135
+ }
136
+
118
137
  /**
119
138
  * Update .gitignore with Sungen-specific entries
120
139
  */
@@ -273,6 +292,7 @@ export class ProjectInitializer {
273
292
  ['claude-skill-selector-keys.md', '.claude/skills/sungen-selector-keys/SKILL.md'],
274
293
  ['claude-skill-error-mapping.md', '.claude/skills/sungen-error-mapping/SKILL.md'],
275
294
  ['claude-skill-tc-generation.md', '.claude/skills/sungen-tc-generation/SKILL.md'],
295
+ ['claude-skill-test-design-techniques.md', '.claude/skills/sungen-test-design-techniques/SKILL.md'],
276
296
  ['claude-skill-selector-fix.md', '.claude/skills/sungen-selector-fix/SKILL.md'],
277
297
  ['claude-skill-tc-review.md', '.claude/skills/sungen-tc-review/SKILL.md'],
278
298
  ['claude-skill-viewpoint.md', '.claude/skills/sungen-viewpoint/SKILL.md'],
@@ -282,6 +302,7 @@ export class ProjectInitializer {
282
302
  ['github-skill-sungen-selector-keys.md', '.github/skills/sungen-selector-keys/SKILL.md'],
283
303
  ['github-skill-sungen-error-mapping.md', '.github/skills/sungen-error-mapping/SKILL.md'],
284
304
  ['github-skill-sungen-tc-generation.md', '.github/skills/sungen-tc-generation/SKILL.md'],
305
+ ['github-skill-sungen-test-design-techniques.md', '.github/skills/sungen-test-design-techniques/SKILL.md'],
285
306
  ['github-skill-sungen-selector-fix.md', '.github/skills/sungen-selector-fix/SKILL.md'],
286
307
  ['github-skill-sungen-tc-review.md', '.github/skills/sungen-tc-review/SKILL.md'],
287
308
  ['github-skill-sungen-viewpoint.md', '.github/skills/sungen-viewpoint/SKILL.md'],
@@ -363,9 +384,9 @@ export class ProjectInitializer {
363
384
  // package.json just created, proceed with install
364
385
  }
365
386
 
366
- // Install Playwright
367
- console.log('📦 Installing @playwright/test...\n');
368
- execSync('npm install -D @playwright/test', execOpts);
387
+ // Install Playwright and TypeScript types
388
+ console.log('📦 Installing @playwright/test and @types/node...\n');
389
+ execSync('npm install -D @playwright/test @types/node', execOpts);
369
390
 
370
391
  console.log('\n🎭 Installing Playwright browsers...\n');
371
392
  execSync('npx playwright install', execOpts);
@@ -5,10 +5,12 @@
5
5
 
6
6
  import * as fs from 'fs';
7
7
  import * as path from 'path';
8
+ import { chromium } from '@playwright/test';
8
9
 
9
10
  export interface ScreenOptions {
10
11
  name: string;
11
12
  path?: string;
13
+ capture?: boolean;
12
14
  feature?: string;
13
15
  description?: string;
14
16
  }
@@ -120,6 +122,76 @@ export class ScreenManager {
120
122
  fs.writeFileSync(specPath, this.generateSpecTemplate(options, screenName), 'utf-8');
121
123
  }
122
124
 
125
+ // Generate requirements test-viewpoint.md (only on first screen creation)
126
+ const viewpointPath = path.join(requirementsDir, 'test-viewpoint.md');
127
+ if (!fs.existsSync(viewpointPath)) {
128
+ fs.writeFileSync(viewpointPath, [
129
+ `# ${options.name} — Test Viewpoints`,
130
+ '',
131
+ '## Edge Cases',
132
+ '',
133
+ '<!-- Sample — replace with actual edge cases for this screen:',
134
+ '- Paste emoji into text fields (e.g., 🎉👋) — should accept or sanitize?',
135
+ '- Input 10,000+ characters into free text — truncate or reject?',
136
+ '- Double-click Submit rapidly — should only create 1 record',
137
+ '- Browser back button after successful submit — should not re-submit',
138
+ '-->',
139
+ '',
140
+ '## Known Issues',
141
+ '',
142
+ '<!-- Sample — replace with actual known issues:',
143
+ '- [BUG-001] Date picker does not work on Safari < 16',
144
+ '- [BUG-002] File upload silently fails for files > 20MB (no error shown)',
145
+ '- Search does not handle Vietnamese accents correctly ("Nguyên" ≠ "Nguyen")',
146
+ '-->',
147
+ '',
148
+ '## Design Decisions',
149
+ '',
150
+ '<!-- Sample — replace with actual design decisions:',
151
+ '- Show all validation errors at once (not one at a time) — per UX review',
152
+ '- Cancel button resets form completely (no draft saving)',
153
+ '- Anonymous mode hides sender name but keeps department visible',
154
+ '-->',
155
+ '',
156
+ '## UI Patterns Identified',
157
+ '',
158
+ '<!-- Check applicable patterns for this screen (from sungen-viewpoint skill):',
159
+ '',
160
+ '| # | Pattern | Applicable? | Notes |',
161
+ '|---|---------|-------------|-------|',
162
+ '| 1 | Form & Inputs | ☐ | |',
163
+ '| 2 | Data Table | ☐ | |',
164
+ '| 3 | Create / Add | ☐ | |',
165
+ '| 4 | Update / Edit | ☐ | |',
166
+ '| 5 | Delete | ☐ | |',
167
+ '| 6 | Search | ☐ | |',
168
+ '| 7 | Filter | ☐ | |',
169
+ '| 8 | Pagination | ☐ | |',
170
+ '| 9 | Modal / Dialog | ☐ | |',
171
+ '| 10 | List / Card | ☐ | |',
172
+ '-->',
173
+ '',
174
+ '## Priority Viewpoints',
175
+ '',
176
+ '<!-- Rate importance for this screen (High / Medium / Low / Skip):',
177
+ '',
178
+ '| VP | Priority | Reason |',
179
+ '|---|----------|--------|',
180
+ '| VP-UI | High | Complex form with many states |',
181
+ '| VP-VAL | High | 14 validation rules from spec |',
182
+ '| VP-LOGIC | Medium | Standard CRUD, no complex business rules |',
183
+ '| VP-SEC | Low | Internal tool, basic auth only |',
184
+ '-->',
185
+ '',
186
+ ].join('\n'), 'utf-8');
187
+ }
188
+
189
+ // Auto-screenshot: capture page only when --capture is set (requires --path)
190
+ // Use filename (not screenName) so each feature gets its own screenshots
191
+ if (options.capture && options.path) {
192
+ await this.captureScreenshot(options.path, requirementsUiDir, filename);
193
+ }
194
+
123
195
  // Display success
124
196
  console.log(`Created files:`);
125
197
  console.log(` ${path.relative(this.cwd, featurePath)}`);
@@ -127,6 +199,7 @@ export class ScreenManager {
127
199
  console.log(` ${path.relative(this.cwd, testDataPath)}`);
128
200
  if (isFirstFile) {
129
201
  console.log(` ${path.relative(this.cwd, specPath)}`);
202
+ console.log(` ${path.relative(this.cwd, viewpointPath)}`);
130
203
  console.log(` ${path.relative(this.cwd, requirementsUiDir)}/`);
131
204
  }
132
205
  console.log('');
@@ -139,6 +212,58 @@ export class ScreenManager {
139
212
  console.log(` 4. Run: npx playwright test\n`);
140
213
  }
141
214
 
215
+ /**
216
+ * Capture full-page screenshot of the screen URL
217
+ */
218
+ private async captureScreenshot(pagePath: string, uiDir: string, screenName: string): Promise<void> {
219
+ const baseURL = this.getBaseURL();
220
+ if (!baseURL) {
221
+ console.log(' ⊘ Screenshot skipped: no baseURL found in playwright.config.ts');
222
+ return;
223
+ }
224
+
225
+ const url = `${baseURL.replace(/\/+$/, '')}${pagePath}`;
226
+ console.log(`\n📸 Capturing screenshot: ${url}`);
227
+
228
+ let browser;
229
+ try {
230
+ browser = await chromium.launch();
231
+ const page = await browser.newPage({ viewport: { width: 1280, height: 720 } });
232
+ await page.goto(url, { waitUntil: 'networkidle', timeout: 15000 });
233
+
234
+ // Full-page screenshot
235
+ const screenshotPath = path.join(uiDir, `${screenName}-full.png`);
236
+ await page.screenshot({ path: screenshotPath, fullPage: true });
237
+ console.log(` ✓ Saved: ${path.relative(this.cwd, screenshotPath)}`);
238
+
239
+ // Viewport screenshot (above the fold)
240
+ const viewportPath = path.join(uiDir, `${screenName}-viewport.png`);
241
+ await page.screenshot({ path: viewportPath, fullPage: false });
242
+ console.log(` ✓ Saved: ${path.relative(this.cwd, viewportPath)}`);
243
+ } catch (error) {
244
+ const msg = error instanceof Error ? error.message : String(error);
245
+ if (msg.includes('net::ERR') || msg.includes('Timeout')) {
246
+ console.log(` ⊘ Screenshot skipped: page not reachable (${msg.split('\n')[0]})`);
247
+ } else {
248
+ console.log(` ⊘ Screenshot skipped: ${msg.split('\n')[0]}`);
249
+ }
250
+ } finally {
251
+ if (browser) await browser.close();
252
+ }
253
+ }
254
+
255
+ /**
256
+ * Read baseURL from playwright.config.ts
257
+ */
258
+ private getBaseURL(): string | null {
259
+ const configPath = path.join(this.cwd, 'playwright.config.ts');
260
+ if (!fs.existsSync(configPath)) return null;
261
+
262
+ const content = fs.readFileSync(configPath, 'utf-8');
263
+ const match = content.match(/baseURL:\s*['"]([^'"]+)['"]/);
264
+ return match ? match[1] : null;
265
+ }
266
+
142
267
  private validateScreenName(name: string): void {
143
268
  if (!name || name.trim().length === 0) {
144
269
  console.error('Error: Screen name cannot be empty');
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: add-screen
3
- description: 'Add a new Sungen screen — scaffolds directories and delegates to create-test for test case creation'
3
+ description: 'Add a new Sungen screen — scaffolds directories, helps fill spec.md, and can auto-capture a live-page screenshot via Playwright MCP'
4
4
  argument-hint: [screen-name] [url-path]
5
- allowed-tools: Read, Grep, Bash, Glob, AskUserQuestion
5
+ allowed-tools: Read, Grep, Bash, Glob, Edit, Write, AskUserQuestion, mcp__playwright__browser_navigate, mcp__playwright__browser_take_screenshot, mcp__playwright__browser_snapshot
6
6
  ---
7
7
 
8
8
  You are adding a new Sungen screen for test generation.
@@ -25,28 +25,31 @@ Run:
25
25
  sungen add --screen <screen> --path <path>
26
26
  ```
27
27
 
28
- ### 2. Fill requirements (recommended)
28
+ ### 2. Prepare requirements
29
29
 
30
- Ask the user: "Would you like to fill in `requirements/spec.md` now? This helps generate higher quality test cases."
30
+ Use `AskUserQuestion` to let the user choose how to prepare requirements this is the foundation for high-quality test generation:
31
31
 
32
- - If yes → open `qa/screens/<screen>/requirements/spec.md` and help the user fill sections, fields, validation rules, business rules, and states.
33
- - If they have UI designs (screenshots, Figma exports, mockups) suggest copying them to `requirements/ui/`.
34
- - If no proceed to step 3.
32
+ - **Fill `spec.md` + capture live-page screenshot** (Recommended) best test quality
33
+ - **Fill `spec.md` only** app not live yet, or no need for visuals
34
+ - **Capture live-page screenshot only** spec will come later
35
+ - **Skip requirements prep** — proceed to `/sungen:create-test` immediately
35
36
 
36
- ### 3. Create test cases
37
+ **If "Fill `spec.md`" is chosen**: open `qa/screens/<screen>/requirements/spec.md` and help the user fill sections, fields, validation rules, business rules, and states.
37
38
 
38
- Ask the user: "Would you like to create test cases now?"
39
+ **If "Capture live-page screenshot" is chosen**:
40
+ 1. Read `baseURL` from `playwright.config.ts` (fall back to `APP_BASE_URL` env, then ask the user).
41
+ 2. `browser_navigate` to `<baseURL><path>`.
42
+ 3. If redirected to login → ask the user to log in manually in the MCP browser, wait for confirmation, then re-navigate. (No auth persistence needed here — that's handled by Phase 0.5 in `sungen-selector-fix` when tests run.)
43
+ 4. `browser_take_screenshot` with `filename: "qa/screens/<screen>/requirements/ui/<screen>.png"`.
44
+ 5. If the screen has multiple important states (empty, loaded, error, modal open), offer additional captures named `<screen>-<state>.png`.
39
45
 
40
- If yes → **you MUST use the Skill tool** to invoke `/sungen:create-test <screen>`. This is critical because `create-test` auto-loads the `sungen-gherkin-syntax` and `sungen-tc-generation` skills which contain the full Gherkin syntax rules, pattern shapes, viewpoint checklists, and output format. **Do NOT attempt to generate test cases yourself** — always invoke the Skill tool so these skills are properly loaded.
46
+ If the user has additional UI designs (Figma exports, mockups), suggest copying them to `requirements/ui/`.
41
47
 
42
- ```
43
- Skill: create-test
44
- Args: <screen>
45
- ```
48
+ ### 3. Next steps
49
+
50
+ Tell the user what was created, then use `AskUserQuestion` to offer next steps:
46
51
 
47
- ### 4. Confirm
52
+ - **`/sungen:create-test <screen>`** — Create test cases from requirements/designs (Recommended)
53
+ - **Done for now** — I'll come back later
48
54
 
49
- If the user declined test case creation, tell them next steps:
50
- - Fill `requirements/spec.md` with screen specs (if not done)
51
- - Run `/sungen:create-test <screen>` to create test cases
52
- - Run `/sungen:run-test <screen>` to generate selectors, compile, and run tests
55
+ If user picks `/sungen:create-test`, **you MUST use the Skill tool** to invoke it. Do NOT generate test cases yourself the skill auto-loads `sungen-gherkin-syntax` and `sungen-tc-generation`.
@@ -20,14 +20,22 @@ Parse **screen** from `$ARGUMENTS`. If missing, ask the user.
20
20
  3. **Read requirements** — check `qa/screens/<screen>/requirements/`:
21
21
  - If `spec.md` exists → read it as PRIMARY source (sections, fields, validation rules, business rules, states).
22
22
  - If `ui/` has images → read them for visual context (layout, element positions, states).
23
- - If `notes.md` exists → read for edge cases and additional context.
23
+ - If `test-viewpoint.md` exists → read it. If it only contains HTML comments (scaffold template), use `AskUserQuestion` to ask:
24
+ - **Fill test-viewpoint.md first** — I'll help you identify edge cases, known issues, and design decisions for this screen before generating tests
25
+ - **Continue without it** — generate tests from spec and other sources only
24
26
  - Summarize what you found in requirements and present to the user.
25
27
  4. **Screen input** (supplements requirements, or is primary source if no requirements):
26
28
  - Use `AskUserQuestion` to ask: **Figma design** (provide Figma URL — recommended), **UI images** (screenshots/mockups in `requirements/ui/`), or **Live page scan** (optional, via Playwright MCP)?
27
29
  - Recommend Figma or UI images first. Live page scan is optional — useful to verify specs vs actual UI or capture real data.
30
+ - If live page scan: `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.
28
31
  - If exploring, verify and supplement requirements — flag any discrepancies found.
29
32
  5. Follow the `sungen-tc-generation` skill for section identification, viewpoint generation, and output format. When requirements exist, use the "Requirements-Driven Generation" strategy.
30
33
  6. Generate or update `.feature` + `test-data.yaml` following `sungen-gherkin-syntax` and `sungen-tc-generation` skills.
31
- 7. Show summary next: `/sungen:review <screen>` or `/sungen:run-test <screen>`
34
+ 7. Show summary, then use `AskUserQuestion` to offer next steps:
35
+
36
+ - **`/sungen:review <screen>`** — Review syntax, coverage, viewpoint quality (Recommended)
37
+ - **`/sungen:run-test <screen>`** — Skip review, generate selectors and run tests now
38
+ - **`/sungen:create-test <screen>`** — Add more test cases for another section/viewpoint
39
+ - **Done for now** — I'll come back later
32
40
 
33
41
  **No selectors.yaml** — selectors are generated during `/sungen:run-test`.
@@ -19,3 +19,8 @@ Parse **screen** from `$ARGUMENTS`. If missing, ask the user.
19
19
  2. Follow the `sungen-tc-review` skill — score 3 dimensions: Syntax (30pts), Coverage (40pts), Viewpoint (30pts). Use `sungen-viewpoint` for pattern checklists.
20
20
  3. Output review report per `sungen-tc-review` format. **>= 60%**: PASS. **< 60%**: FAIL with recommendations.
21
21
  4. If FAIL and user confirms → update test cases following `sungen-gherkin-syntax` and `sungen-tc-generation` skills, then re-review.
22
+ 5. After PASS (or user decides to proceed), use `AskUserQuestion` to offer next steps:
23
+
24
+ - **`/sungen:run-test <screen>`** — Generate selectors, compile, and run tests (Recommended)
25
+ - **`/sungen:create-test <screen>`** — Add more test cases before running
26
+ - **Done for now** — I'll come back later
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: run-test
3
- description: 'Compile and run Playwright tests — auto-fixes selectors on failure'
3
+ description: 'Generate selectors + auth state via Playwright MCP, compile, and run Playwright tests — auto-fixes selectors on failure'
4
4
  argument-hint: [screen-name]
5
- allowed-tools: Read, Grep, Bash, Glob, Edit, AskUserQuestion
5
+ allowed-tools: Read, Grep, Bash, Glob, Edit, Write, AskUserQuestion, mcp__playwright__browser_navigate, mcp__playwright__browser_snapshot, mcp__playwright__browser_take_screenshot, mcp__playwright__browser_wait_for, mcp__playwright__browser_evaluate, mcp__playwright__browser_run_code, mcp__playwright__browser_storage_state, mcp__playwright__browser_set_storage_state
6
6
  ---
7
7
 
8
8
  ## Role
@@ -13,20 +13,29 @@ You are a **Senior Developer**. Use `sungen-selector-fix`, `sungen-selector-keys
13
13
 
14
14
  Parse **screen** from `$ARGUMENTS`. If missing, ask the user.
15
15
 
16
- ## Phase 1: Compile & Run (no MCP)
16
+ ## Pre-run (phased per `sungen-selector-fix` skill)
17
17
 
18
- 1. Verify `qa/screens/<screen>/` has `.feature` + `test-data.yaml`
19
- 2. Ensure `selectors.yaml` has page selector. If missing, ask user for URL path
20
- 3. `sungen generate --screen <screen>`
21
- 4. `npx playwright test specs/generated/<screen>/*.spec.ts --reporter=line`
22
- 5. If all pass → done
18
+ 1. Verify `qa/screens/<screen>/` has `.feature` + `test-data.yaml`.
19
+ 2. **Phase 0 — Selector Pre-gen**: if `selectors.yaml` is missing/empty or doesn't cover the feature file's `[Reference]`s, run Phase 0 from `sungen-selector-fix` — confirm with user, `browser_navigate` one `browser_snapshot` → merge YAML entries.
20
+ 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.
21
+ 4. Compile: `sungen generate --screen <screen>`.
23
22
 
24
- ## Phase 2: Targeted Fix (only if failures)
23
+ ## Run & Fix (phased per `sungen-selector-fix` skill)
25
24
 
26
- 6. Parse failures → group by root cause
27
- 7. Navigate to page ONCE via MCP ONE `browser_snapshot`
28
- 8. Fix broken selectors per `sungen-selector-fix` skill
29
- 9. Recompile re-run only failing tests
30
- 10. Repeat up to 3 attempts
31
- 11. Final full run for regression check
32
- 12. Still failing → ask user
25
+ 5. **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.
26
+ 6. **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.
27
+ 7. **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.
28
+ 8. **Phase 4 — Regression**: One final full run. Report results. No more fix loops.
29
+
30
+ ## Next steps
31
+
32
+ After showing results, use `AskUserQuestion` to offer next steps:
33
+
34
+ If all tests **passed**:
35
+ - **`/sungen:create-test <screen>`** — Add more test cases (Recommended)
36
+ - **Done** — All tests passed, I'm finished
37
+
38
+ If tests **failed** (after retries):
39
+ - **`/sungen:run-test <screen>`** — Re-run after manual fixes
40
+ - **`/sungen:create-test <screen>`** — Revise test cases
41
+ - **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` | 7 UI patterns x 4 viewpoints — coverage checklists |
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, use `AskUserQuestion` to 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