[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699BS0G1D7CXH7G09697THY":3,"skill-same:01M699BS0G1D7CXH7G09697THY":68},{"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":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":49,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M699BS0G1D7CXH7G09697THY","update-screenshots",null,"Update the committed blocks-ci screenshot hashes after the \"Screenshots & Tests\" check fails, or investigate a screenshot diff reported on a PR. Use when asked to update, accept, or refresh component screenshot baselines from CI. This skill should be run as a subagent.","microsoft\u002Fvscode","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M6998NK2WED5M549DX06VBCH",195270,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fupdate-screenshots\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"update screenshots","update","screenshots","check","accept","when","screenshot diff","blocks","as","tests","diff","use","refresh","subagent","investigate","ci","screenshot","run","pr","component","2026-11-10 10:12:30",false,"---\nname: update-screenshots\ndescription: Update the committed blocks-ci screenshot hashes after the \"Screenshots & Tests\" check fails, or investigate a screenshot diff reported on a PR. Use when asked to update, accept, or refresh component screenshot baselines from CI. This skill should be run as a subagent.\n---\n\n# Update Component Screenshots from CI\n\nScreenshot **images** are not stored in the repository — they live in an external service (`hediet-screenshots.azurewebsites.net`), keyed by commit SHA. But a subset of fixtures is pinned by **hash** in [`test\u002FcomponentFixtures\u002Fblocks-ci-screenshots.md`](..\u002F..\u002F..\u002Ftest\u002FcomponentFixtures\u002Fblocks-ci-screenshots.md), and that file **is** committed. When those hashes change, CI fails and you must update the file.\n\n## Two different outcomes, only one of which blocks\n\nThe `Screenshots & Tests` job in [`.github\u002Fworkflows\u002Fcomponent-fixtures.yml`](..\u002F..\u002Fworkflows\u002Fcomponent-fixtures.yml) produces two independent results:\n\n| Result | Blocking? | Action |\n| --- | --- | --- |\n| Screenshot **diff report** (PR comment with before\u002Fafter images) | No — informational | Review the visuals. Nothing to commit. |\n| **blocks-ci hash mismatch** | **Yes — fails the check** | Update `blocks-ci-screenshots.md` and commit. |\n\nA fixture opts into the blocking gate with `labels: { kind: 'screenshot', blocksCi: true }`. Only those fixtures appear in `blocks-ci-screenshots.md`.\n\nThe failure looks like this:\n\n```\n##[error]blocks-ci screenshot hashes do not match committed file. See PR comment or job summary for the updated content.\n```\n\n## Step 1: Get the expected hashes from CI\n\n> **Never regenerate the hashes locally.** They are hashes of the rendered PNG bytes, produced on the `vscode-large-runners-ubuntu-8-core` Linux runners. Rendering on macOS or Windows yields different bytes and therefore different hashes, so locally generated values will fail CI. Always copy the values from the CI job.\n\nThree surfaces carry the same content — use whichever is handy:\n\n- The **PR comment** titled \"blocks-ci screenshots changed\" (non-fork PRs only) — contains the full updated file plus a patch.\n- The **job summary**, which gets the identical body and is the only surface fork PRs receive.\n- The **job log**, whose final step prints a unified diff:\n\n```bash\ngh api repos\u002Fmicrosoft\u002Fvscode\u002Factions\u002Fjobs\u002F\u003CJOB_ID>\u002Flogs > \"$TMPDIR\u002Fci-job-log.txt\"\ngrep -n '##\\[error\\]' \"$TMPDIR\u002Fci-job-log.txt\"\n```\n\nFind the failed job id with:\n\n```bash\ngh pr checks \u003CPR> --json name,link,bucket --jq '.[] | select(.name == \"Screenshots & Tests\")'\n```\n\n## Step 2: Verify the change is intentional before accepting it\n\nThis gate exists to catch **unintended** layout regressions, so accepting new hashes without looking at the images defeats its purpose. The images are publicly fetchable by hash, so pull both the old (committed) and new (from CI) versions and compare:\n\n```bash\ncurl -sL -o old.png \"https:\u002F\u002Fhediet-screenshots.azurewebsites.net\u002Fimages\u002F\u003COLD_HASH>\"\ncurl -sL -o new.png \"https:\u002F\u002Fhediet-screenshots.azurewebsites.net\u002Fimages\u002F\u003CNEW_HASH>\"\n```\n\nThen view them, and localize the change rather than eyeballing full screenshots — the delta is often only a pixel or two:\n\n```bash\npython3 -c \"\nfrom PIL import Image, ImageChops\na = Image.open('old.png').convert('RGB'); b = Image.open('new.png').convert('RGB')\nprint('diff bbox:', ImageChops.difference(a, b).getbbox())\n\"\n```\n\nConfirm the delta matches what the PR intends. If the fixture is unrelated to the change, or the shift is larger than expected, treat it as a regression and fix the code instead of the hashes.\n\n## Step 3: Apply and commit\n\nEdit only the changed lines in `test\u002FcomponentFixtures\u002Fblocks-ci-screenshots.md`, replacing the old hash in the image URL with the new one:\n\n```md\n#### editor\u002FinlineChatZoneWidget\u002FInlineChatZoneWidget\u002FDark\n![screenshot](https:\u002F\u002Fhediet-screenshots.azurewebsites.net\u002Fimages\u002F\u003CNEW_HASH>)\n```\n\nThe file is generated by [`build\u002Flib\u002FscreenshotBlocksCi.ts`](..\u002F..\u002F..\u002Fbuild\u002Flib\u002FscreenshotBlocksCi.ts) and compared **byte-for-byte**, so keep the `\u003C!-- auto-generated by CI — do not edit manually -->` header, the `#### \u003CfixtureId>` \u002F image-link pairing, the blank line between entries, and the `fixtureId` sort order intact. Verify your edit is the exact inverse of the diff CI reported:\n\n```bash\ngit diff test\u002FcomponentFixtures\u002Fblocks-ci-screenshots.md\n```\n\nThen commit and push. The check re-runs and should pass; hashes on `main` become the new baseline after merge.\n\n## Investigating further\n\nRaw captured images and the manifest for a run are uploaded as an artifact:\n\n```bash\ngh run download \u003CRUN_ID> --name screenshots --dir .tmp\u002Fscreenshots\n```\n\n`manifest.json` maps each `fixtureId` to its `imageHash` and any render errors.\n\n## Related failures from the same job\n\nThe check also fails if a fixture **failed to render** (`Fail if fixtures had errors`) or if the Playwright fixture tests failed. Those are genuine bugs — updating hashes will not help. Look for `::error::\u003CfixtureId>:` in the log, and download the `playwright-test-results` artifact for test failures.\n","# Update Component Screenshots from CI\n\nScreenshot **images** are not stored in the repository — they live in an external service (`hediet-screenshots.azurewebsites.net`), keyed by commit SHA. But a subset of fixtures is pinned by **hash** in [`test\u002FcomponentFixtures\u002Fblocks-ci-screenshots.md`](..\u002F..\u002F..\u002Ftest\u002FcomponentFixtures\u002Fblocks-ci-screenshots.md), and that file **is** committed. When those hashes change, CI fails and you must update the file.\n\n## Two different outcomes, only one of which blocks\n\nThe `Screenshots & Tests` job in [`.github\u002Fworkflows\u002Fcomponent-fixtures.yml`](..\u002F..\u002Fworkflows\u002Fcomponent-fixtures.yml) produces two independent results:\n\n| Result | Blocking? | Action |\n| --- | --- | --- |\n| Screenshot **diff report** (PR comment with before\u002Fafter images) | No — informational | Review the visuals. Nothing to commit. |\n| **blocks-ci hash mismatch** | **Yes — fails the check** | Update `blocks-ci-screenshots.md` and commit. |\n\nA fixture opts into the blocking gate with `labels: { kind: 'screenshot', blocksCi: true }`. Only those fixtures appear in `blocks-ci-screenshots.md`.\n\nThe failure looks like this:\n\n```\n##[error]blocks-ci screenshot hashes do not match committed file. See PR comment or job summary for the updated content.\n```\n\n## Step 1: Get the expected hashes from CI\n\n> **Never regenerate the hashes locally.** They are hashes of the rendered PNG bytes, produced on the `vscode-large-runners-ubuntu-8-core` Linux runners. Rendering on macOS or Windows yields different bytes and therefore different hashes, so locally generated values will fail CI. Always copy the values from the CI job.\n\nThree surfaces carry the same content — use whichever is handy:\n\n- The **PR comment** titled \"blocks-ci screenshots changed\" (non-fork PRs only) — contains the full updated file plus a patch.\n- The **job summary**, which gets the identical body and is the only surface fork PRs receive.\n- The **job log**, whose final step prints a unified diff:\n\n```bash\ngh api repos\u002Fmicrosoft\u002Fvscode\u002Factions\u002Fjobs\u002F\u003CJOB_ID>\u002Flogs > \"$TMPDIR\u002Fci-job-log.txt\"\ngrep -n '##\\[error\\]' \"$TMPDIR\u002Fci-job-log.txt\"\n```\n\nFind the failed job id with:\n\n```bash\ngh pr checks \u003CPR> --json name,link,bucket --jq '.[] | select(.name == \"Screenshots & Tests\")'\n```\n\n## Step 2: Verify the change is intentional before accepting it\n\nThis gate exists to catch **unintended** layout regressions, so accepting new hashes without looking at the images defeats its purpose. The images are publicly fetchable by hash, so pull both the old (committed) and new (from CI) versions and compare:\n\n```bash\ncurl -sL -o old.png \"https:\u002F\u002Fhediet-screenshots.azurewebsites.net\u002Fimages\u002F\u003COLD_HASH>\"\ncurl -sL -o new.png \"https:\u002F\u002Fhediet-screenshots.azurewebsites.net\u002Fimages\u002F\u003CNEW_HASH>\"\n```\n\nThen view them, and localize the change rather than eyeballing full screenshots — the delta is often only a pixel or two:\n\n```bash\npython3 -c \"\nfrom PIL import Image, ImageChops\na = Image.open('old.png').convert('RGB'); b = Image.open('new.png').convert('RGB')\nprint('diff bbox:', ImageChops.difference(a, b).getbbox())\n\"\n```\n\nConfirm the delta matches what the PR intends. If the fixture is unrelated to the change, or the shift is larger than expected, treat it as a regression and fix the code instead of the hashes.\n\n## Step 3: Apply and commit\n\nEdit only the changed lines in `test\u002FcomponentFixtures\u002Fblocks-ci-screenshots.md`, replacing the old hash in the image URL with the new one:\n\n```md\n#### editor\u002FinlineChatZoneWidget\u002FInlineChatZoneWidget\u002FDark\n![screenshot](https:\u002F\u002Fhediet-screenshots.azurewebsites.net\u002Fimages\u002F\u003CNEW_HASH>)\n```\n\nThe file is generated by [`build\u002Flib\u002FscreenshotBlocksCi.ts`](..\u002F..\u002F..\u002Fbuild\u002Flib\u002FscreenshotBlocksCi.ts) and compared **byte-for-byte**, so keep the `\u003C!-- auto-generated by CI — do not edit manually -->` header, the `#### \u003CfixtureId>` \u002F image-link pairing, the blank line between entries, and the `fixtureId` sort order intact. Verify your edit is the exact inverse of the diff CI reported:\n\n```bash\ngit diff test\u002FcomponentFixtures\u002Fblocks-ci-screenshots.md\n```\n\nThen commit and push. The check re-runs and should pass; hashes on `main` become the new baseline after merge.\n\n## Investigating further\n\nRaw captured images and the manifest for a run are uploaded as an artifact:\n\n```bash\ngh run download \u003CRUN_ID> --name screenshots --dir .tmp\u002Fscreenshots\n```\n\n`manifest.json` maps each `fixtureId` to its `imageHash` and any render errors.\n\n## Related failures from the same job\n\nThe check also fails if a fixture **failed to render** (`Fail if fixtures had errors`) or if the Playwright fixture tests failed. Those are genuine bugs — updating hashes will not help. Look for `::error::\u003CfixtureId>:` in the log, and download the `playwright-test-results` artifact for test failures.\n",{"name":5,"description":7},"main","11ba54a90a0ff8720cf47c086f5a9948eef9cf2c",".github\u002Fskills\u002Fupdate-screenshots",43791,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode","https:\u002F\u002Fcode.visualstudio.com","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-12 03:13:10",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add microsoft\u002Fvscode --skill update-screenshots",{"tool":60,"command":61},"bunx","bunx skills add microsoft\u002Fvscode --skill update-screenshots",{"tool":63,"command":64},"pnpm","pnpm dlx skills add microsoft\u002Fvscode --skill update-screenshots","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fupdate-screenshots\u002FSKILL.md",true,[],[69,95,116,129,144,160],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":39},"01M70H0ANBKZAVEP1NVV4K28M3","sweeper-query","Answer natural-language questions about the VS Code Sweeper's published issue index (index-\u003Cname>.json for microsoft\u002Fvscode and the enrolled family repos) — which issues are agent-ready to implement or plan, what the sweeper proposed for an assignee or area, whether the sweeper knows a report as a duplicate, the highest-value open bugs in a lane — and, for one issue, the review's full record (evidence with file citations, fix brief, proposed comment). Use ONLY when the request explicitly names the sweeper — \"sweeper\", \"vscodesweeper\", \"sweeper-query\", a sweeper verdict, record, brief or index, an agent-ready issue — or asks what \"the sweeper\" found, proposed or knows. Do NOT use for general questions about issues, duplicates, priorities or ranking that do not mention the sweeper. Read-only; discovery only.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fsweeper-query\u002FSKILL.md",[],[76,77,78,79,80,24,81,82,83,84,85,86,87,88,89,90,91,92,93,94],"sweeper query","query","sweeper","review","fix","request","which","natural-language","ranking","duplicates","ready","only","read","plan","open","Citations","brief","issues","code",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":39},"01M699DRJS4YJCV600Q72SVVWE","update-skills","Create or update repository skills and instructions when major learnings are discovered during a session. Use when the user says \"learn!\", when a significant pattern or pitfall is identified, or when reusable domain knowledge should be captured for future sessions.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode\u002Fblob\u002Fmain\u002Fsrc\u002Fvs\u002Fsessions\u002Fskills\u002Fupdate-skills\u002FSKILL.md",[],[20,102,103,104,105,106,107,30,108,109,110,111,112,113,114,115,24],"update skills","for","pattern","domain","learnings","reusable","session","user","instructions","knowledge","repository","learn","create","sessions",{"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":39},"01M699DPWHZ72B66P82EW31RNE","update-pr","Update the pull request for the current session. Use when the user wants to push new changes to an existing PR.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode\u002Fblob\u002Fmain\u002Fsrc\u002Fvs\u002Fsessions\u002Fskills\u002Fupdate-pr\u002FSKILL.md",[],[20,37,123,24,81,124,103,30,108,109,125,126,127,128],"update pr","Existing","push","pull","pull request","changes",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":39},"01M699DJMR6CE1MH5XCJZ0GFQ0","sync","Sync the current session branch with its upstream branch, or publish the current session branch to a remote. Use when the user asks to sync a branch, pull latest changes, rebase onto upstream, push current branch, publish branch, or set upstream.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode\u002Fblob\u002Fmain\u002Fsrc\u002Fvs\u002Fsessions\u002Fskills\u002Fsync\u002FSKILL.md",[],[131,136,137,125,126,138,24,128,139,140,141,142,30,108,109,143],"SET","publish","rebase","latest","with","remote","upstream","branch",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":39},"01M699DGXHX6A2A72X57R6GGHJ","sync-upstream","Update a stale session branch by rebasing onto the latest origin. Use when the upstream has moved significantly and the session needs to catch up, resolving conflicts by preserving upstream changes and adapting session work to fit.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode\u002Fblob\u002Fmain\u002Fsrc\u002Fvs\u002Fsessions\u002Fskills\u002Fsync-upstream\u002FSKILL.md",[],[142,131,151,152,24,153,154,128,139,155,156,157,158,30,108,143,159,20],"sync upstream","fit","catch","catch up","origin","conflicts","stale","up","work",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":166,"publishedAt":39},"01M699DEXYFWDGW0BAXJ5QQ377","merge","Merge changes from the topic branch to the merge base branch. Use when the user wants to merge their session's work back to the base branch.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode\u002Fblob\u002Fmain\u002Fsrc\u002Fvs\u002Fsessions\u002Fskills\u002Fmerge\u002FSKILL.md",[],[162,108,30,159,143,109,24,167,168,128],"back","base"]