[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6D6M3ZQ7XMMBQTYM91EHYSC":3,"skill-same:01M6D6M3ZQ7XMMBQTYM91EHYSC":70},{"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":23,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":37,"commitSha":38,"skillDirectory":39,"forksCount":40,"repositoryHtmlUrl":41,"repositoryHomepageUrl":6,"ownerHtmlUrl":42,"ownerBlogUrl":43,"ownerDescription":44,"updatedAt":45,"install":46,"resources":59},"01M6D6M3ZQ7XMMBQTYM91EHYSC","migrate",null,"Migrate from Cypress or Selenium to Playwright. Use when user mentions \"cypress\", \"selenium\", \"migrate tests\", \"convert tests\", \"switch to playwright\", \"move from cypress\", or \"replace selenium\".","oabdelmaksoud\u002FSuperClaw","oabdelmaksoud","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F50699149?v=4","01M6D5CVVN778ZCDP1WHS816SP","Omar Abdelmaksoud","01M6D5CW1RHNSKCJR85GJACBFT",2,"MIT","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-import\u002Fclaude-skills\u002Freferences\u002Fengineering-team\u002Fplaywright-pro\u002Fskills\u002Fmigrate\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31],"playwright","selenium","convert","user","use","switch","tests","cypress","2026-11-10 10:12:30",false,"---\nname: migrate\ndescription: >-\n  Migrate from Cypress or Selenium to Playwright. Use when user mentions\n  \"cypress\", \"selenium\", \"migrate tests\", \"convert tests\", \"switch to\n  playwright\", \"move from cypress\", or \"replace selenium\".\n---\n\n# Migrate to Playwright\n\nInteractive migration from Cypress or Selenium to Playwright with file-by-file conversion.\n\n## Input\n\n`$ARGUMENTS` can be:\n- `\"from cypress\"` — migrate Cypress test suite\n- `\"from selenium\"` — migrate Selenium\u002FWebDriver tests\n- A file path: convert a specific test file\n- Empty: auto-detect source framework\n\n## Steps\n\n### 1. Detect Source Framework\n\nUse `Explore` subagent to scan:\n- `cypress\u002F` directory or `cypress.config.ts` → Cypress\n- `selenium`, `webdriver` in `package.json` deps → Selenium\n- `.py` test files with `selenium` imports → Selenium (Python)\n\n### 2. Assess Migration Scope\n\nCount files and categorize:\n\n```\nMigration Assessment:\n- Total test files: X\n- Cypress custom commands: Y\n- Cypress fixtures: Z\n- Estimated effort: [small|medium|large]\n```\n\n| Size | Files | Approach |\n|---|---|---|\n| Small (1-10) | Convert sequentially | Direct conversion |\n| Medium (11-30) | Batch in groups of 5 | Use sub-agents |\n| Large (31+) | Use `\u002Fbatch` | Parallel conversion with `\u002Fbatch` |\n\n### 3. Set Up Playwright (If Not Present)\n\nRun `\u002Fpw:init` first if Playwright isn't configured.\n\n### 4. Convert Files\n\nFor each file, apply the appropriate mapping:\n\n#### Cypress → Playwright\n\nLoad `cypress-mapping.md` for complete reference.\n\nKey translations:\n```\ncy.visit(url)           → page.goto(url)\ncy.get(selector)        → page.locator(selector) or page.getByRole(...)\ncy.contains(text)       → page.getByText(text)\ncy.find(selector)       → locator.locator(selector)\ncy.click()              → locator.click()\ncy.type(text)           → locator.fill(text)\ncy.should('be.visible') → expect(locator).toBeVisible()\ncy.should('have.text')  → expect(locator).toHaveText(text)\ncy.intercept()          → page.route()\ncy.wait('@alias')       → page.waitForResponse()\ncy.fixture()            → JSON import or test data file\n```\n\n**Cypress custom commands** → Playwright fixtures or helper functions\n**Cypress plugins** → Playwright config or fixtures\n**`before`\u002F`beforeEach`** → `test.beforeAll()` \u002F `test.beforeEach()`\n\n#### Selenium → Playwright\n\nLoad `selenium-mapping.md` for complete reference.\n\nKey translations:\n```\ndriver.get(url)                    → page.goto(url)\ndriver.findElement(By.id('x'))     → page.locator('#x') or page.getByTestId('x')\ndriver.findElement(By.css('.x'))   → page.locator('.x') or page.getByRole(...)\nelement.click()                    → locator.click()\nelement.sendKeys(text)             → locator.fill(text)\nelement.getText()                  → locator.textContent()\nWebDriverWait + ExpectedConditions → expect(locator).toBeVisible()\ndriver.switchTo().frame()          → page.frameLocator()\nActions                            → locator.hover(), locator.dragTo()\n```\n\n### 5. Upgrade Locators\n\nDuring conversion, upgrade selectors to Playwright best practices:\n- `#id` → `getByTestId()` or `getByRole()`\n- `.class` → `getByRole()` or `getByText()`\n- `[data-testid]` → `getByTestId()`\n- XPath → role-based locators\n\n### 6. Convert Custom Commands \u002F Utilities\n\n- Cypress custom commands → Playwright custom fixtures via `test.extend()`\n- Selenium page objects → Playwright page objects (keep structure, update API)\n- Shared helpers → TypeScript utility functions\n\n### 7. Verify Each Converted File\n\nAfter converting each file:\n\n```bash\nnpx playwright test \u003Cconverted-file> --reporter=list\n```\n\nFix any compilation or runtime errors before moving to the next file.\n\n### 8. Clean Up\n\nAfter all files are converted:\n- Remove Cypress\u002FSelenium dependencies from `package.json`\n- Remove old config files (`cypress.config.ts`, etc.)\n- Update CI workflow to use Playwright\n- Update README with new test commands\n\nAsk user before deleting anything.\n\n## Output\n\n- Conversion summary: files converted, total tests migrated\n- Any tests that couldn't be auto-converted (manual intervention needed)\n- Updated CI config\n- Before\u002Fafter comparison of test run results\n","# Migrate to Playwright\n\nInteractive migration from Cypress or Selenium to Playwright with file-by-file conversion.\n\n## Input\n\n`$ARGUMENTS` can be:\n- `\"from cypress\"` — migrate Cypress test suite\n- `\"from selenium\"` — migrate Selenium\u002FWebDriver tests\n- A file path: convert a specific test file\n- Empty: auto-detect source framework\n\n## Steps\n\n### 1. Detect Source Framework\n\nUse `Explore` subagent to scan:\n- `cypress\u002F` directory or `cypress.config.ts` → Cypress\n- `selenium`, `webdriver` in `package.json` deps → Selenium\n- `.py` test files with `selenium` imports → Selenium (Python)\n\n### 2. Assess Migration Scope\n\nCount files and categorize:\n\n```\nMigration Assessment:\n- Total test files: X\n- Cypress custom commands: Y\n- Cypress fixtures: Z\n- Estimated effort: [small|medium|large]\n```\n\n| Size | Files | Approach |\n|---|---|---|\n| Small (1-10) | Convert sequentially | Direct conversion |\n| Medium (11-30) | Batch in groups of 5 | Use sub-agents |\n| Large (31+) | Use `\u002Fbatch` | Parallel conversion with `\u002Fbatch` |\n\n### 3. Set Up Playwright (If Not Present)\n\nRun `\u002Fpw:init` first if Playwright isn't configured.\n\n### 4. Convert Files\n\nFor each file, apply the appropriate mapping:\n\n#### Cypress → Playwright\n\nLoad `cypress-mapping.md` for complete reference.\n\nKey translations:\n```\ncy.visit(url)           → page.goto(url)\ncy.get(selector)        → page.locator(selector) or page.getByRole(...)\ncy.contains(text)       → page.getByText(text)\ncy.find(selector)       → locator.locator(selector)\ncy.click()              → locator.click()\ncy.type(text)           → locator.fill(text)\ncy.should('be.visible') → expect(locator).toBeVisible()\ncy.should('have.text')  → expect(locator).toHaveText(text)\ncy.intercept()          → page.route()\ncy.wait('@alias')       → page.waitForResponse()\ncy.fixture()            → JSON import or test data file\n```\n\n**Cypress custom commands** → Playwright fixtures or helper functions\n**Cypress plugins** → Playwright config or fixtures\n**`before`\u002F`beforeEach`** → `test.beforeAll()` \u002F `test.beforeEach()`\n\n#### Selenium → Playwright\n\nLoad `selenium-mapping.md` for complete reference.\n\nKey translations:\n```\ndriver.get(url)                    → page.goto(url)\ndriver.findElement(By.id('x'))     → page.locator('#x') or page.getByTestId('x')\ndriver.findElement(By.css('.x'))   → page.locator('.x') or page.getByRole(...)\nelement.click()                    → locator.click()\nelement.sendKeys(text)             → locator.fill(text)\nelement.getText()                  → locator.textContent()\nWebDriverWait + ExpectedConditions → expect(locator).toBeVisible()\ndriver.switchTo().frame()          → page.frameLocator()\nActions                            → locator.hover(), locator.dragTo()\n```\n\n### 5. Upgrade Locators\n\nDuring conversion, upgrade selectors to Playwright best practices:\n- `#id` → `getByTestId()` or `getByRole()`\n- `.class` → `getByRole()` or `getByText()`\n- `[data-testid]` → `getByTestId()`\n- XPath → role-based locators\n\n### 6. Convert Custom Commands \u002F Utilities\n\n- Cypress custom commands → Playwright custom fixtures via `test.extend()`\n- Selenium page objects → Playwright page objects (keep structure, update API)\n- Shared helpers → TypeScript utility functions\n\n### 7. Verify Each Converted File\n\nAfter converting each file:\n\n```bash\nnpx playwright test \u003Cconverted-file> --reporter=list\n```\n\nFix any compilation or runtime errors before moving to the next file.\n\n### 8. Clean Up\n\nAfter all files are converted:\n- Remove Cypress\u002FSelenium dependencies from `package.json`\n- Remove old config files (`cypress.config.ts`, etc.)\n- Update CI workflow to use Playwright\n- Update README with new test commands\n\nAsk user before deleting anything.\n\n## Output\n\n- Conversion summary: files converted, total tests migrated\n- Any tests that couldn't be auto-converted (manual intervention needed)\n- Updated CI config\n- Before\u002Fafter comparison of test run results\n",{"name":5,"description":7},"main","7b610356e36623652299fa2acb477ff821b1d920","upstream-import\u002Fclaude-skills\u002Freferences\u002Fengineering-team\u002Fplaywright-pro\u002Fskills\u002Fmigrate",0,"https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fo-abdelmaksoud\u002F","Full-Stack Engineer | AI Systems Architect | Building autonomous multi-agent systems","2026-03-08 21:12:53",{"source":8,"skillName":5,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add oabdelmaksoud\u002FSuperClaw --skill migrate",{"tool":52,"command":53},"bunx","bunx skills add oabdelmaksoud\u002FSuperClaw --skill migrate",{"tool":55,"command":56},"pnpm","pnpm dlx skills add oabdelmaksoud\u002FSuperClaw --skill migrate","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-import\u002Fclaude-skills\u002Freferences\u002Fengineering-team\u002Fplaywright-pro\u002Fskills\u002Fmigrate\u002FSKILL.md",true,[60,66],{"path":61,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":65},"cypress-mapping.md","REFERENCE","参考文档",3682,"https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-import\u002Fclaude-skills\u002Freferences\u002Fengineering-team\u002Fplaywright-pro\u002Fskills\u002Fmigrate\u002Fcypress-mapping.md",{"path":67,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":68,"sourceHtmlUrl":69},"selenium-mapping.md",4510,"https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-import\u002Fclaude-skills\u002Freferences\u002Fengineering-team\u002Fplaywright-pro\u002Fskills\u002Fmigrate\u002Fselenium-mapping.md",[71,90,104,131,157,176],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":80,"publishedAt":32},"01M6D88QCPTBZVCRED0NZ1Y8K8","visa-doc-translate","Translate visa application documents (images) to English and create a bilingual PDF with original and translation","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fvisa-doc-translate\u002FSKILL.md",[77],{"categoryNo":78,"categoryName":79,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理",[81,82,83,84,85,86,87,88,89],"translate","doc","visa doc translate","translation","application","create","images","PDF","documents",{"skillNo":91,"name":92,"nameZh":6,"description":93,"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":32},"01M6D88NBM95T3TFM50CYYAP65","verification-loop","A comprehensive verification system for Claude Code sessions.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fverification-loop\u002FSKILL.md",[],[97,98,99,100,101,102,103],"verification","loop","verification loop","sessions","code","claude code sessions","system",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":119,"publishedAt":32},"01M6D88JFZ2P996GVRHJNSZSTM","tdd-workflow","Use this skill when writing new features, fixing bugs, or refactoring code. Enforces test-driven development with 80%+ coverage including unit, integration, and E2E tests.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Ftdd-workflow\u002FSKILL.md",[110,111,114],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":112,"categoryName":113,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":115,"categoryName":116,"taxonomyType":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[120,121,122,123,124,125,101,126,28,127,128,129,30,130],"tdd","workflow","tdd workflow","e2e tests","e2e","integration","development","test","refactoring","coverage","writing",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":32},"01M6D88FTHRRSVJMXF2G7MQAK3","swiftui-patterns","SwiftUI architecture patterns, state management with @Observable, view composition, navigation, performance optimization, and modern iOS\u002FmacOS UI best practices.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswiftui-patterns\u002FSKILL.md",[],[138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156],"patterns","swiftui","swiftui patterns","architecture","macos","performance","state management","best practices","state","ui","Optimization","ios","architecture patterns","Composition","performance optimization","view","management","swiftui architecture","navigation",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":164,"publishedAt":32},"01M6D88D527QTQT9DKHTRFN6EA","swift-protocol-di-testing","Protocol-based dependency injection for testable Swift code — mock file system, network, and external APIs using focused protocols and Swift Testing.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswift-protocol-di-testing\u002FSKILL.md",[163],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[165,166,167,168,101,169,170,171,172,103,173,174,175],"swift protocol di testing","protocol","swift","testing","protocols","file","network","injection","dependency","swift testing","dependency injection",{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":182,"publishedAt":32},"01M6D88AJW8H2QNWSW5ZY82R43","swift-concurrency-6-2","Swift 6.2 Approachable Concurrency — single-threaded by default, @concurrent for explicit background offloading, isolated conformances for main actor types.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswift-concurrency-6-2\u002FSKILL.md",[],[183,184,167,185,186,37],"concurrency","swift concurrency","swift concurrency 6 2","default"]