[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C6A01GDNYJWG3647322JR3":3,"skill-same:01M6C6A01GDNYJWG3647322JR3":80},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":27,"publishedAt":54,"linkOnly":55,"markdownContent":56,"markdownBody":57,"frontMatter":58,"refName":59,"commitSha":60,"skillDirectory":61,"forksCount":62,"repositoryHtmlUrl":63,"repositoryHomepageUrl":6,"ownerHtmlUrl":64,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":65,"install":66,"resources":79},"01M6C6A01GDNYJWG3647322JR3","playwright",null,"Robust E2E browser testing with Playwright. Use when writing browser-driven tests — leverage auto-waiting (no `waitForTimeout`), prefer user-visible locators (`getByRole`, `getByText`, `getByLabel`) over CSS\u002FXPath, reuse `storageState` for auth, and enable trace-on-first-retry for CI debugging. Also carries the `data-testid` contract a UI change states in its acceptance criteria.","dsj1984\u002Fmandrel","dsj1984","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20933070?v=4","01M6C69AY3555XWE3QAXETZH6W","01M6C69B26E25DHM9NTPQ7TZQ9",7,"MIT","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fstack\u002Fqa\u002Fplaywright\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[5,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],"e2e","when","for","retry","states","reuse","leverage","tests","contract","auto","use","user","trace","first","testing","data","ci","ui","browser testing","browser","acceptance","debugging","auth","change","css","writing","2026-11-10 10:12:30",false,"---\nname: playwright\ndescription:\n  Robust E2E browser testing with Playwright. Use when writing browser-driven\n  tests — leverage auto-waiting (no `waitForTimeout`), prefer user-visible\n  locators (`getByRole`, `getByText`, `getByLabel`) over CSS\u002FXPath, reuse\n  `storageState` for auth, and enable trace-on-first-retry for CI debugging.\n  Also carries the `data-testid` contract a UI change states in its acceptance\n  criteria.\nvendor: playwright\n---\n\n# Skill: Playwright\n\n## Policy Capsule\n\n- Rely on Playwright's auto-waiting; never use `waitForTimeout` or hardcoded sleeps to paper over flakes.\n- Prefer user-visible locators (`getByRole`, `getByText`, `getByLabel`) over CSS selectors or XPath.\n- Reuse `storageState` to seed authenticated scenarios; do not repeat login flows in every test.\n- Use `toHaveScreenshot()` for critical visual surfaces; treat snapshot diffs as intentional reviews, not auto-refreshes.\n- Write tests independent of one another so they run in parallel; clean up shared state in fixtures, not afterwards.\n- Enable `trace: 'on-first-retry'` (or `'retain-on-failure'`) so CI failures are debuggable in the Trace Viewer.\n- Use a unique data set per test run, or tear down state explicitly, to prevent cross-test contamination.\n- Never let Playwright own the lifetime of a dev server it did not start: boot the server out-of-band, point the suite at the running origin, and set `reuseExistingServer` so `webServer` only probes readiness.\n\n## The testid contract\n\nA `data-testid` is a selector two artifacts share: the component that renders\nit and the spec that queries it. Renaming one without the other is a silent\nbreak — the suite still compiles, and the failure arrives as a missing element\nat run time, in CI, attributed to whichever change happened to land next.\n\nSo a change touching UI (`*.tsx`, `*.astro`, `*.svelte`, `*.vue`, a components\nfolder) states which side of that contract it is on, in its own acceptance\ncriteria, as one of:\n\n- **`data-testid invariance: \u003Cthe testids that MUST be preserved>`** — the\n  change reshapes markup and renames nothing, and the list says what the\n  reshape may not touch.\n- **`data-testid changes: \u003Cold> -> \u003Cnew>, with the matching\n  tests\u002Fe2e\u002F*.spec.ts selector updated`** — the rename is deliberate, and the\n  spec file that queries it is edited in the same change (or in one ordered\n  ahead of it, when the work is split).\n\nRenaming a testid without the matching spec edit is forbidden either way. When\na change deliberately renames nothing, say so in its negative-scope prose too:\na preserved set stated only once reads as an omission the next author is free\nto revise.\n\n## Running a `webServer`-backed suite outside CI\n\nPlaywright's `webServer` block **watches the process it spawned**. That\nassumption holds for a dev server that stays in the foreground, and breaks for\nany manager that daemonizes one — the foreground process exits `0` while the\nserver keeps serving, Playwright reads the exit as a crash, and the run aborts\nbefore a single test executes:\n\n```text\nProcess from config.webServer exited early\n```\n\nRead that line as a **lifetime-ownership mismatch, not a flake**. It reproduces\non every invocation, clean tree or not, and no amount of retrying, tree-cleaning\nor timeout-raising changes it. Agent sandboxes and IDE harnesses commonly manage\ndev servers this way (`Dev server already running at … (pid N)`), so an agent\nmeets this far more often than a developer does.\n\n### Attach, don't boot\n\nInvert the ownership instead of fighting it — the manager owns the process,\nPlaywright owns only the probe:\n\n1. **Boot the server out-of-band** through whatever manages it, and confirm it\n   is serving. Its lifetime is now the manager's concern, not the runner's.\n2. **Point the suite at the already-running origin** — set the config's\n   `baseURL` (or the `webServer.url` the block probes) to that origin, via the\n   project's own environment seam rather than an edit to committed config.\n3. **Set `reuseExistingServer: true`** so Playwright probes the URL, finds it\n   live, and never spawns or supervises a process of its own.\n\nThis is the same convention the QA harness already encodes as\n`qa.environments[].baseUrl`: attach to a running origin, never boot one. A suite\nrun this way exercises identical browser behavior — only the process supervision\ndiffers.\n\n### When no attachable origin exists\n\nSome apps genuinely cannot be reached this way — the server is unreachable from\nthe sandbox, or the suite depends on a build step the sandbox cannot run. Do\n**not** burn a timebox rediscovering that. Record the observed signature, state\nwhich of the three steps above failed, and escalate on the first encounter:\nthat evidence is exactly what the `unreproducible-tier` verdict in\n[`ci-remediation.md`](..\u002F..\u002F..\u002F..\u002Frules\u002Fci-remediation.md) requires, and it is\nthe only verdict that lets an unrunnable tier route somewhere other than a dead\nend.\n","# Skill: Playwright\n\n## Policy Capsule\n\n- Rely on Playwright's auto-waiting; never use `waitForTimeout` or hardcoded sleeps to paper over flakes.\n- Prefer user-visible locators (`getByRole`, `getByText`, `getByLabel`) over CSS selectors or XPath.\n- Reuse `storageState` to seed authenticated scenarios; do not repeat login flows in every test.\n- Use `toHaveScreenshot()` for critical visual surfaces; treat snapshot diffs as intentional reviews, not auto-refreshes.\n- Write tests independent of one another so they run in parallel; clean up shared state in fixtures, not afterwards.\n- Enable `trace: 'on-first-retry'` (or `'retain-on-failure'`) so CI failures are debuggable in the Trace Viewer.\n- Use a unique data set per test run, or tear down state explicitly, to prevent cross-test contamination.\n- Never let Playwright own the lifetime of a dev server it did not start: boot the server out-of-band, point the suite at the running origin, and set `reuseExistingServer` so `webServer` only probes readiness.\n\n## The testid contract\n\nA `data-testid` is a selector two artifacts share: the component that renders\nit and the spec that queries it. Renaming one without the other is a silent\nbreak — the suite still compiles, and the failure arrives as a missing element\nat run time, in CI, attributed to whichever change happened to land next.\n\nSo a change touching UI (`*.tsx`, `*.astro`, `*.svelte`, `*.vue`, a components\nfolder) states which side of that contract it is on, in its own acceptance\ncriteria, as one of:\n\n- **`data-testid invariance: \u003Cthe testids that MUST be preserved>`** — the\n  change reshapes markup and renames nothing, and the list says what the\n  reshape may not touch.\n- **`data-testid changes: \u003Cold> -> \u003Cnew>, with the matching\n  tests\u002Fe2e\u002F*.spec.ts selector updated`** — the rename is deliberate, and the\n  spec file that queries it is edited in the same change (or in one ordered\n  ahead of it, when the work is split).\n\nRenaming a testid without the matching spec edit is forbidden either way. When\na change deliberately renames nothing, say so in its negative-scope prose too:\na preserved set stated only once reads as an omission the next author is free\nto revise.\n\n## Running a `webServer`-backed suite outside CI\n\nPlaywright's `webServer` block **watches the process it spawned**. That\nassumption holds for a dev server that stays in the foreground, and breaks for\nany manager that daemonizes one — the foreground process exits `0` while the\nserver keeps serving, Playwright reads the exit as a crash, and the run aborts\nbefore a single test executes:\n\n```text\nProcess from config.webServer exited early\n```\n\nRead that line as a **lifetime-ownership mismatch, not a flake**. It reproduces\non every invocation, clean tree or not, and no amount of retrying, tree-cleaning\nor timeout-raising changes it. Agent sandboxes and IDE harnesses commonly manage\ndev servers this way (`Dev server already running at … (pid N)`), so an agent\nmeets this far more often than a developer does.\n\n### Attach, don't boot\n\nInvert the ownership instead of fighting it — the manager owns the process,\nPlaywright owns only the probe:\n\n1. **Boot the server out-of-band** through whatever manages it, and confirm it\n   is serving. Its lifetime is now the manager's concern, not the runner's.\n2. **Point the suite at the already-running origin** — set the config's\n   `baseURL` (or the `webServer.url` the block probes) to that origin, via the\n   project's own environment seam rather than an edit to committed config.\n3. **Set `reuseExistingServer: true`** so Playwright probes the URL, finds it\n   live, and never spawns or supervises a process of its own.\n\nThis is the same convention the QA harness already encodes as\n`qa.environments[].baseUrl`: attach to a running origin, never boot one. A suite\nrun this way exercises identical browser behavior — only the process supervision\ndiffers.\n\n### When no attachable origin exists\n\nSome apps genuinely cannot be reached this way — the server is unreachable from\nthe sandbox, or the suite depends on a build step the sandbox cannot run. Do\n**not** burn a timebox rediscovering that. Record the observed signature, state\nwhich of the three steps above failed, and escalate on the first encounter:\nthat evidence is exactly what the `unreproducible-tier` verdict in\n[`ci-remediation.md`](..\u002F..\u002F..\u002F..\u002Frules\u002Fci-remediation.md) requires, and it is\nthe only verdict that lets an unrunnable tier route somewhere other than a dead\nend.\n",{"name":5,"vendor":5,"description":7},"main","1ebd42c768218cb54c92d3dfd25b42c9ec41c85c",".agents\u002Fskills\u002Fstack\u002Fqa\u002Fplaywright",1,"https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel","https:\u002F\u002Fgithub.com\u002Fdsj1984","2026-11-13 20:41:44",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add dsj1984\u002Fmandrel --skill playwright",{"tool":72,"command":73},"bunx","bunx skills add dsj1984\u002Fmandrel --skill playwright",{"tool":75,"command":76},"pnpm","pnpm dlx skills add dsj1984\u002Fmandrel --skill playwright","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fstack\u002Fqa\u002Fplaywright\u002FSKILL.md",true,[],[81,95,129,151,172,192],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":90,"publishedAt":54},"01M6C6A5QVWE0AEWJYC362G9BY","no-capsule-skill","Fixture without a Policy Capsule section.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002Ftests\u002Forchestration\u002Ffixtures\u002Fskill-capsule\u002Fno-capsule-skill\u002FSKILL.md",[87],{"categoryNo":88,"categoryName":89,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[91,92,93,94],"no capsule skill","policy","fixture","section",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":105,"publishedAt":54},"01M6C6A2VK7QVY7H5NC6SG89DT","qa-harness","Conventions for agent-driven QA driving — the one driving-conventions reference behind both `\u002Fqa-run` (the known-scenario sweep through a real browser) and `\u002Fqa-explore` (agent-led exploratory driving). Use when instrumenting a live surface — covers navigation-first execution, per-surface console and network capture, design-token visual checks, the `F#` finding shape, per-environment resolution, and static driving as the documented interim. The run procedures live in `.agents\u002Fworkflows\u002Fqa-run.md` and `.agents\u002Fworkflows\u002Fqa-explore.md`; this skill is the conventions reference they lean on.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fstack\u002Fqa\u002Fqa-harness\u002FSKILL.md",[101,104],{"categoryNo":102,"categoryName":103,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":88,"categoryName":89,"taxonomyType":20,"taxonomyTypeDesc":21},[106,107,108,109,110,111,112,47,113,114,41,115,116,117,118,119,38,120,121,122,123,124,125,126,127,30,128,29],"qa","harness","qa harness","design","workflows","run","console","network","execution","explore","sweep","capture","environment","lean","shape","reference","navigation","real browser","token","live","scenario","as","static",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":136,"publishedAt":54},"01M6C69Y3SR8BJ8XRT0E0S6Z4S","playwright-bdd","Wires Gherkin `.feature` files to Playwright via the `playwright-bdd` library. Use when running BDD scenarios on a Playwright runtime — pairs with the `gherkin-authoring` skill (scenario prose) and the `playwright` skill (browser conventions). Drives execution by tag expression with trace-first debugging and Playwright-native sharding.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fstack\u002Fqa\u002Fplaywright-bdd\u002FSKILL.md",[135],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[5,137,138,49,47,139,114,41,40,38,140,141,142,143,144,145,146,147,148,149,29,150],"bdd","playwright bdd","library","bdd scenarios","files","runtime","feature","authoring","expression","via","native","with","Sharding","running",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":157,"publishedAt":54},"01M6C69VESMZC07ACCXGJ1MQ8W","gherkin-authoring","Authors `.feature` files that stay business-readable, translate cleanly from PRD acceptance criteria, and reuse a shared step-definition library. Use when writing or editing scenarios — the SSOT enforcement rules live in `.agents\u002Frules\u002Fgherkin-standards.md`; this skill shows authors how to apply them.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fstack\u002Fqa\u002Fgherkin-authoring\u002FSKILL.md",[],[158,144,53,159,48,139,160,161,162,163,164,38,165,166,141,167,168,143,169,33,170,171,29],"gherkin authoring","translate","prd","how","Rules","editing","business","standards","enforcement","acceptance criteria","shared","how to","definition","apply",{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":54},"01M6C69RYKQDPM0C1QGJZ8B4ZV","security-and-hardening","Hardens code against vulnerabilities. Use when handling user input, authentication, data storage, or external integrations. The non-negotiable security MUSTs live in `.agents\u002Frules\u002Fsecurity-baseline.md`; this skill shows how to apply them, with the project's surfacing and validation-response process.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcore\u002Fsecurity-and-hardening\u002FSKILL.md",[],[179,180,181,182,183,184,185,186,43,187,161,188,162,39,189,38,190,191,169,148,171,29],"security","hardening","security and hardening","vulnerabilities","storage","code","authentication","validation","baseline","integrations","process","project","data storage",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":198,"publishedAt":54},"01M6C69Q97BQRDAV6RZ3K05K2H","idea-refinement","Refines ideas iteratively. Refine ideas through structured divergent and convergent thinking. Use \"idea-refine\" or \"ideate\" to trigger.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcore\u002Fidea-refinement\u002FSKILL.md",[],[199,200,201,202,38,203,204,205,206,207],"idea refinement","idea","refinement","ideate","thinking","refine","ideas","structured","trigger"]