[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69B75AX6QEMD3DQTT7M2BFE":3,"skill-same:01M69B75AX6QEMD3DQTT7M2BFE":73},{"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":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":57,"updatedAt":58,"install":59,"resources":72},"01M69B75AX6QEMD3DQTT7M2BFE","playwright-dotnet-release",null,"Prepare a Playwright .NET release after the rolling PR has merged — mark the version, cut the release branch, add .NET-specific changes to the release notes, draft the GitHub release, and tick the .NET boxes in the internal checklist.","microsoft\u002Fplaywright-dotnet","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69B72XE0TTTF0T5HQBQ5X9F",3028,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright-dotnet\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fplaywright-dotnet-release\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"playwright dotnet release","dotnet","playwright","release","github release","boxes","add","tick","checklist","cut","changes","mark","draft","version","branch","prepare","github","pr","release notes","notes","2026-11-10 10:12:30",false,"---\nname: playwright-dotnet-release\ndescription: Prepare a Playwright .NET release after the rolling PR has merged — mark the version, cut the release branch, add .NET-specific changes to the release notes, draft the GitHub release, and tick the .NET boxes in the internal checklist.\n---\n\nUse this skill once the roll PR has merged into `main` and the upstream JS `v1.X.0` is published. The rolling work itself is covered by the [[playwright-roll]] skill.\n\nThroughout this doc, replace `X` with the minor version (e.g. `64` for `1.64.0`) and `\u003Cuser>` with the fork owner (`gh api user --jq .login`).\n\nCheck that the driver is rolled. `DriverVersion` in `src\u002FCommon\u002FVersion.props` on `main` must be a commit of the upstream `release-1.X` branch: the tag `v1.X.0`, or the tip of the branch, as the user says. The driver reports the version of `playwright-core` at that commit, so it must be `1.X.0`:\n\n```bash\n.\u002Fbuild.sh --build-driver\npin=$(git -C .upstream rev-parse HEAD)\ngit -C .upstream fetch origin release-1.X\ngit -C .upstream merge-base --is-ancestor \"$pin\" FETCH_HEAD && echo \"on release-1.X\"\ngit -C .upstream show \"$pin\":packages\u002Fplaywright-core\u002Fpackage.json | grep '\"version\"'\n```\n\nIf it is not, roll first (`.\u002Fbuild.sh --roll v1.X.0`, or `--roll release-1.X`).\n\nThe full release checklist lives in the private `microsoft\u002Fplaywright-internal` repo as the `v1.X release checklist` issue. Find its number once:\n\n```bash\nunset GITHUB_TOKEN\nISSUE=$(gh search issues --repo microsoft\u002Fplaywright-internal \"v1.X release checklist\" --json number --jq '.[0].number')\n```\n\nTick each .NET box incrementally (one PATCH per item) so the issue reflects accurate state if the flow is interrupted. The PR links in a new checklist are copied from the previous release, so replace them as you go:\n\n```bash\ngh api repos\u002Fmicrosoft\u002Fplaywright-internal\u002Fissues\u002F$ISSUE --jq '.body' > \u002Ftmp\u002Fbody.md\n# edit \u002Ftmp\u002Fbody.md to flip \"- [ ]\" → \"- [x]\" on the relevant .NET item\ngh api repos\u002Fmicrosoft\u002Fplaywright-internal\u002Fissues\u002F$ISSUE -X PATCH --field body=@\u002Ftmp\u002Fbody.md\n```\n\n## 1. Mark the version on `main`\n\nSet `AssemblyVersion` in `src\u002FCommon\u002FVersion.props` to `1.X.0`, dropping any suffix. `PackageVersion` stays `$(AssemblyVersion)`. Then PR it to `main`:\n\n```bash\ngit fetch upstream main\ngit checkout -b mark-v1.X.0 upstream\u002Fmain\n# edit src\u002FCommon\u002FVersion.props: \u003CAssemblyVersion>1.X.0\u003C\u002FAssemblyVersion>\ngit commit -am \"chore: mark v1.X.0\"\ngit push -u origin mark-v1.X.0\ngh pr create --repo microsoft\u002Fplaywright-dotnet --head \u003Cuser>:mark-v1.X.0 --base main \\\n  --title \"chore: mark v1.X.0\" \\\n  --body \"Updates \\`AssemblyVersion\\` to \\`1.X.0\\` for the v1.X release.\"\n```\n\nThe diff is exactly one line in `Version.props` (e.g. microsoft\u002Fplaywright-dotnet#3382). Anything else is a red flag.\n\n## 2. Cut the release branch\n\nOnce the mark PR has merged, push `release-1.X` from `upstream\u002Fmain`, then confirm it carries the new version:\n\n```bash\ngit fetch upstream main\ngit push upstream upstream\u002Fmain:refs\u002Fheads\u002Frelease-1.X\ngit show upstream\u002Frelease-1.X:src\u002FCommon\u002FVersion.props | grep AssemblyVersion\n```\n\n## 3. Release notes\n\nThe .NET notes in `docs\u002Fsrc\u002Frelease-notes-csharp.md` are written upstream together with the Node.js notes, following the `playwright-release-notes` skill (`.claude\u002Fskills\u002Fplaywright-release-notes\u002FSKILL.md` on `main` of `microsoft\u002Fplaywright`). Assume the `## Version 1.X` section is already on `release-1.X`, and only add what's missing: significant changes that only the .NET port has, such as a new NUnit, MSTest or xUnit integration feature or a .NET-only API. Leave out minor bug fixes. To find candidates, list this repo's changes since the previous release branch was cut:\n\n```bash\ngit log --oneline --no-merges $(git merge-base upstream\u002Frelease-1.\u003CX-1> upstream\u002Fmain)..upstream\u002Fmain | grep -E '^\\w+ (feat|fix)'\n```\n\nAsk the user before adding anything. Send the update upstream as `docs: release notes for v1.X .NET`, covering both upstream and .NET-specific changes, and cherry-pick it to `release-1.X`.\n\nWrite the GitHub release body from the section as step 3 of the upstream skill describes, and save it as `\u002Ftmp\u002Fv1.X.0-release-notes.md`. Create the draft directly against `release-1.X`. Drafting against `main` and retargeting later is fragile, because every `gh release edit` rotates the `untagged-\u003Chash>` ID:\n\n```bash\ngh release create v1.X.0 --repo microsoft\u002Fplaywright-dotnet --draft \\\n  --title \"v1.X.0\" --notes-file \u002Ftmp\u002Fv1.X.0-release-notes.md --target release-1.X\n```\n\n## 4. Publish\n\nThe user publishes the draft release manually. Publishing creates the `v1.X.0` tag, which triggers the Azure DevOps pipelines:\n- `.azure-pipelines\u002Fpublish.yml` pushes the packages to NuGet.\n- `.azure-pipelines\u002Fpublish-docker.yml` pushes the Docker images.\n\nThe checklist links both pipelines. Tick its boxes once they succeed.\n","Use this skill once the roll PR has merged into `main` and the upstream JS `v1.X.0` is published. The rolling work itself is covered by the [[playwright-roll]] skill.\n\nThroughout this doc, replace `X` with the minor version (e.g. `64` for `1.64.0`) and `\u003Cuser>` with the fork owner (`gh api user --jq .login`).\n\nCheck that the driver is rolled. `DriverVersion` in `src\u002FCommon\u002FVersion.props` on `main` must be a commit of the upstream `release-1.X` branch: the tag `v1.X.0`, or the tip of the branch, as the user says. The driver reports the version of `playwright-core` at that commit, so it must be `1.X.0`:\n\n```bash\n.\u002Fbuild.sh --build-driver\npin=$(git -C .upstream rev-parse HEAD)\ngit -C .upstream fetch origin release-1.X\ngit -C .upstream merge-base --is-ancestor \"$pin\" FETCH_HEAD && echo \"on release-1.X\"\ngit -C .upstream show \"$pin\":packages\u002Fplaywright-core\u002Fpackage.json | grep '\"version\"'\n```\n\nIf it is not, roll first (`.\u002Fbuild.sh --roll v1.X.0`, or `--roll release-1.X`).\n\nThe full release checklist lives in the private `microsoft\u002Fplaywright-internal` repo as the `v1.X release checklist` issue. Find its number once:\n\n```bash\nunset GITHUB_TOKEN\nISSUE=$(gh search issues --repo microsoft\u002Fplaywright-internal \"v1.X release checklist\" --json number --jq '.[0].number')\n```\n\nTick each .NET box incrementally (one PATCH per item) so the issue reflects accurate state if the flow is interrupted. The PR links in a new checklist are copied from the previous release, so replace them as you go:\n\n```bash\ngh api repos\u002Fmicrosoft\u002Fplaywright-internal\u002Fissues\u002F$ISSUE --jq '.body' > \u002Ftmp\u002Fbody.md\n# edit \u002Ftmp\u002Fbody.md to flip \"- [ ]\" → \"- [x]\" on the relevant .NET item\ngh api repos\u002Fmicrosoft\u002Fplaywright-internal\u002Fissues\u002F$ISSUE -X PATCH --field body=@\u002Ftmp\u002Fbody.md\n```\n\n## 1. Mark the version on `main`\n\nSet `AssemblyVersion` in `src\u002FCommon\u002FVersion.props` to `1.X.0`, dropping any suffix. `PackageVersion` stays `$(AssemblyVersion)`. Then PR it to `main`:\n\n```bash\ngit fetch upstream main\ngit checkout -b mark-v1.X.0 upstream\u002Fmain\n# edit src\u002FCommon\u002FVersion.props: \u003CAssemblyVersion>1.X.0\u003C\u002FAssemblyVersion>\ngit commit -am \"chore: mark v1.X.0\"\ngit push -u origin mark-v1.X.0\ngh pr create --repo microsoft\u002Fplaywright-dotnet --head \u003Cuser>:mark-v1.X.0 --base main \\\n  --title \"chore: mark v1.X.0\" \\\n  --body \"Updates \\`AssemblyVersion\\` to \\`1.X.0\\` for the v1.X release.\"\n```\n\nThe diff is exactly one line in `Version.props` (e.g. microsoft\u002Fplaywright-dotnet#3382). Anything else is a red flag.\n\n## 2. Cut the release branch\n\nOnce the mark PR has merged, push `release-1.X` from `upstream\u002Fmain`, then confirm it carries the new version:\n\n```bash\ngit fetch upstream main\ngit push upstream upstream\u002Fmain:refs\u002Fheads\u002Frelease-1.X\ngit show upstream\u002Frelease-1.X:src\u002FCommon\u002FVersion.props | grep AssemblyVersion\n```\n\n## 3. Release notes\n\nThe .NET notes in `docs\u002Fsrc\u002Frelease-notes-csharp.md` are written upstream together with the Node.js notes, following the `playwright-release-notes` skill (`.claude\u002Fskills\u002Fplaywright-release-notes\u002FSKILL.md` on `main` of `microsoft\u002Fplaywright`). Assume the `## Version 1.X` section is already on `release-1.X`, and only add what's missing: significant changes that only the .NET port has, such as a new NUnit, MSTest or xUnit integration feature or a .NET-only API. Leave out minor bug fixes. To find candidates, list this repo's changes since the previous release branch was cut:\n\n```bash\ngit log --oneline --no-merges $(git merge-base upstream\u002Frelease-1.\u003CX-1> upstream\u002Fmain)..upstream\u002Fmain | grep -E '^\\w+ (feat|fix)'\n```\n\nAsk the user before adding anything. Send the update upstream as `docs: release notes for v1.X .NET`, covering both upstream and .NET-specific changes, and cherry-pick it to `release-1.X`.\n\nWrite the GitHub release body from the section as step 3 of the upstream skill describes, and save it as `\u002Ftmp\u002Fv1.X.0-release-notes.md`. Create the draft directly against `release-1.X`. Drafting against `main` and retargeting later is fragile, because every `gh release edit` rotates the `untagged-\u003Chash>` ID:\n\n```bash\ngh release create v1.X.0 --repo microsoft\u002Fplaywright-dotnet --draft \\\n  --title \"v1.X.0\" --notes-file \u002Ftmp\u002Fv1.X.0-release-notes.md --target release-1.X\n```\n\n## 4. Publish\n\nThe user publishes the draft release manually. Publishing creates the `v1.X.0` tag, which triggers the Azure DevOps pipelines:\n- `.azure-pipelines\u002Fpublish.yml` pushes the packages to NuGet.\n- `.azure-pipelines\u002Fpublish-docker.yml` pushes the Docker images.\n\nThe checklist links both pipelines. Tick its boxes once they succeed.\n",{"name":5,"description":7},"main","e074a35174db19d8b64c847bec0e155292377fce",".claude\u002Fskills\u002Fplaywright-dotnet-release",307,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright-dotnet","https:\u002F\u002Fplaywright.dev\u002Fdotnet\u002F","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-12 19:06:17",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add microsoft\u002Fplaywright-dotnet --skill playwright-dotnet-release",{"tool":65,"command":66},"bunx","bunx skills add microsoft\u002Fplaywright-dotnet --skill playwright-dotnet-release",{"tool":68,"command":69},"pnpm","pnpm dlx skills add microsoft\u002Fplaywright-dotnet --skill playwright-dotnet-release","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright-dotnet\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fplaywright-dotnet-release\u002FSKILL.md",true,[],[74],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":81,"publishedAt":44},"01M69B77VHWT9K6D6MSF3MC93S","playwright-roll","Roll Playwright .NET to a new version","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright-dotnet\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fplaywright-roll\u002FSKILL.md",[80],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[26,82,83,37],"playwright roll","new"]