[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69998DRR0DMSH3N60ZCWVKB":3,"skill-same:01M69998DRR0DMSH3N60ZCWVKB":91},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":53,"repositoryHtmlUrl":54,"repositoryHomepageUrl":55,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":72},"01M69998DRR0DMSH3N60ZCWVKB","playwright-test-results",null,"Query Playwright CI test results from the aggregated DuckDB database. Answers questions about flaky tests, failure rates, slow tests, and per-run\u002FSHA\u002FPR results without hunting through GitHub artifacts.","microsoft\u002Fplaywright","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M6998NK29WMCQG4W7K65QXNR",99877,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fplaywright-test-results\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"playwright","test","playwright test results","results","true","github","hunting","questions","about","tests","duckdb","query","ci","database","artifacts","run","pr","2026-11-10 10:12:30",false,"---\nname: playwright-test-results\ndescription: Query Playwright CI test results from the aggregated DuckDB database. Answers questions about flaky tests, failure rates, slow tests, and per-run\u002FSHA\u002FPR results without hunting through GitHub artifacts.\nuser_invocable: true\n---\n\n# Playwright Test Results (DuckDB)\n\nA single DuckDB file holds recent Playwright CI test results, so you can answer\nquestions about failures, flakiness, and slow tests with plain SQL. It is\nrefreshed every few hours.\n\n## Get the database\n\nDownload the latest snapshot and top it up with the newest runs:\n\n```bash\nnpm ci                       # first time only, from the repo root\nGITHUB_TOKEN=$(gh auth token) node utils\u002Ftest-results-db\u002Fcli.ts update --lookback-days 3\n```\n\n`update` downloads the snapshot first when there is no local database, then\ningests only the artifacts the snapshot lacks. Never delete the database to\nrebuild it: every artifact costs one GitHub API request, the budget is shared\nby every workflow in the repository, and a rebuild of a few days exhausts it.\nTo only refresh the snapshot without ingesting, run `download`.\n\nQuery it through the bundled `@duckdb\u002Fnode-api` binding — no separate DuckDB\ninstall needed, it ships in `node_modules` after `npm ci`:\n\n```bash\nnode --input-type=module -e '\nimport { DuckDBInstance } from \"@duckdb\u002Fnode-api\";\nconst conn = await (await DuckDBInstance.create(\"utils\u002Ftest-results-db\u002Ftest-results.duckdb\")).connect();\nconsole.table((await conn.runAndReadAll(process.argv[1])).getRowObjectsJson());\n' \"SELECT count(*) FROM test_results\"\n```\n\nInteger columns come back as strings (JSON-safe), so do ranking and filtering\nin SQL, not in JS.\n\n## Schema\n\nSingle table `test_results`, one row per test result (**one row per retry**).\nThe columns are inferred from the parquet the reporter emits\n(`tests\u002Fconfig\u002FparquetReporter.ts`), plus two trailing columns this CLI adds:\n\n| Column | Meaning |\n| --- | --- |\n| `run_id`, `run_attempt` | GitHub Actions run identity |\n| `run_started_at` | when the run started |\n| `workflow_name` | e.g. `tests 1` \u002F `tests 2` \u002F `tests others` \u002F `MCP` |\n| `event` | `push` \u002F `pull_request` |\n| `head_sha`, `head_branch`, `pr_number` | what was tested |\n| `bot_name` | e.g. `chromium-ubuntu-22.04-node20`, `webkit-macos-15-large` — the CI bot. **OS and arch are encoded here**; there is no separate os column. |\n| `project_name` | CI project = browser + suite, e.g. `chromium-page`, `webkit-library`, `playwright-test` |\n| `test_title` | title path within the file, joined by ` › ` (`describe › test`) |\n| `file`, `line`, `column_number` | source location (file is relative to repo root) |\n| `expected_status` | `passed` \u002F `skipped` \u002F ... |\n| `status` | actual result: `passed` \u002F `failed` \u002F `timedOut` \u002F `skipped` \u002F `interrupted` |\n| `retry` | 0 = first attempt |\n| `result_started_at` | when this attempt started |\n| `duration_ms` | result duration |\n| `error_message` | all errors joined, ANSI-stripped (NULL when none) |\n| `tags` | **list** of strings, e.g. `['@slow', '@flaky']` (use list functions \u002F `list_contains`) |\n| `annotations` | list of `{type, description}` structs, e.g. `[{'type': 'skip', 'description': 'flaky on CI'}]` (empty list when none) |\n| `artifact_id` | the GitHub artifact this row came from (dedupe key) |\n| `ingested_at` | debug only — when this row was imported |\n\nNotes:\n- **A test is identified by `(project_name, file, test_title)`** — group on that\n  tuple. (Playwright's `test_id` hash is deliberately not stored; those three\n  columns are its pre-image.)\n- **Flakiness is derived**, not stored. The signal that matters most is\n  **cross-run**: a test whose *final* verdict (after retries) flips between\n  runs — green in some, red in others. A separate **within-run** flake is a\n  test a retry rescued inside a single run (`failed`→`passed`).\n- **Real failures vs intentional ones:** filter `expected_status = 'passed'`.\n  Tests marked `test.fail()` record `status='failed'` *with*\n  `expected_status='failed'` and would otherwise dominate any \"most failing\" list.\n- The db is size-capped by **run count**: the oldest whole runs are evicted over\n  time, so it holds a recent window, not full history.\n\n## Example queries\n\nGroup tests by `(project_name, file, test_title)` and (for failure\u002Fflakiness)\nscope to `expected_status = 'passed'` so intentional `test.fail()` tests don't\nskew the results.\n\n**Flaky across runs** — the test's final verdict flips between runs (this is\nwhat makes a red CI run ambiguous). `least(failed_runs, passed_runs)` ranks\ngenuinely bimodal tests above both always-broken and one-off failures:\n\n```sql\nWITH per_run AS (\n  SELECT project_name, file, test_title, run_id, run_attempt,\n         arg_max(status, retry) AS final_status,\n         any_value(expected_status) AS expected\n  FROM test_results\n  GROUP BY project_name, file, test_title, run_id, run_attempt)\nSELECT project_name, test_title,\n       count(*) AS runs,\n       count(*) FILTER (WHERE final_status IN ('failed','timedOut')) AS failed_runs,\n       count(*) FILTER (WHERE final_status = 'passed') AS passed_runs,\n       round(100.0 * count(*) FILTER (WHERE final_status IN ('failed','timedOut'))\n             \u002F count(*), 1) AS fail_pct\nFROM per_run\nWHERE expected = 'passed'\nGROUP BY project_name, test_title\nHAVING failed_runs > 0 AND passed_runs > 0 AND runs >= 10\nORDER BY least(failed_runs, passed_runs) DESC, failed_runs DESC\nLIMIT 20;\n```\n\n**Filter by tag** (`tags` is a list, not a string):\n\n```sql\nSELECT project_name, test_title, count(*) AS runs\nFROM test_results\nWHERE list_contains(tags, '@slow')\nGROUP BY project_name, test_title\nORDER BY runs DESC\nLIMIT 20;\n```\n\n## Generate a linked emoji run history\n\nFor a compact result that drops straight into a GitHub comment, render each\nfinal run verdict as a linked square. Edit the four test identity fields, then\nrun:\n\n```bash\nnode --input-type=module \u003C\u003C'EOF'\nimport { DuckDBInstance } from \"@duckdb\u002Fnode-api\";\n\nconst repository = \"microsoft\u002Fplaywright\";\nconst test = {\n  projectName: \"firefox-library\",\n  file: \"library\u002Fproxy.spec.ts\",\n  testTitle: \"should exclude patterns\",\n  botName: \"firefox-macos-15-large\",\n};\n\nconst conn = await (await DuckDBInstance.create(\n  \"utils\u002Ftest-results-db\u002Ftest-results.duckdb\"\n)).connect();\nconst result = await conn.runAndReadAll(`\n  WITH per_run AS (\n    SELECT run_id, run_attempt,\n           any_value(run_started_at) AS run_started_at,\n           arg_max(status, retry) AS final_status,\n           arg_max(expected_status, retry) AS expected_status,\n           list(status ORDER BY retry) AS attempt_statuses\n    FROM test_results\n    WHERE project_name = $projectName\n      AND file = $file\n      AND test_title = $testTitle\n      AND bot_name = $botName\n    GROUP BY run_id, run_attempt\n  )\n  SELECT run_id, run_attempt, final_status, attempt_statuses\n  FROM per_run\n  WHERE expected_status = 'passed'\n    AND final_status IN ('passed', 'failed', 'timedOut')\n  ORDER BY run_started_at, run_id, run_attempt\n`, test);\n\nconst markdown = result.getRowObjectsJson().map(row => {\n  const rescued = row.final_status === \"passed\" &&\n    row.attempt_statuses.some(status => status === \"failed\" || status === \"timedOut\");\n  const emoji = rescued ? \"?\" : row.final_status === \"passed\" ? \"?\" : \"?\";\n  const url = `https:\u002F\u002Fgithub.com\u002F${repository}\u002Factions\u002Fruns\u002F${row.run_id}\u002Fattempts\u002F${row.run_attempt}`;\n  return `[${emoji}](${url})`;\n}).join(\"\");\n\nconsole.log(markdown);\nEOF\n```\n\nThe output is Markdown:\n\n```markdown\n[?](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Factions\u002Fruns\u002F123\u002Fattempts\u002F1)[?](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Factions\u002Fruns\u002F456\u002Fattempts\u002F1)[?](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Factions\u002Fruns\u002F789\u002Fattempts\u002F1)\n```\n\nEach square is one workflow run attempt, oldest first. Green means passed,\norange means a retry rescued an earlier failure, and red means failed or timed\nout. `arg_max(status, retry)` picks the final verdict after retries, while\ngrouping by `(run_id, run_attempt)` keeps retries from turning into extra\nsquares. The `\u002Fattempts\u002F\u003Cn>` URL links to the exact rerun that produced the\nresult.\n\n## Fetching the full detail\n\nThe db stores per-result summaries. For the full step tree \u002F attachments \u002F stdio,\nfetch the original blob report for that run, if the run uploaded one. A row\nidentifies it by `run_id` + `bot_name`: the run's blob artifact is named\n`blob-report-\u003Cbot_name>`.\n\n```bash\n# List the run's blob artifacts and find the one for this bot_name:\ngh api \u002Frepos\u002Fmicrosoft\u002Fplaywright\u002Factions\u002Fruns\u002F\u003Crun_id>\u002Fartifacts \\\n  --jq '.artifacts[] | select(.name | startswith(\"blob-report\")) | {id, name}'\n\n# Download it (name == \"blob-report-\u003Cbot_name>\"):\ngh api \u002Frepos\u002Fmicrosoft\u002Fplaywright\u002Factions\u002Fartifacts\u002F\u003Cartifact_id>\u002Fzip > blob.zip\n```\n\nBlob and parquet artifacts have a 7-day retention, so this works only for recent\nruns; the db itself retains summaries longer (until run-count eviction).\n","# Playwright Test Results (DuckDB)\n\nA single DuckDB file holds recent Playwright CI test results, so you can answer\nquestions about failures, flakiness, and slow tests with plain SQL. It is\nrefreshed every few hours.\n\n## Get the database\n\nDownload the latest snapshot and top it up with the newest runs:\n\n```bash\nnpm ci                       # first time only, from the repo root\nGITHUB_TOKEN=$(gh auth token) node utils\u002Ftest-results-db\u002Fcli.ts update --lookback-days 3\n```\n\n`update` downloads the snapshot first when there is no local database, then\ningests only the artifacts the snapshot lacks. Never delete the database to\nrebuild it: every artifact costs one GitHub API request, the budget is shared\nby every workflow in the repository, and a rebuild of a few days exhausts it.\nTo only refresh the snapshot without ingesting, run `download`.\n\nQuery it through the bundled `@duckdb\u002Fnode-api` binding — no separate DuckDB\ninstall needed, it ships in `node_modules` after `npm ci`:\n\n```bash\nnode --input-type=module -e '\nimport { DuckDBInstance } from \"@duckdb\u002Fnode-api\";\nconst conn = await (await DuckDBInstance.create(\"utils\u002Ftest-results-db\u002Ftest-results.duckdb\")).connect();\nconsole.table((await conn.runAndReadAll(process.argv[1])).getRowObjectsJson());\n' \"SELECT count(*) FROM test_results\"\n```\n\nInteger columns come back as strings (JSON-safe), so do ranking and filtering\nin SQL, not in JS.\n\n## Schema\n\nSingle table `test_results`, one row per test result (**one row per retry**).\nThe columns are inferred from the parquet the reporter emits\n(`tests\u002Fconfig\u002FparquetReporter.ts`), plus two trailing columns this CLI adds:\n\n| Column | Meaning |\n| --- | --- |\n| `run_id`, `run_attempt` | GitHub Actions run identity |\n| `run_started_at` | when the run started |\n| `workflow_name` | e.g. `tests 1` \u002F `tests 2` \u002F `tests others` \u002F `MCP` |\n| `event` | `push` \u002F `pull_request` |\n| `head_sha`, `head_branch`, `pr_number` | what was tested |\n| `bot_name` | e.g. `chromium-ubuntu-22.04-node20`, `webkit-macos-15-large` — the CI bot. **OS and arch are encoded here**; there is no separate os column. |\n| `project_name` | CI project = browser + suite, e.g. `chromium-page`, `webkit-library`, `playwright-test` |\n| `test_title` | title path within the file, joined by ` › ` (`describe › test`) |\n| `file`, `line`, `column_number` | source location (file is relative to repo root) |\n| `expected_status` | `passed` \u002F `skipped` \u002F ... |\n| `status` | actual result: `passed` \u002F `failed` \u002F `timedOut` \u002F `skipped` \u002F `interrupted` |\n| `retry` | 0 = first attempt |\n| `result_started_at` | when this attempt started |\n| `duration_ms` | result duration |\n| `error_message` | all errors joined, ANSI-stripped (NULL when none) |\n| `tags` | **list** of strings, e.g. `['@slow', '@flaky']` (use list functions \u002F `list_contains`) |\n| `annotations` | list of `{type, description}` structs, e.g. `[{'type': 'skip', 'description': 'flaky on CI'}]` (empty list when none) |\n| `artifact_id` | the GitHub artifact this row came from (dedupe key) |\n| `ingested_at` | debug only — when this row was imported |\n\nNotes:\n- **A test is identified by `(project_name, file, test_title)`** — group on that\n  tuple. (Playwright's `test_id` hash is deliberately not stored; those three\n  columns are its pre-image.)\n- **Flakiness is derived**, not stored. The signal that matters most is\n  **cross-run**: a test whose *final* verdict (after retries) flips between\n  runs — green in some, red in others. A separate **within-run** flake is a\n  test a retry rescued inside a single run (`failed`→`passed`).\n- **Real failures vs intentional ones:** filter `expected_status = 'passed'`.\n  Tests marked `test.fail()` record `status='failed'` *with*\n  `expected_status='failed'` and would otherwise dominate any \"most failing\" list.\n- The db is size-capped by **run count**: the oldest whole runs are evicted over\n  time, so it holds a recent window, not full history.\n\n## Example queries\n\nGroup tests by `(project_name, file, test_title)` and (for failure\u002Fflakiness)\nscope to `expected_status = 'passed'` so intentional `test.fail()` tests don't\nskew the results.\n\n**Flaky across runs** — the test's final verdict flips between runs (this is\nwhat makes a red CI run ambiguous). `least(failed_runs, passed_runs)` ranks\ngenuinely bimodal tests above both always-broken and one-off failures:\n\n```sql\nWITH per_run AS (\n  SELECT project_name, file, test_title, run_id, run_attempt,\n         arg_max(status, retry) AS final_status,\n         any_value(expected_status) AS expected\n  FROM test_results\n  GROUP BY project_name, file, test_title, run_id, run_attempt)\nSELECT project_name, test_title,\n       count(*) AS runs,\n       count(*) FILTER (WHERE final_status IN ('failed','timedOut')) AS failed_runs,\n       count(*) FILTER (WHERE final_status = 'passed') AS passed_runs,\n       round(100.0 * count(*) FILTER (WHERE final_status IN ('failed','timedOut'))\n             \u002F count(*), 1) AS fail_pct\nFROM per_run\nWHERE expected = 'passed'\nGROUP BY project_name, test_title\nHAVING failed_runs > 0 AND passed_runs > 0 AND runs >= 10\nORDER BY least(failed_runs, passed_runs) DESC, failed_runs DESC\nLIMIT 20;\n```\n\n**Filter by tag** (`tags` is a list, not a string):\n\n```sql\nSELECT project_name, test_title, count(*) AS runs\nFROM test_results\nWHERE list_contains(tags, '@slow')\nGROUP BY project_name, test_title\nORDER BY runs DESC\nLIMIT 20;\n```\n\n## Generate a linked emoji run history\n\nFor a compact result that drops straight into a GitHub comment, render each\nfinal run verdict as a linked square. Edit the four test identity fields, then\nrun:\n\n```bash\nnode --input-type=module \u003C\u003C'EOF'\nimport { DuckDBInstance } from \"@duckdb\u002Fnode-api\";\n\nconst repository = \"microsoft\u002Fplaywright\";\nconst test = {\n  projectName: \"firefox-library\",\n  file: \"library\u002Fproxy.spec.ts\",\n  testTitle: \"should exclude patterns\",\n  botName: \"firefox-macos-15-large\",\n};\n\nconst conn = await (await DuckDBInstance.create(\n  \"utils\u002Ftest-results-db\u002Ftest-results.duckdb\"\n)).connect();\nconst result = await conn.runAndReadAll(`\n  WITH per_run AS (\n    SELECT run_id, run_attempt,\n           any_value(run_started_at) AS run_started_at,\n           arg_max(status, retry) AS final_status,\n           arg_max(expected_status, retry) AS expected_status,\n           list(status ORDER BY retry) AS attempt_statuses\n    FROM test_results\n    WHERE project_name = $projectName\n      AND file = $file\n      AND test_title = $testTitle\n      AND bot_name = $botName\n    GROUP BY run_id, run_attempt\n  )\n  SELECT run_id, run_attempt, final_status, attempt_statuses\n  FROM per_run\n  WHERE expected_status = 'passed'\n    AND final_status IN ('passed', 'failed', 'timedOut')\n  ORDER BY run_started_at, run_id, run_attempt\n`, test);\n\nconst markdown = result.getRowObjectsJson().map(row => {\n  const rescued = row.final_status === \"passed\" &&\n    row.attempt_statuses.some(status => status === \"failed\" || status === \"timedOut\");\n  const emoji = rescued ? \"?\" : row.final_status === \"passed\" ? \"?\" : \"?\";\n  const url = `https:\u002F\u002Fgithub.com\u002F${repository}\u002Factions\u002Fruns\u002F${row.run_id}\u002Fattempts\u002F${row.run_attempt}`;\n  return `[${emoji}](${url})`;\n}).join(\"\");\n\nconsole.log(markdown);\nEOF\n```\n\nThe output is Markdown:\n\n```markdown\n[?](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Factions\u002Fruns\u002F123\u002Fattempts\u002F1)[?](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Factions\u002Fruns\u002F456\u002Fattempts\u002F1)[?](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Factions\u002Fruns\u002F789\u002Fattempts\u002F1)\n```\n\nEach square is one workflow run attempt, oldest first. Green means passed,\norange means a retry rescued an earlier failure, and red means failed or timed\nout. `arg_max(status, retry)` picks the final verdict after retries, while\ngrouping by `(run_id, run_attempt)` keeps retries from turning into extra\nsquares. The `\u002Fattempts\u002F\u003Cn>` URL links to the exact rerun that produced the\nresult.\n\n## Fetching the full detail\n\nThe db stores per-result summaries. For the full step tree \u002F attachments \u002F stdio,\nfetch the original blob report for that run, if the run uploaded one. A row\nidentifies it by `run_id` + `bot_name`: the run's blob artifact is named\n`blob-report-\u003Cbot_name>`.\n\n```bash\n# List the run's blob artifacts and find the one for this bot_name:\ngh api \u002Frepos\u002Fmicrosoft\u002Fplaywright\u002Factions\u002Fruns\u002F\u003Crun_id>\u002Fartifacts \\\n  --jq '.artifacts[] | select(.name | startswith(\"blob-report\")) | {id, name}'\n\n# Download it (name == \"blob-report-\u003Cbot_name>\"):\ngh api \u002Frepos\u002Fmicrosoft\u002Fplaywright\u002Factions\u002Fartifacts\u002F\u003Cartifact_id>\u002Fzip > blob.zip\n```\n\nBlob and parquet artifacts have a 7-day retention, so this works only for recent\nruns; the db itself retains summaries longer (until run-count eviction).\n",{"name":5,"description":7,"user_invocable":49},true,"main","deb7e86201e26cb4a8e25191fce5ef2f7a28aa87",".claude\u002Fskills\u002Fplaywright-test-results",6849,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright","https:\u002F\u002Fplaywright.dev","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-12 03:04:51",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":49},[62,65,68],{"tool":63,"command":64},"npx","npx skills add microsoft\u002Fplaywright --skill playwright-test-results",{"tool":66,"command":67},"bunx","bunx skills add microsoft\u002Fplaywright --skill playwright-test-results",{"tool":69,"command":70},"pnpm","pnpm dlx skills add microsoft\u002Fplaywright --skill playwright-test-results","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fplaywright-test-results\u002FSKILL.md",[73,79,83,87],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"agents\u002Fopenai.yaml","REFERENCE","参考文档",319,"https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fopc-methodology\u002Fskills\u002Fopc-business-model-design\u002Fagents\u002Fopenai.yaml",{"path":80,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":81,"sourceHtmlUrl":82},"references\u002Fbmc-lite.md",175,"https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fopc-methodology\u002Fskills\u002Fopc-business-model-design\u002Freferences\u002Fbmc-lite.md",{"path":84,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":85,"sourceHtmlUrl":86},"references\u002Flean-canvas-lite.md",205,"https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fopc-methodology\u002Fskills\u002Fopc-business-model-design\u002Freferences\u002Flean-canvas-lite.md",{"path":88,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":89,"sourceHtmlUrl":90},"references\u002Fpricing-checklist.md",231,"https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fopc-methodology\u002Fskills\u002Fopc-business-model-design\u002Freferences\u002Fpricing-checklist.md",[92,116,146,163,187,203],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":99,"publishedAt":44},"01M6999MNG7F462VPA3A3DQT1D","playwright-trace","Inspect Playwright trace files from the command line — list actions, view requests, console, errors, snapshots and screenshots.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Fblob\u002Fmain\u002Fpackages\u002Fplaywright-core\u002Fsrc\u002Ftools\u002Fskills\u002Fplaywright-trace\u002FSKILL.md",[98],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[27,100,101,102,103,104,105,106,63,107,108,109,110,111,112,113,114,115],"playwright trace","trace","screenshots","view","inspect","actions","errors","files","snapshots","Bash","requests","command","line","command line","console","list",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":126,"publishedAt":44},"01M6999HEFRKHCK11RJYDBHG5N","playwright-component-testing","Set up component testing with Playwright using a story gallery — scaffold stories and a gallery dev page driven by the built-in mount fixture, no dedicated component-testing runtime. Use when asked to test React or Vue components in isolation with Playwright, or to migrate off @playwright\u002Fexperimental-ct-react \u002F -vue.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Fblob\u002Fmain\u002Fpackages\u002Fplaywright-core\u002Fsrc\u002Ftools\u002Fskills\u002Fplaywright-component-testing\u002FSKILL.md",[122,123],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":124,"categoryName":125,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[27,127,128,129,28,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145],"playwright component testing","testing","component","SET","fixture","up","when","migrate","components","react","gallery","vue","isolation","runtime","page","dev","use","stories","with",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":153,"publishedAt":44},"01M6999DVV27DR1Q2WMH329ST3","playwright-cli","Automate browser interactions, test web pages and work with Playwright tests.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Fblob\u002Fmain\u002Fpackages\u002Fplaywright-core\u002Fsrc\u002Ftools\u002Fskills\u002Fplaywright-cli\u002FSKILL.md",[152],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[27,154,155,28,156,148,109,157,158,159,160,161,162,36,63,145],"cli","playwright cli","web","browser","work","test web","install","automate","pages",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":170,"publishedAt":44},"01M69995VG17SFSMYC2F5VQTTC","playwright-release-notes","Write the release notes for a Playwright release - the Node.js notes in docs\u002Fsrc\u002Frelease-notes-js.md together with the Python, Java and .NET translations, and the GitHub markdown for each language's release. Use when asked to write, translate or publish release notes.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fplaywright-release-notes\u002FSKILL.md",[169],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[27,171,172,173,174,175,32,176,177,178,179,180,143,133,181,182,145,183,184,185,186],"playwright release notes","release notes","notes","release","playwright release","translate","python","docs","release-notes","for","java","publish","markdown","src","write","node",{"skillNo":188,"name":189,"nameZh":6,"description":190,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":191,"categories":192,"keywords":194,"publishedAt":44},"01M699938PWX7P2KS04997VVZD","playwright-devops","DevOps workflows for Playwright - CI failure analysis, workflow debugging, and release operations.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fplaywright-devops\u002FSKILL.md",[193],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[27,195,196,197,180,198,39,31,199,200,201,202,174],"playwright devops","devops","workflow","failure analysis","debugging","workflows","analysis","operations",{"skillNo":204,"name":205,"nameZh":6,"description":206,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":207,"categories":208,"keywords":213,"publishedAt":44},"01M6999036ZZB26N62YQTAAFCG","playwright-dev","Explains how to develop Playwright - add APIs, MCP tools, CLI commands, and vendor dependencies.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fplaywright-dev\u002FSKILL.md",[209,210],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":211,"categoryName":212,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,214,142,154,215,216,217,218,219,220,221,222,223,224],"playwright dev","MCP","how to","develop","how","vendor","dependencies","commands","mcp tools","Tools","add"]