[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F2TDV5FSYN425D8BNAVNBT":3,"skill-same:01M6F2TDV5FSYN425D8BNAVNBT":68},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M6F2TDV5FSYN425D8BNAVNBT","review",null,"Review Playwright tests for quality. Use when user says \"review tests\", \"check test quality\", \"audit tests\", \"improve tests\", \"test code review\", or \"playwright best practices check\".","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Falirezarezvani\u002Fclaude-skills\u002Freview\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[5,27,28,29,30,31,32,33,34,35,36,37,38,39],"code review","playwright","test","code","best practices","audit","improve","quality","check","user","use","tests","playwright best practices","2026-11-10 10:12:30",false,"---\nname: \"review\"\ndescription: >-\n  Review Playwright tests for quality. Use when user says \"review tests\",\n  \"check test quality\", \"audit tests\", \"improve tests\", \"test code review\",\n  or \"playwright best practices check\".\n---\n\n# Review Playwright Tests\n\nSystematically review Playwright test files for anti-patterns, missed best practices, and coverage gaps.\n\n## Input\n\n`$ARGUMENTS` can be:\n- A file path: review that specific test file\n- A directory: review all test files in the directory\n- Empty: review all tests in the project's `testDir`\n\n## Steps\n\n### 1. Gather Context\n\n- Read `playwright.config.ts` for project settings\n- List all `*.spec.ts` \u002F `*.spec.js` files in scope\n- If reviewing a single file, also check related page objects and fixtures\n\n### 2. Check Each File Against Anti-Patterns\n\nLoad `anti-patterns.md` from this skill directory. Check for all 20 anti-patterns.\n\n**Critical (must fix):**\n1. `waitForTimeout()` usage\n2. Non-web-first assertions (`expect(await ...)`)\n3. Hardcoded URLs instead of `baseURL`\n4. CSS\u002FXPath selectors when role-based exists\n5. Missing `await` on Playwright calls\n6. Shared mutable state between tests\n7. Test execution order dependencies\n\n**Warning (should fix):**\n8. Tests longer than 50 lines (consider splitting)\n9. Magic strings without named constants\n10. Missing error\u002Fedge case tests\n11. `page.evaluate()` for things locators can do\n12. Nested `test.describe()` more than 2 levels deep\n13. Generic test names (\"should work\", \"test 1\")\n\n**Info (consider):**\n14. No page objects for pages with 5+ locators\n15. Inline test data instead of factory\u002Ffixture\n16. Missing accessibility assertions\n17. No visual regression tests for UI-heavy pages\n18. Console error assertions not checked\n19. Network idle waits instead of specific assertions\n20. Missing `test.describe()` grouping\n\n### 3. Score Each File\n\nRate 1-10 based on:\n- **9-10**: Production-ready, follows all golden rules\n- **7-8**: Good, minor improvements possible\n- **5-6**: Functional but has anti-patterns\n- **3-4**: Significant issues, likely flaky\n- **1-2**: Needs rewrite\n\n### 4. Generate Review Report\n\nFor each file:\n```\n## \u003Cfilename> — Score: X\u002F10\n\n### Critical\n- Line 15: `waitForTimeout(2000)` → use `expect(locator).toBeVisible()`\n- Line 28: CSS selector `.btn-submit` → `getByRole('button', { name: \"submit\" })`\n\n### Warning\n- Line 42: Test name \"test login\" → \"should redirect to dashboard after login\"\n\n### Suggestions\n- Consider adding error case: what happens with invalid credentials?\n```\n\n### 5. For Project-Wide Review\n\nIf reviewing an entire test suite:\n- Spawn sub-agents per file for parallel review (up to 5 concurrent)\n- Or use `\u002Fbatch` for very large suites\n- Aggregate results into a summary table\n\n### 6. Offer Fixes\n\nFor each critical issue, provide the corrected code. Ask user: \"Apply these fixes? [Yes\u002FNo]\"\n\nIf yes, apply all fixes using `Edit` tool.\n\n## Output\n\n- File-by-file review with scores\n- Summary: total files, average score, critical issue count\n- Actionable fix list\n- Coverage gaps identified (pages\u002Ffeatures with no tests)\n\n","# Review Playwright Tests\n\nSystematically review Playwright test files for anti-patterns, missed best practices, and coverage gaps.\n\n## Input\n\n`$ARGUMENTS` can be:\n- A file path: review that specific test file\n- A directory: review all test files in the directory\n- Empty: review all tests in the project's `testDir`\n\n## Steps\n\n### 1. Gather Context\n\n- Read `playwright.config.ts` for project settings\n- List all `*.spec.ts` \u002F `*.spec.js` files in scope\n- If reviewing a single file, also check related page objects and fixtures\n\n### 2. Check Each File Against Anti-Patterns\n\nLoad `anti-patterns.md` from this skill directory. Check for all 20 anti-patterns.\n\n**Critical (must fix):**\n1. `waitForTimeout()` usage\n2. Non-web-first assertions (`expect(await ...)`)\n3. Hardcoded URLs instead of `baseURL`\n4. CSS\u002FXPath selectors when role-based exists\n5. Missing `await` on Playwright calls\n6. Shared mutable state between tests\n7. Test execution order dependencies\n\n**Warning (should fix):**\n8. Tests longer than 50 lines (consider splitting)\n9. Magic strings without named constants\n10. Missing error\u002Fedge case tests\n11. `page.evaluate()` for things locators can do\n12. Nested `test.describe()` more than 2 levels deep\n13. Generic test names (\"should work\", \"test 1\")\n\n**Info (consider):**\n14. No page objects for pages with 5+ locators\n15. Inline test data instead of factory\u002Ffixture\n16. Missing accessibility assertions\n17. No visual regression tests for UI-heavy pages\n18. Console error assertions not checked\n19. Network idle waits instead of specific assertions\n20. Missing `test.describe()` grouping\n\n### 3. Score Each File\n\nRate 1-10 based on:\n- **9-10**: Production-ready, follows all golden rules\n- **7-8**: Good, minor improvements possible\n- **5-6**: Functional but has anti-patterns\n- **3-4**: Significant issues, likely flaky\n- **1-2**: Needs rewrite\n\n### 4. Generate Review Report\n\nFor each file:\n```\n## \u003Cfilename> — Score: X\u002F10\n\n### Critical\n- Line 15: `waitForTimeout(2000)` → use `expect(locator).toBeVisible()`\n- Line 28: CSS selector `.btn-submit` → `getByRole('button', { name: \"submit\" })`\n\n### Warning\n- Line 42: Test name \"test login\" → \"should redirect to dashboard after login\"\n\n### Suggestions\n- Consider adding error case: what happens with invalid credentials?\n```\n\n### 5. For Project-Wide Review\n\nIf reviewing an entire test suite:\n- Spawn sub-agents per file for parallel review (up to 5 concurrent)\n- Or use `\u002Fbatch` for very large suites\n- Aggregate results into a summary table\n\n### 6. Offer Fixes\n\nFor each critical issue, provide the corrected code. Ask user: \"Apply these fixes? [Yes\u002FNo]\"\n\nIf yes, apply all fixes using `Edit` tool.\n\n## Output\n\n- File-by-file review with scores\n- Summary: total files, average score, critical issue count\n- Actionable fix list\n- Coverage gaps identified (pages\u002Ffeatures with no tests)\n\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Falirezarezvani\u002Fclaude-skills\u002Freview",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill review",{"tool":60,"command":61},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill review",{"tool":63,"command":64},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill review","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Falirezarezvani\u002Fclaude-skills\u002Freview\u002FSKILL.md",true,[],[69,81,91,100,106,113],{"skillNo":70,"name":71,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":77,"publishedAt":40},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[74],{"categoryNo":75,"categoryName":76,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[78,79,80],"model","model hierarchy","model hierarchy skill",{"skillNo":82,"name":83,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":87,"publishedAt":40},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[86],{"categoryNo":75,"categoryName":76,"taxonomyType":21,"taxonomyTypeDesc":22},[88,89,90],"MCP","zoom","zoom mcp",{"skillNo":92,"name":93,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":96,"publishedAt":40},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[97,98,99,89],"sdk","zoom apps sdk","apps",{"skillNo":101,"name":102,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":40},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[102],{"skillNo":107,"name":108,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":112,"publishedAt":40},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[111],{"categoryNo":75,"categoryName":76,"taxonomyType":21,"taxonomyTypeDesc":22},[108],{"skillNo":114,"name":115,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":40},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[115]]