openspec-playwright 0.1.77 โ†’ 0.1.78

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.
@@ -3,12 +3,9 @@
3
3
 
4
4
  <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
5
 
6
- ### Mar 27, 2026
7
-
8
- | ID | Time | T | Title | Read |
9
- | ----- | -------- | --- | ----------------------------------------------------------------------- | ---- |
10
- | #5511 | 11:22 AM | โœ… | Extended guardrails to protect auth files from overwriting | ~181 |
11
- | #5510 | 11:21 AM | ๐ŸŸฃ | Enhanced SKILL.md with Playwright auth project configuration | ~228 |
12
- | #5427 | 10:05 AM | โœ… | Committed style fixes aligning SKILL.md with OpenSpec template standard | ~281 |
6
+ ### Apr 7, 2026
13
7
 
8
+ | ID | Time | T | Title | Read |
9
+ |----|------|---|-------|------|
10
+ | #5762 | 11:14 AM | ๐Ÿ”ต | SKILL.md Already Documents fillAndVerify Pattern | ~214 |
14
11
  </claude-mem-context>
@@ -5,7 +5,7 @@ license: MIT
5
5
  compatibility: Requires openspec CLI, Playwright (with browsers installed), and @playwright/mcp (globally installed via `claude mcp add playwright npx @playwright/mcp@latest`).
6
6
  metadata:
7
7
  author: openspec-playwright
8
- version: "2.11"
8
+ version: "2.13"
9
9
  ---
10
10
 
11
11
  ## Input
@@ -19,7 +19,6 @@ metadata:
19
19
  - **Test file**: `tests/playwright/<name>.spec.ts`
20
20
  - **Page Objects** (all mode): `tests/playwright/pages/<Route>Page.ts`
21
21
  - **Auth setup**: `tests/playwright/auth.setup.ts` (if auth required)
22
- - **Auth setup**: `tests/playwright/auth.setup.ts` (if auth required)
23
22
  - **Report**: `openspec/reports/playwright-e2e-<name>-<timestamp>.md`
24
23
  - **Test plan**: `openspec/changes/<name>/specs/playwright/test-plan.md` (change mode only)
25
24
 
@@ -75,10 +74,33 @@ Can this be tested through the UI?
75
74
 
76
75
  - Announce: "Mode: full app exploration + Page Object discovery"
77
76
  - **Goal**: Discover new routes, extract selectors, and build `pages/*.ts` Page Objects โ€” accumulated asset for future Change tests
78
- - Discover routes via:
79
- 1. Navigate to `${BASE_URL}/sitemap.xml` (if exists)
80
- 2. Navigate to `${BASE_URL}/` โ†’ extract all links from snapshot
81
- 3. Fallback common paths: `/`, `/login`, `/dashboard`, `/admin`, `/profile`, `/api/`
77
+ - **Route discovery** (in order):
78
+ 1. **sitemap.xml**: `browser_navigate(${BASE_URL}/sitemap.xml)` โ†’ parse URLs
79
+ 2. **Link extraction**: Navigate to `${BASE_URL}/` โ†’ `browser_evaluate` extracts all `<a href>`:
80
+ ```javascript
81
+ // Extract all internal links from current page
82
+ () => {
83
+ const origin = window.location.origin;
84
+ const links = Array.from(document.querySelectorAll('a[href]'));
85
+ return links
86
+ .map(a => a.href)
87
+ .filter(h => h.startsWith(origin) && !h.includes('/logout') && !h.includes('/api/'))
88
+ .map(h => new URL(h).pathname);
89
+ }
90
+ ```
91
+ 3. **Fallback common paths**: `/`, `/login`, `/dashboard`, `/admin`, `/profile`, `/settings`
92
+
93
+ **Decision table โ€” route discovery fallback:**
94
+
95
+ | Situation | Action |
96
+ | โ€” | โ€” |
97
+ | `sitemap.xml` returns 200 with URLs | Parse all URLs โ†’ extract pathname |
98
+ | `sitemap.xml` returns 404/5xx | Skip โ†’ use link extraction |
99
+ | Link extraction finds 0 links | Fall back to common paths |
100
+ | Common path returns 200 | Add to routes |
101
+ | Duplicate routes from multiple sources | Deduplicate by pathname |
102
+
103
+ - **Persist routes**: Write discovered routes to `app-knowledge.md` โ†’ **Routes** table. Replace the entire table (including header) with fresh data โ€” do not append.
82
104
  - Group routes: Guest vs Protected (by attempting direct access)
