[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KWDNK9ASJFCH32YPSYRYFF":3,"skill-same:01M6KWDNK9ASJFCH32YPSYRYFF":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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":14,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":54,"updatedAt":55,"install":56,"resources":69},"01M6KWDNK9ASJFCH32YPSYRYFF","sonarqube-pr-quality-gate",null,"Structured workflow for enforcing SonarQube quality gate on HypermediaEngine pull requests. Covers sonar-project.properties configuration, SonarScanner GitHub Action, PR decoration, quality-gate-failure as a blocking status check, and integration with the existing sonarqube-cli MCP tooling. Invoked by the devops-engineer agent when SonarQube must gate PRs.","rafsanulhasan\u002FHypermediaEngine","rafsanulhasan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2341142?v=4","01M6KW2HWPTZWK051N7B0HTBVG","Rafsanul Hasan","01M6KW2J0N3613382MF5DRN79H",0,"GPL-3.0","https:\u002F\u002Fgithub.com\u002Frafsanulhasan\u002FHypermediaEngine\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fsonarqube-pr-quality-gate\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"sonarqube pr quality gate","pr","quality gate","quality","sonarqube","gate","github action","prs","Existing","for","sonar","with","as","project","MCP","engineer","check","pull","pull requests","workflow","2026-11-10 10:12:30",false,"---\nname: sonarqube-pr-quality-gate\ndescription: Structured workflow for enforcing SonarQube quality gate on HypermediaEngine pull requests. Covers sonar-project.properties configuration, SonarScanner GitHub Action, PR decoration, quality-gate-failure as a blocking status check, and integration with the existing sonarqube-cli MCP tooling. Invoked by the devops-engineer agent when SonarQube must gate PRs.\n---\n\n# SonarQube PR Quality Gate\n\nYou are executing the `sonarqube-pr-quality-gate` skill on behalf of the devops-engineer agent. Your job is to wire SonarQube analysis into the GitHub Actions PR flow so that every PR is scanned, decorated with inline findings, and blocked from merging when the project quality gate fails.\n\n## When to Invoke\n\n- SonarQube exists for this repo but PRs are not yet gated by it\n- A failing quality gate on `main` must be diagnosed and converted into a blocking PR check\n- New rules or coverage thresholds must be enforced through SonarQube\n- A PR was merged despite a red SonarQube run — branch protection must be tightened\n\n## Prerequisites\n\n- SonarQube instance accessible at a known URL (e.g., `https:\u002F\u002Fsonarqube.\u003Corg>.com`)\n- A SonarQube project key created (see `sonarqube-cli`'s `sonar-list-projects`)\n- `SONAR_TOKEN` available as a GitHub Actions secret (project-analyzer scope)\n- `SONAR_HOST_URL` available as a repo variable\n- Coverage already collected during CI in a Sonar-compatible format (e.g., `coverage.opencover.xml` or `coverage.cobertura.xml` via `dotnet-coverage` or `coverlet`)\n- The `sonarqube-cli` MCP toolset already integrated (use `Skill(\"sonar-integrate\")` if not)\n\n## Configuration File\n\nPlace `sonar-project.properties` at the repository root:\n\n```\nsonar.projectKey=HypermediaEngine\nsonar.organization=\u003Corganization-or-blank-for-self-hosted>\nsonar.host.url=${SONAR_HOST_URL}\nsonar.sources=src\nsonar.tests=tests\nsonar.exclusions=**\u002Fbin\u002F**,**\u002Fobj\u002F**,samples\u002F**\nsonar.cs.opencover.reportsPaths=**\u002Fcoverage.opencover.xml\nsonar.cs.vstest.reportsPaths=**\u002F*.trx\nsonar.qualitygate.wait=true\n```\n\nThe `sonar.qualitygate.wait=true` line is the keystone — without it the scan returns immediately and the step appears green even when the gate is red.\n\n## Workflow Integration\n\nAdd a job to the CI workflow (gated to PRs and pushes to `main`):\n\n```yaml\n  sonarqube:\n    name: SonarQube Quality Gate\n    runs-on: windows-latest   # SonarScanner for .NET prefers Windows or Linux; ensure consistency\n    needs: build-and-test\n    if: github.event_name == 'pull_request' || github.ref == 'refs\u002Fheads\u002Fmain'\n    steps:\n      - uses: actions\u002Fcheckout@v4\n        with:\n          fetch-depth: 0   # required for blame on new code\n\n      - uses: actions\u002Fsetup-dotnet@v4\n        with:\n          dotnet-version: '9.0.x'\n\n      - uses: actions\u002Fsetup-java@v4\n        with:\n          distribution: temurin\n          java-version: 17\n\n      - name: Cache SonarScanner\n        uses: actions\u002Fcache@v4\n        with:\n          path: ~\u002F.sonar\u002Fscanner\n          key: ${{ runner.os }}-sonar-scanner\n\n      - name: Install SonarScanner for .NET\n        run: dotnet tool install --global dotnet-sonarscanner\n\n      - name: Begin Sonar analysis\n        env:\n          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}\n          SONAR_HOST_URL: ${{ vars.SONAR_HOST_URL }}\n        run: |\n          dotnet sonarscanner begin \\\n            \u002Fk:\"HypermediaEngine\" \\\n            \u002Fd:sonar.host.url=\"${SONAR_HOST_URL}\" \\\n            \u002Fd:sonar.token=\"${SONAR_TOKEN}\" \\\n            \u002Fd:sonar.cs.opencover.reportsPaths=\"**\u002Fcoverage.opencover.xml\" \\\n            \u002Fd:sonar.cs.vstest.reportsPaths=\"**\u002F*.trx\" \\\n            \u002Fd:sonar.qualitygate.wait=true \\\n            \u002Fd:sonar.pullrequest.key=${{ github.event.pull_request.number }} \\\n            \u002Fd:sonar.pullrequest.branch=${{ github.head_ref }} \\\n            \u002Fd:sonar.pullrequest.base=${{ github.base_ref }}\n\n      - run: dotnet build --configuration Release\n\n      - run: |\n          dotnet test --configuration Release --no-build \\\n            --collect:\"XPlat Code Coverage;Format=opencover\" \\\n            --logger \"trx\"\n\n      - name: End Sonar analysis\n        env:\n          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}\n        run: dotnet sonarscanner end \u002Fd:sonar.token=\"${SONAR_TOKEN}\"\n```\n\nThe `sonar.pullrequest.*` parameters cause SonarQube to decorate the PR with inline annotations.\n\n## Workflow\n\n### Phase 0 — Context Load\n\n1. Read `CLAUDE.md`.\n2. Confirm SonarQube project exists: `Skill(\"sonar-list-projects\")` (via the sonarqube-cli MCP).\n3. Confirm coverage is being produced in OpenCover format — if not, switch the test collector to `Format=opencover`.\n4. Read any existing `sonar-project.properties` or related workflow steps.\n\n### Phase 1 — Properties File\n\nAuthor `sonar-project.properties` at repo root with the keystone settings above. Confirm:\n- `sonar.projectKey` matches the SonarQube project\n- Source and test paths reflect the actual layout\n- Exclusion patterns cover generated, sample, and external code\n- `sonar.qualitygate.wait=true` is present\n\n### Phase 2 — Secrets and Variables\n\nIn `Settings → Secrets and variables → Actions`:\n- Secret: `SONAR_TOKEN` — project-analyzer token from SonarQube\n- Variable: `SONAR_HOST_URL` — the SonarQube base URL\n\n### Phase 3 — Workflow Job\n\nAdd the `sonarqube` job as above. It must:\n- Run after build\u002Ftest (`needs: build-and-test`)\n- Fire on `pull_request` and on `push` to `main`\n- Pass PR metadata (`sonar.pullrequest.*`) when triggered by a PR\n\n### Phase 4 — Branch Protection\n\nIn `Settings → Branches → main`:\n- Add `SonarQube Quality Gate` to required status checks\n- Require branches to be up to date before merging\n\n### Phase 5 — PR Decoration Verification\n\nOpen a test PR with a deliberate code smell. Confirm:\n- A GitHub status check `SonarQube Quality Gate` appears\n- The check is red when the gate fails\n- Inline annotations appear on the PR diff\n- Merge is blocked until the gate passes or branch protection is overridden by an admin\n\n### Phase 6 — Failure Diagnostics\n\nWhen a gate fails on a PR, the developer can:\n- Use `Skill(\"sonar-quality-gate\")` to see each failing condition\n- Use `Skill(\"sonar-list-issues\")` to list specific issues\n- Use `Skill(\"sonar-fix-issue\")` to address them\n\nDocument these MCP entrypoints in the PR template so contributors know how to diagnose.\n\n## Common Pitfalls\n\n- **Missing `sonar.qualitygate.wait=true`**: the scan returns instantly with success even when the gate is red.\n- **Coverage in wrong format**: SonarQube's .NET integration expects OpenCover or VSTest TRX, not Cobertura. Use `--collect:\"XPlat Code Coverage;Format=opencover\"`.\n- **`fetch-depth` not 0**: SonarQube cannot compute new-code blame; the new-code metric becomes the whole project.\n- **Token scoped too broadly**: a global admin token in CI is a leakage risk. Use a project-analyzer token.\n- **PR scan against the wrong base**: pass `sonar.pullrequest.base=${{ github.base_ref }}` so new-code analysis is correct.\n- **`SonarQube Quality Gate` check name not in branch protection**: the gate runs but never blocks. The job name must match exactly.\n- **Self-hosted runner missing Java**: `dotnet-sonarscanner` requires JRE 17+. Always add `actions\u002Fsetup-java`.\n\n## Output\n\nReturn to the calling agent:\n- Files created or modified: `sonar-project.properties`, workflow file\n- Secrets and variables to configure (with names, not values)\n- Required status check name to add to branch protection\n- A confirmation that a deliberately-failing test PR was used to verify the gate blocks\n- Pointers to the `sonarqube-cli` MCP skills for failure diagnostics\n","# SonarQube PR Quality Gate\n\nYou are executing the `sonarqube-pr-quality-gate` skill on behalf of the devops-engineer agent. Your job is to wire SonarQube analysis into the GitHub Actions PR flow so that every PR is scanned, decorated with inline findings, and blocked from merging when the project quality gate fails.\n\n## When to Invoke\n\n- SonarQube exists for this repo but PRs are not yet gated by it\n- A failing quality gate on `main` must be diagnosed and converted into a blocking PR check\n- New rules or coverage thresholds must be enforced through SonarQube\n- A PR was merged despite a red SonarQube run — branch protection must be tightened\n\n## Prerequisites\n\n- SonarQube instance accessible at a known URL (e.g., `https:\u002F\u002Fsonarqube.\u003Corg>.com`)\n- A SonarQube project key created (see `sonarqube-cli`'s `sonar-list-projects`)\n- `SONAR_TOKEN` available as a GitHub Actions secret (project-analyzer scope)\n- `SONAR_HOST_URL` available as a repo variable\n- Coverage already collected during CI in a Sonar-compatible format (e.g., `coverage.opencover.xml` or `coverage.cobertura.xml` via `dotnet-coverage` or `coverlet`)\n- The `sonarqube-cli` MCP toolset already integrated (use `Skill(\"sonar-integrate\")` if not)\n\n## Configuration File\n\nPlace `sonar-project.properties` at the repository root:\n\n```\nsonar.projectKey=HypermediaEngine\nsonar.organization=\u003Corganization-or-blank-for-self-hosted>\nsonar.host.url=${SONAR_HOST_URL}\nsonar.sources=src\nsonar.tests=tests\nsonar.exclusions=**\u002Fbin\u002F**,**\u002Fobj\u002F**,samples\u002F**\nsonar.cs.opencover.reportsPaths=**\u002Fcoverage.opencover.xml\nsonar.cs.vstest.reportsPaths=**\u002F*.trx\nsonar.qualitygate.wait=true\n```\n\nThe `sonar.qualitygate.wait=true` line is the keystone — without it the scan returns immediately and the step appears green even when the gate is red.\n\n## Workflow Integration\n\nAdd a job to the CI workflow (gated to PRs and pushes to `main`):\n\n```yaml\n  sonarqube:\n    name: SonarQube Quality Gate\n    runs-on: windows-latest   # SonarScanner for .NET prefers Windows or Linux; ensure consistency\n    needs: build-and-test\n    if: github.event_name == 'pull_request' || github.ref == 'refs\u002Fheads\u002Fmain'\n    steps:\n      - uses: actions\u002Fcheckout@v4\n        with:\n          fetch-depth: 0   # required for blame on new code\n\n      - uses: actions\u002Fsetup-dotnet@v4\n        with:\n          dotnet-version: '9.0.x'\n\n      - uses: actions\u002Fsetup-java@v4\n        with:\n          distribution: temurin\n          java-version: 17\n\n      - name: Cache SonarScanner\n        uses: actions\u002Fcache@v4\n        with:\n          path: ~\u002F.sonar\u002Fscanner\n          key: ${{ runner.os }}-sonar-scanner\n\n      - name: Install SonarScanner for .NET\n        run: dotnet tool install --global dotnet-sonarscanner\n\n      - name: Begin Sonar analysis\n        env:\n          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}\n          SONAR_HOST_URL: ${{ vars.SONAR_HOST_URL }}\n        run: |\n          dotnet sonarscanner begin \\\n            \u002Fk:\"HypermediaEngine\" \\\n            \u002Fd:sonar.host.url=\"${SONAR_HOST_URL}\" \\\n            \u002Fd:sonar.token=\"${SONAR_TOKEN}\" \\\n            \u002Fd:sonar.cs.opencover.reportsPaths=\"**\u002Fcoverage.opencover.xml\" \\\n            \u002Fd:sonar.cs.vstest.reportsPaths=\"**\u002F*.trx\" \\\n            \u002Fd:sonar.qualitygate.wait=true \\\n            \u002Fd:sonar.pullrequest.key=${{ github.event.pull_request.number }} \\\n            \u002Fd:sonar.pullrequest.branch=${{ github.head_ref }} \\\n            \u002Fd:sonar.pullrequest.base=${{ github.base_ref }}\n\n      - run: dotnet build --configuration Release\n\n      - run: |\n          dotnet test --configuration Release --no-build \\\n            --collect:\"XPlat Code Coverage;Format=opencover\" \\\n            --logger \"trx\"\n\n      - name: End Sonar analysis\n        env:\n          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}\n        run: dotnet sonarscanner end \u002Fd:sonar.token=\"${SONAR_TOKEN}\"\n```\n\nThe `sonar.pullrequest.*` parameters cause SonarQube to decorate the PR with inline annotations.\n\n## Workflow\n\n### Phase 0 — Context Load\n\n1. Read `CLAUDE.md`.\n2. Confirm SonarQube project exists: `Skill(\"sonar-list-projects\")` (via the sonarqube-cli MCP).\n3. Confirm coverage is being produced in OpenCover format — if not, switch the test collector to `Format=opencover`.\n4. Read any existing `sonar-project.properties` or related workflow steps.\n\n### Phase 1 — Properties File\n\nAuthor `sonar-project.properties` at repo root with the keystone settings above. Confirm:\n- `sonar.projectKey` matches the SonarQube project\n- Source and test paths reflect the actual layout\n- Exclusion patterns cover generated, sample, and external code\n- `sonar.qualitygate.wait=true` is present\n\n### Phase 2 — Secrets and Variables\n\nIn `Settings → Secrets and variables → Actions`:\n- Secret: `SONAR_TOKEN` — project-analyzer token from SonarQube\n- Variable: `SONAR_HOST_URL` — the SonarQube base URL\n\n### Phase 3 — Workflow Job\n\nAdd the `sonarqube` job as above. It must:\n- Run after build\u002Ftest (`needs: build-and-test`)\n- Fire on `pull_request` and on `push` to `main`\n- Pass PR metadata (`sonar.pullrequest.*`) when triggered by a PR\n\n### Phase 4 — Branch Protection\n\nIn `Settings → Branches → main`:\n- Add `SonarQube Quality Gate` to required status checks\n- Require branches to be up to date before merging\n\n### Phase 5 — PR Decoration Verification\n\nOpen a test PR with a deliberate code smell. Confirm:\n- A GitHub status check `SonarQube Quality Gate` appears\n- The check is red when the gate fails\n- Inline annotations appear on the PR diff\n- Merge is blocked until the gate passes or branch protection is overridden by an admin\n\n### Phase 6 — Failure Diagnostics\n\nWhen a gate fails on a PR, the developer can:\n- Use `Skill(\"sonar-quality-gate\")` to see each failing condition\n- Use `Skill(\"sonar-list-issues\")` to list specific issues\n- Use `Skill(\"sonar-fix-issue\")` to address them\n\nDocument these MCP entrypoints in the PR template so contributors know how to diagnose.\n\n## Common Pitfalls\n\n- **Missing `sonar.qualitygate.wait=true`**: the scan returns instantly with success even when the gate is red.\n- **Coverage in wrong format**: SonarQube's .NET integration expects OpenCover or VSTest TRX, not Cobertura. Use `--collect:\"XPlat Code Coverage;Format=opencover\"`.\n- **`fetch-depth` not 0**: SonarQube cannot compute new-code blame; the new-code metric becomes the whole project.\n- **Token scoped too broadly**: a global admin token in CI is a leakage risk. Use a project-analyzer token.\n- **PR scan against the wrong base**: pass `sonar.pullrequest.base=${{ github.base_ref }}` so new-code analysis is correct.\n- **`SonarQube Quality Gate` check name not in branch protection**: the gate runs but never blocks. The job name must match exactly.\n- **Self-hosted runner missing Java**: `dotnet-sonarscanner` requires JRE 17+. Always add `actions\u002Fsetup-java`.\n\n## Output\n\nReturn to the calling agent:\n- Files created or modified: `sonar-project.properties`, workflow file\n- Secrets and variables to configure (with names, not values)\n- Required status check name to add to branch protection\n- A confirmation that a deliberately-failing test PR was used to verify the gate blocks\n- Pointers to the `sonarqube-cli` MCP skills for failure diagnostics\n",{"name":5,"description":7},"main","00b2c68281930728ee390bb16cec32b88d2caac7",".github\u002Fskills\u002Fsonarqube-pr-quality-gate","https:\u002F\u002Fgithub.com\u002Frafsanulhasan\u002FHypermediaEngine","https:\u002F\u002Fgithub.com\u002Frafsanulhasan","\r\n    MCSD || A-CSD || Software Architect\r\n\r\n","2026-06-06 07:47:06",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add rafsanulhasan\u002FHypermediaEngine --skill sonarqube-pr-quality-gate",{"tool":62,"command":63},"bunx","bunx skills add rafsanulhasan\u002FHypermediaEngine --skill sonarqube-pr-quality-gate",{"tool":65,"command":66},"pnpm","pnpm dlx skills add rafsanulhasan\u002FHypermediaEngine --skill sonarqube-pr-quality-gate","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Frafsanulhasan\u002FHypermediaEngine\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fsonarqube-pr-quality-gate\u002FSKILL.md",true,[],[71,97,116,135,164,184],{"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":44},"01M6KWEJD606FG3DBBRM0W4DKW","write-tests","Test implementation skill for HypermediaEngine. Takes a confirmed test plan from design-test-cases and produces compilable, runnable xUnit tests following project conventions. Validates coverage quality through mutation testing. Invoked by the sqa-engineer agent after the test plan is approved.","https:\u002F\u002Fgithub.com\u002Frafsanulhasan\u002FHypermediaEngine\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fwrite-tests\u002FSKILL.md",[77],{"categoryNo":78,"categoryName":79,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[81,82,83,84,85,86,87,88,89,90,27,91,92,93,94,39,95,37,96,33],"write tests","write","tests","testing","design","test","project conventions","test plan","Bash","plan","xunit","read","edit","coverage","mutation testing","mutation",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":44},"01M6KWEF2XQ00C1Y6QCK7YHZ1H","write-documentation","Structured documentation writing workflow for HypermediaEngine. Writes or updates README.md files at the repo root and in each project directory (src\u002F, tests\u002F, samples\u002F, etc.) based on current implementation, ADRs, and architecture decisions.","https:\u002F\u002Fgithub.com\u002Frafsanulhasan\u002FHypermediaEngine\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fwrite-documentation\u002FSKILL.md",[],[104,82,105,106,107,43,108,89,109,110,111,112,92,93,113,37,83,114,115,33],"documentation","write documentation","writing","directory","architecture","src","repo","decisions","README","files","updates","at",{"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":122,"publishedAt":44},"01M6KWEBDXTXAVPQ3BHS3YYYNT","write-adr","Writes a numbered Architecture Decision Record (ADR) for a significant architectural choice in the HypermediaEngine project. Invoked by the software-architect agent whenever a consequential design decision is made or ratified. Saves the ADR to docs\u002Farchitecture\u002Fdecisions\u002F.","https:\u002F\u002Fgithub.com\u002Frafsanulhasan\u002FHypermediaEngine\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fwrite-adr\u002FSKILL.md",[],[123,82,124,85,125,108,126,127,128,129,111,92,130,131,37,132,133,33,134],"adr","write adr","docs","architect","decision","choice","grep","architecture decision record","record","software","opus","architecture decision",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":147,"publishedAt":44},"01M6KWE76TM3QHGQ08PEB3KY6D","tunit-playwright-ui-testing","Comprehensive guidance for writing coded end-to-end UI tests in C# using TUnit.Playwright. Tests inherit from PageTest — the base class manages all browser lifecycle. Covers NuGet setup, PageTest inheritance, Page Object Model, browser configuration, parallelism limiting, and CI integration. Based on the official TUnit docs at https:\u002F\u002Ftunit.dev\u002Fdocs\u002Fexamples\u002Fplaywright.","https:\u002F\u002Fgithub.com\u002Frafsanulhasan\u002FHypermediaEngine\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Ftunit-playwright-ui-testing\u002FSKILL.md",[141,142],{"categoryNo":78,"categoryName":79,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":143,"categoryName":144,"taxonomyType":145,"taxonomyTypeDesc":146},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[84,148,149,150,151,152,153,106,154,155,156,157,158,159,160,161,83,162,163,33],"playwright","ui","playwright ui testing","ui testing","tunit","tunit playwright ui testing","official","dev","examples","ci","lifecycle","model","page","inheritance","end","object",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":171,"publishedAt":44},"01M6KWE44A738GDK65QS02XJBG","triage","Task classification, decomposition, dependency mapping, and routing skill. Invoked by the triage-agent to break any user request into discrete, independently-routable work items with assigned priorities and agent chains.","https:\u002F\u002Fgithub.com\u002Frafsanulhasan\u002FHypermediaEngine\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Ftriage\u002FSKILL.md",[170],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[166,172,173,174,175,176,177,178,179,180,181,35,182,183],"routing","classification","work","user","dependency","task","priorities","decomposition","user request","mapping","break","request",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":194,"publishedAt":44},"01M6KWDZ3W9ZKPR7FTTTSX8H2K","system-design","Expert system design skill. Use PROACTIVELY to design systems, review architectures, and assist software engineers in learning design principles and implementing them in the code with design patterns.","https:\u002F\u002Fgithub.com\u002Frafsanulhasan\u002FHypermediaEngine\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fsystem-design\u002FSKILL.md",[190,193],{"categoryNo":191,"categoryName":192,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":143,"categoryName":144,"taxonomyType":145,"taxonomyTypeDesc":146},[85,195,196,197,198,199,200,129,92,201,202,203,204,205,206,132,207,208,35,209],"system","system design","web","design systems","learning","haiku","use","design patterns","design principles","expert","patterns","systems","architectures","principles","implementing"]