[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71F1TAY1M25N7CRSRPEVY2Z":3,"skill-same:01M71F1TAY1M25N7CRSRPEVY2Z":85},{"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":30,"publishedAt":51,"linkOnly":52,"markdownContent":53,"markdownBody":54,"frontMatter":55,"refName":64,"commitSha":65,"skillDirectory":66,"forksCount":67,"repositoryHtmlUrl":68,"repositoryHomepageUrl":6,"ownerHtmlUrl":69,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":70,"install":71,"resources":84},"01M71F1TAY1M25N7CRSRPEVY2Z","ui-browser-testing",null,"Canonical discipline for browser UI verification: when to run Playwright suites and smokes, how CLI vs MCP surfaces are chosen, and how to record evidence before merge. Complements tdd-flow for non-UI tests.","parada1104\u002Fai-specs-cli","parada1104","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F57575053?v=4","01M71EZZV71KAFZKJ47FQ99ZVS","01M71EZZW7JJBY2VAWA5HRD944",0,"MIT","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Fcatalog\u002Frecipes\u002Fplaywright-ui-flow\u002Fskills\u002Fui-browser-testing\u002FSKILL.md",[17,22,25],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":26,"categoryName":27,"taxonomyType":28,"taxonomyTypeDesc":29},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"ui browser testing","browser","browser testing","ui","testing","evidence","running","when","browser mcp","for","how to","tests","runtime","record","verification","pr","playwright cli","playwright","writing","MCP","2026-11-10 10:12:30",false,"---\nname: ui-browser-testing\ndescription: >\n  Canonical discipline for browser UI verification: when to run Playwright\n  suites and smokes, how CLI vs MCP surfaces are chosen, and how to record\n  evidence before merge. Complements tdd-flow for non-UI tests.\nlicense: MIT\nmetadata:\n  author: ai-specs\n  version: \"1.0\"\n  scope: runtime\n  auto_invoke:\n    - \"Running or writing Playwright UI tests or smokes\"\n    - \"Verifying UI behavior before merge or PR\"\n    - \"Choosing between Playwright CLI and browser MCP\"\n---\n\n# UI Browser Testing Discipline\n\nThis is the **canonical discipline** skill for the `ui-browser-testing`\ncapability. Tool-specific how-to lives in thin adapters:\n\n- `playwright-cli` — run\u002Fauthor suites via CLI\n- `playwright-mcp` — exploratory navigation, debug, locators (when enabled)\n\nDefer *how* on a surface to those adapters. Keep *when \u002F whether \u002F evidence*\nhere.\n\n## Relationship to tdd-flow\n\n- **`tdd-flow` (`test-runner`)** — unit\u002Fintegration RED\u002FGREEN against a generic\n  `test_command`.\n- **This skill (`ui-browser-testing`)** — browser UI suites, smokes, and\n  optional interactive exploration.\n\nBoth may be enabled. Do not treat UI smokes as a substitute for unit TDD, and\ndo not skip UI verification when the change touches user-facing UI.\n\n## Configuration\n\nRead from `[recipes.playwright-ui-flow.config]` in `ai-specs\u002Fai-specs.toml`:\n\n| Key | Required | Description |\n|---|---|---|\n| `ui_test_command` | no | Full UI suite (e.g. `npx playwright test`) |\n| `ui_smoke_command` | no | Fast smoke subset (e.g. `npx playwright test --grep @smoke`) |\n| `playwright_config` | no | Path to `playwright.config.*` if non-standard |\n\nIf smoke\u002Fsuite commands are unset, discover the project's Playwright scripts\n(`package.json`, config files), propose values for the human to accept, and do\n**not** invent a permanent default without recording it in config.\n\n## Hybrid surface precedence\n\n| Job | Preferred surface |\n|---|---|\n| Run UI suite \u002F smoke | CLI \u002F configured command |\n| Author or extend UI tests in-repo | CLI (+ repo test files); MCP optional for locator discovery |\n| Exploratory UI navigation \u002F debug | MCP (`playwright-mcp` recipe) when enabled |\n| Generate locators while writing tests | MCP when enabled; otherwise CLI snapshot\u002Fcodegen |\n\nWhen only one surface is enabled, degrade to that surface. Never require MCP\nfor suite\u002Fsmoke verification. Never use MCP tool calls as a substitute for the\nconfigured UI smoke\u002Fsuite command when claiming merge-ready UI verification.\n\n## Evidence policy\n\nBefore treating UI verification as done:\n\n1. Run `ui_smoke_command` if set, otherwise `ui_test_command` (or the agreed\n   discovered command).\n2. Record the **command** and **pass\u002Ffail** observation in the change's\n   verify\u002Fapply artifacts, PR body, or tracker update.\n3. Never claim a UI check passed unless that command was actually run and\n   observed to pass.\n\n## When to invoke adapters\n\n- Need to run or debug a suite command, install browsers, or use codegen →\n  load `playwright-cli`.\n- Need interactive page exploration or locator discovery and\n  `playwright-mcp` is enabled → load `playwright-mcp`.\n","# UI Browser Testing Discipline\n\nThis is the **canonical discipline** skill for the `ui-browser-testing`\ncapability. Tool-specific how-to lives in thin adapters:\n\n- `playwright-cli` — run\u002Fauthor suites via CLI\n- `playwright-mcp` — exploratory navigation, debug, locators (when enabled)\n\nDefer *how* on a surface to those adapters. Keep *when \u002F whether \u002F evidence*\nhere.\n\n## Relationship to tdd-flow\n\n- **`tdd-flow` (`test-runner`)** — unit\u002Fintegration RED\u002FGREEN against a generic\n  `test_command`.\n- **This skill (`ui-browser-testing`)** — browser UI suites, smokes, and\n  optional interactive exploration.\n\nBoth may be enabled. Do not treat UI smokes as a substitute for unit TDD, and\ndo not skip UI verification when the change touches user-facing UI.\n\n## Configuration\n\nRead from `[recipes.playwright-ui-flow.config]` in `ai-specs\u002Fai-specs.toml`:\n\n| Key | Required | Description |\n|---|---|---|\n| `ui_test_command` | no | Full UI suite (e.g. `npx playwright test`) |\n| `ui_smoke_command` | no | Fast smoke subset (e.g. `npx playwright test --grep @smoke`) |\n| `playwright_config` | no | Path to `playwright.config.*` if non-standard |\n\nIf smoke\u002Fsuite commands are unset, discover the project's Playwright scripts\n(`package.json`, config files), propose values for the human to accept, and do\n**not** invent a permanent default without recording it in config.\n\n## Hybrid surface precedence\n\n| Job | Preferred surface |\n|---|---|\n| Run UI suite \u002F smoke | CLI \u002F configured command |\n| Author or extend UI tests in-repo | CLI (+ repo test files); MCP optional for locator discovery |\n| Exploratory UI navigation \u002F debug | MCP (`playwright-mcp` recipe) when enabled |\n| Generate locators while writing tests | MCP when enabled; otherwise CLI snapshot\u002Fcodegen |\n\nWhen only one surface is enabled, degrade to that surface. Never require MCP\nfor suite\u002Fsmoke verification. Never use MCP tool calls as a substitute for the\nconfigured UI smoke\u002Fsuite command when claiming merge-ready UI verification.\n\n## Evidence policy\n\nBefore treating UI verification as done:\n\n1. Run `ui_smoke_command` if set, otherwise `ui_test_command` (or the agreed\n   discovered command).\n2. Record the **command** and **pass\u002Ffail** observation in the change's\n   verify\u002Fapply artifacts, PR body, or tracker update.\n3. Never claim a UI check passed unless that command was actually run and\n   observed to pass.\n\n## When to invoke adapters\n\n- Need to run or debug a suite command, install browsers, or use codegen →\n  load `playwright-cli`.\n- Need interactive page exploration or locator discovery and\n  `playwright-mcp` is enabled → load `playwright-mcp`.\n",{"name":5,"license":14,"metadata":56,"description":63},{"scope":43,"author":57,"version":58,"auto_invoke":59},"ai-specs","1.0",[60,61,62],"Running or writing Playwright UI tests or smokes","Verifying UI behavior before merge or PR","Choosing between Playwright CLI and browser MCP","Canonical discipline for browser UI verification: when to run Playwright suites and smokes, how CLI vs MCP surfaces are chosen, and how to record evidence before merge. Complements tdd-flow for non-UI tests.\n","main","c092fc1f51280350a4434827e2f6d6d99e3431ca","catalog\u002Frecipes\u002Fplaywright-ui-flow\u002Fskills\u002Fui-browser-testing",2,"https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli","https:\u002F\u002Fgithub.com\u002Fparada1104","2026-11-14 03:51:03",{"source":8,"skillName":5,"commands":72,"prompt":82,"zipAvailable":83},[73,76,79],{"tool":74,"command":75},"npx","npx skills add parada1104\u002Fai-specs-cli --skill ui-browser-testing",{"tool":77,"command":78},"bunx","bunx skills add parada1104\u002Fai-specs-cli --skill ui-browser-testing",{"tool":80,"command":81},"pnpm","pnpm dlx skills add parada1104\u002Fai-specs-cli --skill ui-browser-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Fcatalog\u002Frecipes\u002Fplaywright-ui-flow\u002Fskills\u002Fui-browser-testing\u002FSKILL.md",true,[],[86,100,114,123,132,145],{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":94,"publishedAt":51},"01M71F2TF9TS9DNCJ68M7C3B5S","test-skill","Test skill for fixture purposes.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Frecipes\u002Ftest-fixture\u002Fskills\u002Ftest-skill\u002FSKILL.md",[92,93],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[95,96,40,97,98,99,35],"Test Skill","test","root","fixtures","fixture",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":109,"publishedAt":51},"01M71F2RTH94ZB7XEAW4P6ZG0D","obsidian-markdown","Fixture skill for obsidian-markdown.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fkepano-obsidian-skills\u002Fskills\u002Fobsidian-markdown\u002FSKILL.md",[106],{"categoryNo":107,"categoryName":108,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000002","文档处理",[110,111,112,40,99,113],"markdown","obsidian markdown","obsidian","fixture skill",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":51},"01M71F2R20CPTJXD9F7DP4JPP6","obsidian-cli","Fixture skill for obsidian-cli.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fkepano-obsidian-skills\u002Fskills\u002Fobsidian-cli\u002FSKILL.md",[],[121,112,122,40,99,113],"obsidian cli","cli",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":51},"01M71F2PCH4NWVTT1J57SHJX33","obsidian-bases","Fixture skill for obsidian-bases.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fkepano-obsidian-skills\u002Fskills\u002Fobsidian-bases\u002FSKILL.md",[],[130,131,112,40,99,113],"bases","obsidian bases",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":141,"publishedAt":51},"01M71F2MSS6EVFEYVYAA1KBYCC","json-canvas","Fixture skill for json-canvas.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fkepano-obsidian-skills\u002Fskills\u002Fjson-canvas\u002FSKILL.md",[138],{"categoryNo":139,"categoryName":140,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",[142,143,144,113,99,40],"json","json canvas","canvas",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":51},"01M71F2KY5QVNEN1Q3REFB0MQZ","defuddle","Fixture skill for defuddle.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fkepano-obsidian-skills\u002Fskills\u002Fdefuddle\u002FSKILL.md",[],[147,113,99,40]]