83
105
 
84
106
  ### 2. Detect auth
@@ -95,11 +117,13 @@ Can this be tested through the UI?
95
117
 
96
118
  **Exclude false positives**: HTTP header examples (`Authorization: Bearer ...`) and code snippets do not count.
97
119
 
98
- **Confidence**:
120
+ **Confidence โ€” decision table:**
99
121
 
100
- - High (auto-proceed): Multiple markers AND context indicators
101
- - Medium (proceed with note): Single marker, context unclear
102
- - Low (skip auth): No markers found
122
+ | Confidence | Condition | Action |
123
+ | โ€” | โ€” | โ€” |
124
+ | High | Multiple markers AND context indicators | Auto-proceed |
125
+ | Medium | Single marker, context unclear | Proceed + note in output |
126
+ | Low | No markers found | Skip auth, test as guest |
103
127
 
104
128
  ### 3. Validate environment
105
129
 
@@ -281,7 +305,7 @@ Record findings in `app-exploration.md` โ†’ **Special Elements Detected** table.
281
305
 
282
306
  Output: `openspec/changes/<name>/specs/playwright/app-exploration.md`
283
307
 
284
- Use template: `templates/app-exploration.md`
308
+ Template: read from `.claude/skills/openspec-e2e/templates/app-exploration.md` (project-local skill directory)
285
309
 
286
310
  Key fields per route:
287
311
 
@@ -299,7 +323,7 @@ After exploration, add route-level notes (redirects, dynamic content โ†’ see 4.5
299
323
  | ------------------------------------------------- | ---------------------------------------------------------------- |
300
324
  | SPA routing (URL changes but page doesn't reload) | Explore via navigation clicks from known routes, not direct URLs |
301
325
  | Page loads but no interactive elements | Wait longer for SPA hydration |
302
- | Dynamic content (user-specific) | Record structure โ€” use `toContainText`, not `toHaveText` |
326
+ | Dynamic content (user-specific) | Record structure โ€” use `toContainText` or regex, not `toHaveText` |
303
327
 
304
328
  **Idempotency**: If `app-exploration.md` already exists โ†’ read it, verify routes still match specs, update only new routes or changed pages.
305
329
 
@@ -393,12 +417,46 @@ Then ask: "Does this coverage match your intent? Reply **yes** to proceed, or te
393
417
 
394
418
  If the user requests changes โ†’ update test-plan.md โ†’ re-display summary โ†’ re-confirm โ†’ proceed.
395
419
 
396
- ### 6. Generate test file
420
+ ### 6. Generate (Generator role)
397
421
 
398
422
  **"all" mode**: Build and expand Page Objects for future Change tests.
399
423
 
400
424
  **Prerequisite**: If `app-exploration.md` does not exist โ†’ **STOP**. Run Step 4 first. All mode explores routes via browser MCP to build exploration data.
401
425
 
426
+ **Page Object pattern** โ€” read before writing any page file:
427
+
428
+ Read: `templates/e2e-test.ts` โ†’ LoginPage example
429
+
430
+ ```typescript
431
+ // โœ… ๆญฃ็กฎ๏ผšgetters + async actions + this.click/fill
432
+ export class LoginPage extends BasePage {
433
+ get usernameInput() { return this.byLabel('็”จๆˆทๅ'); }
434
+ get submitBtn() { return this.byRole('button', { name: '็™ปๅฝ•' }); }
435
+ constructor(page: Page) { super(page); }
436
+ async login(user: string, pass: string) {
437
+ await this.goto('/login');
438
+ await this.fillAndVerify(this.usernameInput, user);
439
+ await this.click(this.submitBtn);
440
+ }
441
+ }
442
+
443
+ // โŒ ้”™่ฏฏ๏ผšๆต‹่ฏ•ๆ–‡ไปถ้‡Œๅ†™ inline locators
444
+ test('login', async ({ page }) => {
445
+ await page.getByLabel('็”จๆˆทๅ').fill('user'); // โ† never do this!
446
+ });
447
+ ```
448
+
449
+ **Decision table โ€” Page Object file handling**:
450
+
451
+ | Situation | Action |
452
+ | โ€” | โ€” |
453
+ | `pages/<Route>Page.ts` does not exist | Create from LoginPage pattern |
454
+ | File exists with some getters | Extend โ€” add missing, preserve existing |
455
+ | File exists but uses inline locators | Rewrite with Page Object pattern, keep selector strings |
456
+ | Route removed from app | Remove corresponding Page Object file |
457
+
458
+ **File naming**: `pages/<Route>Page.ts` โ€” use kebab-case route โ†’ PascalCase. `/login` โ†’ `LoginPage.ts`, `/user-profile` โ†’ `UserProfilePage.ts`.
459
+
402
460
  For each discovered route:
403
461
 
404
462
  1. Read existing `pages/<Route>Page.ts` (if any โ€” incremental, not overwrite)
@@ -576,7 +634,7 @@ export class LoginPage extends BasePage {
576
634
  await this.goto('/login');
577
635
  await this.fillAndVerify(this.usernameInput, user);
578
636
  await this.fillAndVerify(this.passwordInput, pass);
579
- await this.submitBtn.click();
637
+ await this.click(this.submitBtn);
580
638
  }
581
639
  }
582
640
  ```
@@ -701,7 +759,9 @@ Auth required. To set up:
701
759
 
702
760
  ### 8. Configure playwright.config.ts
703
761
 
704
- If missing โ†’ generate from `templates/playwright.config.ts`.
762
+ **Output**: `playwright.config.ts` (project root; or `tests/playwright/playwright.config.ts` if config already exists there)
763
+
764
+ If missing โ†’ generate from `.claude/skills/openspec-e2e/templates/playwright.config.ts`.
705
765
 
706
766
  **Auto-detect BASE_URL** (in priority order):
707
767
 
@@ -738,21 +798,24 @@ If tests fail โ†’ use Playwright MCP tools to inspect UI, fix selectors, re-run.
738
798
  | `browser_take_screenshot` | Visually compare before/after fixes |
739
799
  | `browser_run_code` | Execute custom fix logic (optional) |
740
800
 
741
- **Healer workflow**:
742
-
743
- 1. Read the failing test โ†’ identify failure type
744
- 2. Classify:
745
-
746
- | Failure type | Signal | Action |
747
- | ---------------------------- | --------------------------------------- | ----------------------------------------------------- |
748
- | **Network/backend** | `fetch failed`, `net::ERR`, 4xx/5xx | `browser_network_requests` โ†’ `browser_console_messages` โ†’ `test.skip()` |
749
- | **Selector changed** | Element not found | `browser_snapshot` โ†’ fix selector โ†’ re-run |
750
- | **Assertion mismatch** | Wrong content/value | `browser_snapshot` โ†’ compare โ†’ fix assertion โ†’ re-run |
751
- | **Timing issue** | `waitFor`/`page.evaluate` timeout | Switch to `request` API or add `waitFor` โ†’ re-run |
752
- | **page.evaluate with fetch** | `fetch` in browser context, CORS errors | Switch to `page.request` API โ†’ re-run |
753
-
754
- 3. **Heal** (โ‰ค3 attempts): snapshot โ†’ fix โ†’ re-run. If healed successfully โ†’ append to `app-knowledge.md` โ†’ **Selector Fixes** table: route, old selector โ†’ new selector, reason.
755
- 4. **After 3 failures**: collect evidence checklist โ†’ `test.skip()` if app bug, report recommendation if test bug
801
+ **Healer Decision Table โ€” failure type โ†’ action:**
802
+
803
+ | Failure type | Signal | Action |
804
+ | โ€” | โ€” | โ€” |
805
+ | **Network/backend** | `fetch failed`, `net::ERR`, 4xx/5xx in console | `browser_network_requests` โ†’ verify backend โ†’ `test.skip()` + report |
806
+ | **Selector changed** | Element not found | `browser_snapshot` โ†’ fix selector โ†’ re-run (attempt 1/3) |
807
+ | **Assertion mismatch** | Wrong content/value | `browser_snapshot` โ†’ compare โ†’ fix assertion โ†’ re-run (attempt 1/3) |
808
+ | **Timing issue** | waitFor/evaluate timeout | Switch to `request` API or add `waitFor` โ†’ re-run (attempt 1/3) |
809
+ | **page.evaluate with fetch** | CORS errors in browser context | Switch to `page.request` API โ†’ re-run (attempt 1/3) |
810
+ | **Auth expired** | Redirected to login mid-test | Re-run auth.setup โ†’ re-run test |
811
+ | **3 heals failed** | After 3 attempts, still failing | **STOP**. `test.skip()` if app bug; report recommendation if test bug |
812
+
813
+ **Healer protocol:**
814
+ 1. Read failing test โ†’ identify failure type
815
+ 2. Match to decision table โ†’ take action
816
+ 3. After fix: re-run only that test
817
+ 4. If healed: append to `app-knowledge.md` โ†’ **Selector Fixes** table (route, old selector โ†’ new selector, reason)
818
+ 5. **If 3 attempts exhausted without heal โ†’ STOP**. Do not retry further.
756
819
 
757
820
  ### 10. False Pass Detection
758
821
 
@@ -780,6 +843,8 @@ Reference: `templates/report.md`
780
843
 
781
844
  ## Graceful Degradation
782
845
 
846
+ **When these critical failures occur โ†’ STOP immediately:**
847
+
783
848
  | Scenario | Behavior |
784
849
  | ------- | ------- |
785
850
  | No specs / app-exploration.md missing (change mode) | **STOP** |
@@ -793,10 +858,17 @@ Reference: `templates/report.md`
793
858
 
794
859
  ## Guardrails
795
860
 
796
- - Read specs from `openspec/changes/<name>/specs/` as source of truth
797
- - Do NOT generate tests that contradict the specs
798
- - **DO generate real, runnable Playwright test code** โ€” not placeholders or TODOs
799
- - Do NOT overwrite files outside: `specs/playwright/`, `tests/playwright/`, `openspec/reports/`, `playwright.config.ts`, `auth.setup.ts`
800
- - **Always explore before generating** โ€” Step 4 is mandatory for accurate selectors
801
- - Cap auto-heal at 3 attempts
802
- - If no change specified โ†’ always ask user to select
861
+ **Decision table:**
862
+
863
+ | Rule | Why |
864
+ | โ€” | โ€” |
865
+ | Read specs as source of truth | Generated tests must match requirements |
866
+ | Step 4 before Step 6 | Real DOM data โ†’ accurate selectors |
867
+ | Never contradict specs | E2E validates implementation, not design |
868
+ | Cap heal at 3 attempts | Prevents infinite loops |
869
+ | Write runnable code, not TODOs | Placeholders fail CI |
870
+
871
+ **Files you can write to:**
872
+ `specs/playwright/`, `tests/playwright/`, `openspec/reports/`, `playwright.config.ts`, `auth.setup.ts`
873
+
874
+ **Never write to:** any other directory
@@ -69,6 +69,8 @@ export async function update(options) {
69
69
  cleanupDeprecatedSchema(projectRoot);
70
70
  // Sync SKILL reference templates
71
71
  syncSkillTemplates(tmpDir, projectRoot);
72
+ // Sync project templates (BasePage.ts, seed.spec.ts)
73
+ syncProjectTemplates(tmpDir, projectRoot);
72
74
  rmSync(tmpDir, { recursive: true, force: true });
73
75
  console.log(chalk.green(" โœ“ Commands, skill & templates updated to latest"));
74
76
  }
@@ -164,5 +166,52 @@ function syncSkillTemplates(tmpDir, projectRoot) {
164
166
  writeFileSync(dest, readFileSync(src));
165
167
  }
166
168
  }
169
+ // Sync project-level templates (BasePage.ts)
170
+ syncProjectTemplates(tmpDir, projectRoot);
171
+ }
172
+ // Sync project-level templates that SKILL.md depends on
173
+ function syncProjectTemplates(tmpDir, projectRoot) {
174
+ const testsDir = join(projectRoot, "tests", "playwright");
175
+ if (!existsSync(testsDir))
176
+ return;
177
+ // 1. Sync BasePage.ts โ€” SKILL.md references fillAndVerify(), byTestId(), etc.
178
+ const basePageSrc = join(tmpDir, "templates", "pages", "BasePage.ts");
179
+ const basePageDest = join(testsDir, "pages", "BasePage.ts");
180
+ if (existsSync(basePageSrc)) {
181
+ if (!existsSync(basePageDest)) {
182
+ // BasePage.ts missing โ€” create it
183
+ mkdirSync(join(testsDir, "pages"), { recursive: true });
184
+ writeFileSync(basePageDest, readFileSync(basePageSrc));
185
+ console.log(chalk.green(" โœ“ Generated: tests/playwright/pages/BasePage.ts"));
186
+ }
187
+ else {
188
+ // BasePage.ts exists โ€” check if it has fillAndVerify (v0.1.75+)
189
+ const existing = readFileSync(basePageDest, "utf-8");
190
+ const latest = readFileSync(basePageSrc, "utf-8");
191
+ const hasFillAndVerify = existing.includes("fillAndVerify");
192
+ const latestHasFillAndVerify = latest.includes("fillAndVerify");
193
+ if (!hasFillAndVerify && latestHasFillAndVerify) {
194
+ // Old version detected โ€” update it
195
+ writeFileSync(basePageDest, latest);
196
+ console.log(chalk.green(" โœ“ Updated: tests/playwright/pages/BasePage.ts (v0.1.75+ with fillAndVerify)"));
197
+ }
198
+ }
199
+ }
200
+ // 2. Sync seed.spec.ts โ€” only if it matches the template (user hasn't customized)
201
+ const seedSrc = join(tmpDir, "templates", "seed.spec.ts");
202
+ const seedDest = join(testsDir, "seed.spec.ts");
203
+ if (existsSync(seedSrc) && existsSync(seedDest)) {
204
+ const existing = readFileSync(seedDest, "utf-8");
205
+ const latest = readFileSync(seedSrc, "utf-8");
206
+ // Check if seed.spec.ts references fillAndVerify (v0.1.75+)
207
+ const hasFillAndVerify = existing.includes("fillAndVerify");
208
+ const latestHasFillAndVerify = latest.includes("fillAndVerify");
209
+ if (!hasFillAndVerify && latestHasFillAndVerify) {
210
+ // Old version โ€” prompt user (seed.spec.ts may have custom tests)
211
+ console.log(chalk.yellow(" โš  tests/playwright/seed.spec.ts is outdated (missing fillAndVerify examples)"));
212
+ console.log(chalk.gray(" The SKILL references fillAndVerify() in examples. Your seed.spec.ts may be outdated."));
213
+ console.log(chalk.gray(" To update: backup your customizations, then run 'openspec-pw init --seed' to regenerate."));
214
+ }
215
+ }
167
216
  }
168
217
  //# sourceMappingURL=update.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openspec-playwright",
3
- "version": "0.1.77",
3
+ "version": "0.1.78",
4
4
  "description": "OpenSpec + Playwright E2E verification setup tool for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -3,13 +3,5 @@
3
3
 
4
4
  <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
5
 
6
- ### Mar 27, 2026
7
-
8
- | ID | Time | T | Title | Read |
9
- |----|------|---|-------|------|
10
- | #5522 | 11:25 AM | ๐Ÿ”ต | Playwright auth setup template supports API and UI login | ~261 |
11
- | #5514 | 11:22 AM | ๐ŸŸฃ | Created credentials.yaml template for E2E test authentication | ~227 |
12
- | #5513 | " | ๐ŸŸฃ | Created auth.setup.ts template for Playwright Test Agents | ~276 |
13
- | #5390 | 9:48 AM | ๐Ÿ”„ | Refactored openspec-playwright from CLI to setup tool + Claude Code skill | ~209 |
14
- | #5375 | 9:44 AM | ๐ŸŸฃ | Created Playwright seed test template | ~224 |
6
+ *No recent activity*
15
7
  </claude-mem-context>
@@ -5,6 +5,17 @@ Last updated: <timestamp>
5
5
 
6
6
  Cross-change E2E knowledge. Updated by Step 4 exploration, read by Step 5/6.
7
7
 
8
+ ## Routes
9
+
10
+ Discovered routes from sitemap.xml or link extraction. Used by "all" mode to generate Page Objects.
11
+
12
+ | Route | Auth | Page Object | Notes |
13
+ |-------|------|-------------|-------|
14
+ | `/` | guest | `HomePage.ts` | Landing page |
15
+ | `/login` | guest | `LoginPage.ts` | Auth entry |
16
+ | `/dashboard` | required | `DashboardPage.ts` | Protected |
17
+ | | | | |
18
+
8
19
  ## Credential Format
9
20
 
10
21
  | Field | Format | Source |
@@ -12,17 +12,32 @@ const BASE_URL = process.env.BASE_URL || 'http://localhost:3000';
12
12
  * Page Object Pattern
13
13
  *
14
14
  * Extend BasePage to add page-specific selectors and actions.
15
- * Example:
16
- * class LoginPage extends BasePage {
15
+ * Each route gets its own file: pages/LoginPage.ts, pages/DashboardPage.ts
16
+ *
17
+ * Example LoginPage (create at tests/playwright/pages/LoginPage.ts):
18
+ *
19
+ * import { BasePage } from './BasePage';
20
+ * import type { Page } from '@playwright/test';
21
+ *
22
+ * export class LoginPage extends BasePage {
17
23
  * get usernameInput() { return this.byLabel('็”จๆˆทๅ'); }
18
24
  * get passwordInput() { return this.byLabel('ๅฏ†็ '); }
19
25
  * get submitBtn() { return this.byRole('button', { name: '็™ปๅฝ•' }); }
26
+ *
27
+ * constructor(page: Page) { super(page); }
28
+ *
20
29
  * async login(user: string, pass: string) {
30
+ * await this.goto('/login');
21
31
  * await this.fillAndVerify(this.usernameInput, user);
22
32
  * await this.fillAndVerify(this.passwordInput, pass);
23
- * await this.submitBtn.click();
33
+ * await this.click(this.submitBtn);
24
34
  * }
25
35
  * }
36
+ *
37
+ * Usage in spec:
38
+ * import { LoginPage } from '../pages/LoginPage';
39
+ * const loginPage = new LoginPage(page);
40
+ * await loginPage.login('user@example.com', 'password');
26
41
  */
27
42
  class AppPage extends BasePage {
28
43
  // Add page-specific selectors here