[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69BBFD592Y8B7YRSXDGWS7J":3,"skill-same:01M69BBFD592Y8B7YRSXDGWS7J":227},{"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":28,"publishedAt":57,"linkOnly":58,"markdownContent":59,"markdownBody":60,"frontMatter":61,"refName":62,"commitSha":63,"skillDirectory":64,"forksCount":65,"repositoryHtmlUrl":66,"repositoryHomepageUrl":6,"ownerHtmlUrl":67,"ownerBlogUrl":68,"ownerDescription":69,"updatedAt":70,"install":71,"resources":84},"01M69BBFD592Y8B7YRSXDGWS7J","ui-tests-local-vm",null,"Run PowerToys UITest.Next suites in persistent Hyper-V VMs over PowerShell Direct. Validate full default and constrained suites on Windows 10 and Windows 11, plus applicable ARM64 guests, then automatically hand implementation tasks to ui-tests-pipeline-ci for commit\u002Fpush and CI validation. Local green is not end-to-end completion. Use for agentic UI-test iteration, reusable standard-user desktops, payload staging, evidence export, VM customization, clean baselines, or hosts without nested virtualization. Keywords: Hyper-V, local VM, virtual machine, PowerShell Direct, Copy-VMFile, VMBus, checkpoint, unattend, autounattend, ISO, Windows 10 LTSC, Windows 11, ARM64, Windows on ARM, UI tests, UITest.Next, winappcli, TRX, CI handoff.","microsoft\u002FPowerToys","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69BB0G8W7E0BMJRDE4NW1BD",140873,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56],"tests","local","ui tests local vm","vm","ui","ci","hosts","hand","iso","end","iteration","green","next","clean","default","pipeline","powershell","handoff","windows 11","windows 10","powertoys","run","tasks","windows","validate","commit","test","agentic","2026-11-10 10:12:30",false,"---\nname: ui-tests-local-vm\ndescription: \"Run PowerToys UITest.Next suites in persistent Hyper-V VMs over PowerShell Direct. Validate full default and constrained suites on Windows 10 and Windows 11, plus applicable ARM64 guests, then automatically hand implementation tasks to ui-tests-pipeline-ci for commit\u002Fpush and CI validation. Local green is not end-to-end completion. Use for agentic UI-test iteration, reusable standard-user desktops, payload staging, evidence export, VM customization, clean baselines, or hosts without nested virtualization. Keywords: Hyper-V, local VM, virtual machine, PowerShell Direct, Copy-VMFile, VMBus, checkpoint, unattend, autounattend, ISO, Windows 10 LTSC, Windows 11, ARM64, Windows on ARM, UI tests, UITest.Next, winappcli, TRX, CI handoff.\"\nlicense: MIT\n---\n\n# Local VM UI testing\n\nRun PowerToys `.Next` UI tests in a persistent, interactive Windows VM while keeping product and test\nexecution off the host. Use this skill as the execution complement to\n[ui-tests-migration](..\u002Fui-tests-migration\u002FSKILL.md). Restore the baseline checkpoint or recreate the\nguest when clean-profile behavior must be validated.\n\nThe guest is a Hyper-V virtual machine. Nothing runs nested, so the same scaffold works on x64 and on\nWindows on ARM, where nested virtualization is unavailable to any Linux-hosted emulator.\n\nThe local correctness gate passes when the **full** suite is green on Windows 10 **and** on\nWindows 11, in two separate VMs. Run Windows 10 Enterprise LTSC 2021 first for the fastest\nfeedback, then run the same unfiltered suite on Windows 11. Differences in the shell, compositor,\ntheming, and timing break tests that contain nothing Windows 11-specific, and those are exactly\nthe failures worth catching locally instead of in CI. On a Windows on ARM host, Windows 11 ARM64\nis the only practical guest; run it with `-Platform ARM64` and get the Windows 10 half from an x64 host.\n\nStart guests with the default resource profile: 4 vCPUs and 8 GB RAM. Get the target suite fully\ngreen before lowering resources with the `Constrained` profile (1 vCPU and 4 GB RAM).\n\nFor **create, migrate, or stabilize** tasks, complete both profiles and then automatically invoke\n[ui-tests-pipeline-ci](..\u002Fui-tests-pipeline-ci\u002FSKILL.md): pass its access preflight, commit and push\nthe scoped changes, queue CI, and remain attached until terminal validation. **Do not mark the task\ncomplete at local green or wait for another user request to publish\u002Frun CI.** Respect explicit\nlocal-only\u002Fno-push\u002Fno-CI scope and the Microsoft FTE\u002Faccess gates. Local execution or VM setup alone\ndoes not authorize publication. See the pipeline skill for the shared completion and blocker rules.\n\n## How the host reaches the guest\n\n| Concern | Mechanism |\n|---|---|\n| Control channel | PowerShell Direct over VMBus. No listener, port, certificate, or firewall rule in the guest. |\n| Bulk payload | `Copy-VMFile` over the Guest Service Interface, ~82 MB\u002Fs. The session copy is a fallback and stalls on archives near a gigabyte. |\n| Exchange | Guest-local `C:\\PowerToysUiTestExchange\\\u003Cname>`, mirrored by the controller. The host never shares a folder with the guest. |\n| Host privilege | Hyper-V access: an elevated shell, or an account in the local **Hyper-V Administrators** group. Creating a guest additionally requires real elevation. |\n| Console | `scripts\u002FGet-VmConsoleImage.ps1` renders the framebuffer to PNG, so an agent can read boot and desktop state without VMConnect. |\n\n## When to use this skill\n\nUse it when asked to:\n\n- Create or migrate UI tests and iterate repeatedly without reprovisioning Windows each run.\n- Validate Explorer, hotkey, WebView2, shell-extension, foreground, or composed-visual behavior in a\n  real interactive desktop.\n- Run tests as a true standard user while retaining a separate administrator control channel.\n- Reuse unchanged PowerToys, winappcli, and .NET payloads and refresh only changed archives.\n- Keep a reproducible local VM baseline with optional .NET 10, WebView2, diagnostics, or `msvsmon`.\n- Collect durable `status.json`, TRX, transcripts, logs, screenshots, and failure attachments.\n- Compare revisions in one stable VM before confirming the result from a restored checkpoint.\n\nDo not treat a persistent VM as proof of clean-profile behavior. Caches, registrations, settings, and\nfirst-run state survive between runs. Restore the baseline checkpoint or recreate the VM when those\nare the behavior under test.\n\n## Relationship to other UI-test skills\n\n| Skill | Owns |\n|---|---|\n| `ui-tests-migration` | Test design, project scaffolding, framework APIs, assertions, lifecycle, and CI stability. |\n| `ui-tests-local-vm` | Fast persistent-VM setup, deployment, interactive execution, evidence export, and iteration. |\n| `ui-tests-pipeline-ci` | Required post-local commit\u002Fpush, access preflight, scoped CI, and terminal sign-off for implementation tasks. |\n\nDo not modify stabilized tests merely to make the local VM green. First prove that the suite executes,\nproduces assertion-bearing TRX, and has a useful success rate. Classify environment-specific failures\nseparately unless the task explicitly asks for stabilization.\n\n## Guest OS policy\n\n- Two guests, two full suites. Windows 10 Enterprise LTSC 2021 (build 19044\u002F21H2, newer than the\n  Windows 10 20H2 baseline) and Windows 11. Both must be fully green before the local gate passes.\n  LTSC is not available through Fido; `-Source Fido -Windows 10` automates Microsoft's official\n  mobile-user-agent ISO page and is the practical public default. The public ISO\u002FMCT images are too\n  old for .NET 10 CET, so Setup Dynamic Update must bring Win10 to 1904x.5007+ before the baseline.\n  Use licensed Microsoft subscription media for LTSC when available, and always record the edition,\n  ISO hash, and installed full build ([references\u002Fsetup.md §3](references\u002Fsetup.md#3-get-windows-media)).\n- Windows 10 runs first: it is the faster loop and surfaces most defects. Windows 11 then runs the\n  **same** suite, unfiltered - not only the tests that look Windows 11-specific. A test with no\n  Windows 11 content can still fail there, which is the whole reason for the second pass.\n- Narrow filters belong to iteration and diagnosis. They are never the evidence for the Windows 11\n  pass.\n- Give each OS its own VM name, `vm.config.psd1`, VHDX, checkpoints, and exchange. Never upgrade or\n  repurpose the Windows 10 guest into the Windows 11 guest; the two baselines must stay independent.\n- Surfaces that exist only on Windows 11, such as the tier-1 Explorer context menu, need no special\n  handling: the full Windows 11 run already covers them.\n- On a Windows on ARM host, use a Windows 11 ARM64 guest with `-Platform ARM64`. Hyper-V does not\n  emulate a foreign architecture, so that host cannot supply the Windows 10 x64 pass - run it on an\n  x64 host and report both.\n- A Windows 11 host requirement does not make Windows 11 the first guest target.\n- `-Platform` is not cosmetic: it flows to the guest as the `platform` environment variable, names\n  visual baselines, and marks the run as pipeline-like. Use only `x64Win10`, `x64Win11`, or `ARM64`.\n\n## Required reads\n\nRead only what the task needs:\n\n1. [references\u002Fsetup.md](references\u002Fsetup.md) - host requirements, scaffolding, media acquisition,\n   unattended guest creation, credentials, standard-user desktop, and checkpoint baselines.\n2. [references\u002Fagentic-loop.md](references\u002Fagentic-loop.md) - payload contract, controller usage,\n   focused-to-suite iteration, evidence, verdicts, and reset strategy.\n3. [references\u002Fcustomization.md](references\u002Fcustomization.md) - persistent image customization,\n   .NET 10, WebView2, `msvsmon`, resource profiles, and golden-baseline guidance.\n4. [references\u002Ftroubleshooting.md](references\u002Ftroubleshooting.md) - guest creation, PowerShell Direct,\n   interactive session, scheduled-task, focus, timeout, and export failures.\n5. [references\u002Fshell-extensions-and-signing.md](references\u002Fshell-extensions-and-signing.md) - **read\n   for any shell-extension module** (context menu, preview\u002Fthumbnail handler). Why unsigned CI PR\n   builds cannot register a sparse MSIX (0% on CI), classic (registry-COM, signing-free) vs modern\n   (sparse-MSIX) surfaces, Debug vs Release\u002F`NDEBUG` gating, runtime detection, and reproducing CI's\n   classic scenario on a local signed VM.\n6. [ui-tests-migration](..\u002Fui-tests-migration\u002FSKILL.md) - required whenever test code or framework\n   behavior is being created, migrated, or stabilized.\n\n## Default agentic cycle\n\n```mermaid\nflowchart LR\n    A[Design or edit test] --> B[Host build]\n    B --> C[Package changed payload]\n    C --> D[Start or reuse VM]\n    D --> E[Probe standard-user desktop]\n    E --> F[Run focused test]\n    F --> G[Export status TRX evidence]\n    G --> H{Need test change?}\n    H -- Yes --> A\n    H -- No --> I[Run full suite on Win10]\n    I --> J[Run same full suite on Win11]\n    J --> K{Both fully green?}\n    K -- No --> A\n    K -- Yes --> L[Full constrained suites on both OSes]\n    L --> M{Local matrix green?}\n    M -- No --> A\n    M -- Yes --> N[Clean-profile confirmation when required]\n    N --> O[ui-tests-pipeline-ci: preflight, commit, push]\n    O --> P[Scoped CI and synchronous terminal validation]\n```\n\nThe CI continuation applies to implementation tasks; explicit local-only and setup-only tasks stop\nat their requested local outcome.\n\nCreate and maintain this task list:\n\n```markdown\n- [ ] 0. Verify host setup FIRST: `Initialize-LocalVmHost.ps1 -VmRoot \u003Croot> -CheckOnly`. If it reports\n        IsReady=false, STOP and ask the user to run the elevated command it prints - Hyper-V group\n        membership, the DPAPI credential, and guest creation all need a human. Never autopilot past it\n- [ ] 1. Read ui-tests-migration guidance for the target test surface\n- [ ] 1a. Read the target module's dev docs — `doc\u002Fdevdocs\u002Fmodules\u002F\u003Cmodule>.md` (search `doc\u002Fdevdocs\u002F`,\n        including `common\u002F`, if the exact file is missing) — for development-cycle gotchas such as\n        Release\u002F`NDEBUG` registration gating, signed sparse-MSIX context menus, and Explorer restarts,\n        so a module's registration\u002Fdeployment requirements do not surface as opaque test failures.\n        For shell-extension modules also read references\u002Fshell-extensions-and-signing.md.\n- [ ] 2. Scaffold or verify the local VM - references\u002Fsetup.md\n- [ ] 3. Build product and test projects on the host to exit code 0\n- [ ] 4. Package a lean exchange and verify archive hashes\n- [ ] 5. Run the controller with -PlanOnly and inspect its request\u002Fplan\n- [ ] 6. Probe the non-admin interactive desktop before test execution\n- [ ] 7. Run one focused test synchronously; keep the agent turn attached, read the controller\n  result's `.Failed` array (non-passed tests + first error line) instead of re-parsing TRX, and\n  use `scripts\u002FInvoke-GuestScript.ps1` for guest-state inspection\n- [ ] 8. Diagnose the first controlling failure without weakening assertions\n- [ ] 9. Rebuild and rerun with -ReuseStagedPayload\n- [ ] 10. Widen to the full module suite on Windows 10 and report pass rate\u002Froot-cause groups\n- [ ] 11. Run the same full suite in the Windows 11 VM; both must be green before the local gate passes\n- [ ] 12. Restore the baseline checkpoint for clean-profile confirmation when required\n- [ ] 13. Run the full Constrained suite on both OSes; preserve default and constrained evidence\n- [ ] 14. For implementation tasks, invoke ui-tests-pipeline-ci without another user prompt, pass\n        access preflight, commit\u002Fpush task-owned changes, and record the exact branch\u002FSHA\n- [ ] 15. Queue scoped CI and wait synchronously for verified terminal results; local green alone\n        cannot complete the task unless the user explicitly requested local-only scope\n```\n\n## Quick start\n\nHost setup is a one-time, **human-only** step: Hyper-V group membership, the DPAPI guest credential,\nand guest creation all need elevation or a password. Check it before anything else - this needs no\nelevation and changes nothing:\n\n```pwsh\npwsh .github\\skills\\ui-tests-local-vm\\scripts\\Initialize-LocalVmHost.ps1 -VmRoot X:\\PowerToysUiTestVm -CheckOnly\n```\n\nIf it reports `IsReady=false`, stop and ask the user to run the elevated command it prints (see\n[references\u002Fsetup.md §0](references\u002Fsetup.md#0-human-only-host-setup-one-command)). Otherwise scaffold\nthe VM directory outside the repository:\n\n```pwsh\npwsh .github\\skills\\ui-tests-local-vm\\scripts\\Initialize-LocalVm.ps1 `\n  -DestinationRoot X:\\PowerToysUiTestVm\n```\n\nThe scaffold and its `shared` exchange can live on any volume, including a Dev Drive. Only the VHDX\nand VM configuration paths, set separately in `vm.config.psd1`, should point at NTFS.\n\nFollow [references\u002Fsetup.md](references\u002Fsetup.md) to write the untracked `vm.config.psd1`, save the\nadministrator credential with Windows DPAPI, obtain install media, and create the guest with\n`New-UiTestVm.ps1`. Then stage the archives described in\n[references\u002Fagentic-loop.md](references\u002Fagentic-loop.md) and run:\n\n```pwsh\npwsh .github\\skills\\ui-tests-local-vm\\scripts\\Invoke-LocalVmUiTest.ps1 `\n  -VmName PowerToysUiTest-Win10 `\n  -VmRoot X:\\PowerToysUiTestVm `\n  -ExchangeRoot X:\\PowerToysUiTestVm\\shared\\PowerToysUiTests\\MyModule `\n  -TestExecutable MyModule.UITests.Next.exe `\n  -Filter 'Name=MyModule.FocusedTest' `\n  -Platform x64Win10 `\n  -BuildLabel (git rev-parse HEAD) `\n  -SuiteTimeout 15m `\n  -TimeoutMinutes 25 `\n  -ReuseStagedPayload\n```\n\nThe controller starts the VM if needed, requests automatic host sleep prevention, verifies the\ninteractive standard-user desktop, dispatches the guest runner, and waits synchronously for matching\n`status.json`. It reports whether sleep prevention succeeded, fails early if the guest task never\nstarts or exits without status, summarizes TRX, and leaves the persistent VM running by default.\n\n## Non-negotiable rules\n\n- Complete host setup before anything else and **never autopilot around it**. Hyper-V group\n  membership, the DPAPI guest credential, and guest creation are human-only: two need elevation that\n  no tool call can approve, one needs a password that must never reach a model.\n  `Initialize-LocalVmHost.ps1` performs all three; agents run it `-CheckOnly`, and on\n  `IsReady=false` report `BLOCKED`, print the elevated command it emits, and wait. Do not ask for a\n  password, do not substitute a weaker channel, do not proceed on a partial setup.\n  `Invoke-LocalVmUiTest.ps1` enforces the same check.\n- Keep the guest's VHDX and VM configuration on NTFS. On this project's host, keeping them on a Dev\n  Drive wedged the VM management service twice - `vmms` at 0% CPU, even `Get-VM` hanging, host reboot\n  to recover - and moving to NTFS fixed it. This is an observation on one host, not a property of\n  ReFS: Hyper-V on plain ReFS is supported, so `-AllowReFsVolume` overrides the default refusal. The\n  scaffold and the exchange are unaffected and run fine on a Dev Drive.\n- Build on the host; run PowerToys and tests only in the VM when host execution is prohibited.\n- Invoke every focused, full-suite, and constrained controller run synchronously. Keep the active\n  agent turn attached until the controller returns matching status\u002FTRX evidence; never background\n  the controller or end the turn while it runs.\n- Complete the local correctness gate with two green full suites: Windows 10 and Windows 11, in\n  separate VMs. Windows 10 runs first for speed; Windows 11 runs the same unfiltered suite, never a\n  Win11-only subset. Narrow filters are for iteration, not for sign-off. On a Windows on ARM host\n  the ARM64 Windows 11 guest covers the Windows 11 half and the Windows 10 half needs an x64 host.\n- Establish a fully green correctness baseline with the default (4 vCPU \u002F 8 GB) resources before\n  running the same tests under `Constrained` (1 vCPU \u002F 4 GB) resources.\n- For implementation tasks, require both resource profiles and the subsequent pipeline handoff.\n  Report unavailable publication\u002FCI prerequisites as blocked, not as full validation success.\n- Keep VM files and writable exchange folders outside the repository.\n- Keep the guest's default inbound network posture. The control channel does not need connectivity,\n  so do not enable remoting, open ports, or attach the guest to a routable network for test dispatch.\n- Use a DPAPI-protected credential file. Never put credentials in prompts, scripts, request JSON,\n  unattend files kept after install, source control, or command-line arguments.\n- Run UI tests in an already logged-on standard-user desktop, never in session 0 or as `SYSTEM`.\n- Keep a separate administrator account only for VM control and scheduled-task registration.\n- Verify user, token integrity, Explorer presence, session ID, and display size before tests.\n- Run product\u002Ftests from guest-local storage under `C:\\PowerToysUiTestRun`.\n- Use PowerShell 7 for interactive probe\u002Ftest scheduled tasks. PowerShell Direct and OEM bootstrap\n  remain PS5.1-compatible by design; do not enable a remoting endpoint merely to use PS7.\n- Reuse payloads by per-component hashes; refresh only changed tests\u002Fproduct\u002Ftools.\n- Preserve assertions and visual thresholds. Classify VM-specific failures from evidence.\n- Always parse TRX and require `total > 0` plus `executed == total`. A process exit code alone cannot\n  distinguish assertions, skipped\u002Finconclusive tests, zero tests, timeout, or infrastructure failure.\n- Keep the VM after normal runs for iteration. Stop it explicitly when idle; delete its VHDX only for\n  an intentional baseline reset.\n- The controller requests automatic host sleep prevention and reports `HostSleepPrevented`; failure\n  is a warning. It cannot override manual sleep, lid-close policy, reboot, shutdown, or power loss.\n- Final clean-profile claims require a restored baseline checkpoint or a recreated guest. Restore with\n  `Reset-LocalVm.ps1 -Restore`.\n","# Local VM UI testing\n\nRun PowerToys `.Next` UI tests in a persistent, interactive Windows VM while keeping product and test\nexecution off the host. Use this skill as the execution complement to\n[ui-tests-migration](..\u002Fui-tests-migration\u002FSKILL.md). Restore the baseline checkpoint or recreate the\nguest when clean-profile behavior must be validated.\n\nThe guest is a Hyper-V virtual machine. Nothing runs nested, so the same scaffold works on x64 and on\nWindows on ARM, where nested virtualization is unavailable to any Linux-hosted emulator.\n\nThe local correctness gate passes when the **full** suite is green on Windows 10 **and** on\nWindows 11, in two separate VMs. Run Windows 10 Enterprise LTSC 2021 first for the fastest\nfeedback, then run the same unfiltered suite on Windows 11. Differences in the shell, compositor,\ntheming, and timing break tests that contain nothing Windows 11-specific, and those are exactly\nthe failures worth catching locally instead of in CI. On a Windows on ARM host, Windows 11 ARM64\nis the only practical guest; run it with `-Platform ARM64` and get the Windows 10 half from an x64 host.\n\nStart guests with the default resource profile: 4 vCPUs and 8 GB RAM. Get the target suite fully\ngreen before lowering resources with the `Constrained` profile (1 vCPU and 4 GB RAM).\n\nFor **create, migrate, or stabilize** tasks, complete both profiles and then automatically invoke\n[ui-tests-pipeline-ci](..\u002Fui-tests-pipeline-ci\u002FSKILL.md): pass its access preflight, commit and push\nthe scoped changes, queue CI, and remain attached until terminal validation. **Do not mark the task\ncomplete at local green or wait for another user request to publish\u002Frun CI.** Respect explicit\nlocal-only\u002Fno-push\u002Fno-CI scope and the Microsoft FTE\u002Faccess gates. Local execution or VM setup alone\ndoes not authorize publication. See the pipeline skill for the shared completion and blocker rules.\n\n## How the host reaches the guest\n\n| Concern | Mechanism |\n|---|---|\n| Control channel | PowerShell Direct over VMBus. No listener, port, certificate, or firewall rule in the guest. |\n| Bulk payload | `Copy-VMFile` over the Guest Service Interface, ~82 MB\u002Fs. The session copy is a fallback and stalls on archives near a gigabyte. |\n| Exchange | Guest-local `C:\\PowerToysUiTestExchange\\\u003Cname>`, mirrored by the controller. The host never shares a folder with the guest. |\n| Host privilege | Hyper-V access: an elevated shell, or an account in the local **Hyper-V Administrators** group. Creating a guest additionally requires real elevation. |\n| Console | `scripts\u002FGet-VmConsoleImage.ps1` renders the framebuffer to PNG, so an agent can read boot and desktop state without VMConnect. |\n\n## When to use this skill\n\nUse it when asked to:\n\n- Create or migrate UI tests and iterate repeatedly without reprovisioning Windows each run.\n- Validate Explorer, hotkey, WebView2, shell-extension, foreground, or composed-visual behavior in a\n  real interactive desktop.\n- Run tests as a true standard user while retaining a separate administrator control channel.\n- Reuse unchanged PowerToys, winappcli, and .NET payloads and refresh only changed archives.\n- Keep a reproducible local VM baseline with optional .NET 10, WebView2, diagnostics, or `msvsmon`.\n- Collect durable `status.json`, TRX, transcripts, logs, screenshots, and failure attachments.\n- Compare revisions in one stable VM before confirming the result from a restored checkpoint.\n\nDo not treat a persistent VM as proof of clean-profile behavior. Caches, registrations, settings, and\nfirst-run state survive between runs. Restore the baseline checkpoint or recreate the VM when those\nare the behavior under test.\n\n## Relationship to other UI-test skills\n\n| Skill | Owns |\n|---|---|\n| `ui-tests-migration` | Test design, project scaffolding, framework APIs, assertions, lifecycle, and CI stability. |\n| `ui-tests-local-vm` | Fast persistent-VM setup, deployment, interactive execution, evidence export, and iteration. |\n| `ui-tests-pipeline-ci` | Required post-local commit\u002Fpush, access preflight, scoped CI, and terminal sign-off for implementation tasks. |\n\nDo not modify stabilized tests merely to make the local VM green. First prove that the suite executes,\nproduces assertion-bearing TRX, and has a useful success rate. Classify environment-specific failures\nseparately unless the task explicitly asks for stabilization.\n\n## Guest OS policy\n\n- Two guests, two full suites. Windows 10 Enterprise LTSC 2021 (build 19044\u002F21H2, newer than the\n  Windows 10 20H2 baseline) and Windows 11. Both must be fully green before the local gate passes.\n  LTSC is not available through Fido; `-Source Fido -Windows 10` automates Microsoft's official\n  mobile-user-agent ISO page and is the practical public default. The public ISO\u002FMCT images are too\n  old for .NET 10 CET, so Setup Dynamic Update must bring Win10 to 1904x.5007+ before the baseline.\n  Use licensed Microsoft subscription media for LTSC when available, and always record the edition,\n  ISO hash, and installed full build ([references\u002Fsetup.md §3](references\u002Fsetup.md#3-get-windows-media)).\n- Windows 10 runs first: it is the faster loop and surfaces most defects. Windows 11 then runs the\n  **same** suite, unfiltered - not only the tests that look Windows 11-specific. A test with no\n  Windows 11 content can still fail there, which is the whole reason for the second pass.\n- Narrow filters belong to iteration and diagnosis. They are never the evidence for the Windows 11\n  pass.\n- Give each OS its own VM name, `vm.config.psd1`, VHDX, checkpoints, and exchange. Never upgrade or\n  repurpose the Windows 10 guest into the Windows 11 guest; the two baselines must stay independent.\n- Surfaces that exist only on Windows 11, such as the tier-1 Explorer context menu, need no special\n  handling: the full Windows 11 run already covers them.\n- On a Windows on ARM host, use a Windows 11 ARM64 guest with `-Platform ARM64`. Hyper-V does not\n  emulate a foreign architecture, so that host cannot supply the Windows 10 x64 pass - run it on an\n  x64 host and report both.\n- A Windows 11 host requirement does not make Windows 11 the first guest target.\n- `-Platform` is not cosmetic: it flows to the guest as the `platform` environment variable, names\n  visual baselines, and marks the run as pipeline-like. Use only `x64Win10`, `x64Win11`, or `ARM64`.\n\n## Required reads\n\nRead only what the task needs:\n\n1. [references\u002Fsetup.md](references\u002Fsetup.md) - host requirements, scaffolding, media acquisition,\n   unattended guest creation, credentials, standard-user desktop, and checkpoint baselines.\n2. [references\u002Fagentic-loop.md](references\u002Fagentic-loop.md) - payload contract, controller usage,\n   focused-to-suite iteration, evidence, verdicts, and reset strategy.\n3. [references\u002Fcustomization.md](references\u002Fcustomization.md) - persistent image customization,\n   .NET 10, WebView2, `msvsmon`, resource profiles, and golden-baseline guidance.\n4. [references\u002Ftroubleshooting.md](references\u002Ftroubleshooting.md) - guest creation, PowerShell Direct,\n   interactive session, scheduled-task, focus, timeout, and export failures.\n5. [references\u002Fshell-extensions-and-signing.md](references\u002Fshell-extensions-and-signing.md) - **read\n   for any shell-extension module** (context menu, preview\u002Fthumbnail handler). Why unsigned CI PR\n   builds cannot register a sparse MSIX (0% on CI), classic (registry-COM, signing-free) vs modern\n   (sparse-MSIX) surfaces, Debug vs Release\u002F`NDEBUG` gating, runtime detection, and reproducing CI's\n   classic scenario on a local signed VM.\n6. [ui-tests-migration](..\u002Fui-tests-migration\u002FSKILL.md) - required whenever test code or framework\n   behavior is being created, migrated, or stabilized.\n\n## Default agentic cycle\n\n```mermaid\nflowchart LR\n    A[Design or edit test] --> B[Host build]\n    B --> C[Package changed payload]\n    C --> D[Start or reuse VM]\n    D --> E[Probe standard-user desktop]\n    E --> F[Run focused test]\n    F --> G[Export status TRX evidence]\n    G --> H{Need test change?}\n    H -- Yes --> A\n    H -- No --> I[Run full suite on Win10]\n    I --> J[Run same full suite on Win11]\n    J --> K{Both fully green?}\n    K -- No --> A\n    K -- Yes --> L[Full constrained suites on both OSes]\n    L --> M{Local matrix green?}\n    M -- No --> A\n    M -- Yes --> N[Clean-profile confirmation when required]\n    N --> O[ui-tests-pipeline-ci: preflight, commit, push]\n    O --> P[Scoped CI and synchronous terminal validation]\n```\n\nThe CI continuation applies to implementation tasks; explicit local-only and setup-only tasks stop\nat their requested local outcome.\n\nCreate and maintain this task list:\n\n```markdown\n- [ ] 0. Verify host setup FIRST: `Initialize-LocalVmHost.ps1 -VmRoot \u003Croot> -CheckOnly`. If it reports\n        IsReady=false, STOP and ask the user to run the elevated command it prints - Hyper-V group\n        membership, the DPAPI credential, and guest creation all need a human. Never autopilot past it\n- [ ] 1. Read ui-tests-migration guidance for the target test surface\n- [ ] 1a. Read the target module's dev docs — `doc\u002Fdevdocs\u002Fmodules\u002F\u003Cmodule>.md` (search `doc\u002Fdevdocs\u002F`,\n        including `common\u002F`, if the exact file is missing) — for development-cycle gotchas such as\n        Release\u002F`NDEBUG` registration gating, signed sparse-MSIX context menus, and Explorer restarts,\n        so a module's registration\u002Fdeployment requirements do not surface as opaque test failures.\n        For shell-extension modules also read references\u002Fshell-extensions-and-signing.md.\n- [ ] 2. Scaffold or verify the local VM - references\u002Fsetup.md\n- [ ] 3. Build product and test projects on the host to exit code 0\n- [ ] 4. Package a lean exchange and verify archive hashes\n- [ ] 5. Run the controller with -PlanOnly and inspect its request\u002Fplan\n- [ ] 6. Probe the non-admin interactive desktop before test execution\n- [ ] 7. Run one focused test synchronously; keep the agent turn attached, read the controller\n  result's `.Failed` array (non-passed tests + first error line) instead of re-parsing TRX, and\n  use `scripts\u002FInvoke-GuestScript.ps1` for guest-state inspection\n- [ ] 8. Diagnose the first controlling failure without weakening assertions\n- [ ] 9. Rebuild and rerun with -ReuseStagedPayload\n- [ ] 10. Widen to the full module suite on Windows 10 and report pass rate\u002Froot-cause groups\n- [ ] 11. Run the same full suite in the Windows 11 VM; both must be green before the local gate passes\n- [ ] 12. Restore the baseline checkpoint for clean-profile confirmation when required\n- [ ] 13. Run the full Constrained suite on both OSes; preserve default and constrained evidence\n- [ ] 14. For implementation tasks, invoke ui-tests-pipeline-ci without another user prompt, pass\n        access preflight, commit\u002Fpush task-owned changes, and record the exact branch\u002FSHA\n- [ ] 15. Queue scoped CI and wait synchronously for verified terminal results; local green alone\n        cannot complete the task unless the user explicitly requested local-only scope\n```\n\n## Quick start\n\nHost setup is a one-time, **human-only** step: Hyper-V group membership, the DPAPI guest credential,\nand guest creation all need elevation or a password. Check it before anything else - this needs no\nelevation and changes nothing:\n\n```pwsh\npwsh .github\\skills\\ui-tests-local-vm\\scripts\\Initialize-LocalVmHost.ps1 -VmRoot X:\\PowerToysUiTestVm -CheckOnly\n```\n\nIf it reports `IsReady=false`, stop and ask the user to run the elevated command it prints (see\n[references\u002Fsetup.md §0](references\u002Fsetup.md#0-human-only-host-setup-one-command)). Otherwise scaffold\nthe VM directory outside the repository:\n\n```pwsh\npwsh .github\\skills\\ui-tests-local-vm\\scripts\\Initialize-LocalVm.ps1 `\n  -DestinationRoot X:\\PowerToysUiTestVm\n```\n\nThe scaffold and its `shared` exchange can live on any volume, including a Dev Drive. Only the VHDX\nand VM configuration paths, set separately in `vm.config.psd1`, should point at NTFS.\n\nFollow [references\u002Fsetup.md](references\u002Fsetup.md) to write the untracked `vm.config.psd1`, save the\nadministrator credential with Windows DPAPI, obtain install media, and create the guest with\n`New-UiTestVm.ps1`. Then stage the archives described in\n[references\u002Fagentic-loop.md](references\u002Fagentic-loop.md) and run:\n\n```pwsh\npwsh .github\\skills\\ui-tests-local-vm\\scripts\\Invoke-LocalVmUiTest.ps1 `\n  -VmName PowerToysUiTest-Win10 `\n  -VmRoot X:\\PowerToysUiTestVm `\n  -ExchangeRoot X:\\PowerToysUiTestVm\\shared\\PowerToysUiTests\\MyModule `\n  -TestExecutable MyModule.UITests.Next.exe `\n  -Filter 'Name=MyModule.FocusedTest' `\n  -Platform x64Win10 `\n  -BuildLabel (git rev-parse HEAD) `\n  -SuiteTimeout 15m `\n  -TimeoutMinutes 25 `\n  -ReuseStagedPayload\n```\n\nThe controller starts the VM if needed, requests automatic host sleep prevention, verifies the\ninteractive standard-user desktop, dispatches the guest runner, and waits synchronously for matching\n`status.json`. It reports whether sleep prevention succeeded, fails early if the guest task never\nstarts or exits without status, summarizes TRX, and leaves the persistent VM running by default.\n\n## Non-negotiable rules\n\n- Complete host setup before anything else and **never autopilot around it**. Hyper-V group\n  membership, the DPAPI guest credential, and guest creation are human-only: two need elevation that\n  no tool call can approve, one needs a password that must never reach a model.\n  `Initialize-LocalVmHost.ps1` performs all three; agents run it `-CheckOnly`, and on\n  `IsReady=false` report `BLOCKED`, print the elevated command it emits, and wait. Do not ask for a\n  password, do not substitute a weaker channel, do not proceed on a partial setup.\n  `Invoke-LocalVmUiTest.ps1` enforces the same check.\n- Keep the guest's VHDX and VM configuration on NTFS. On this project's host, keeping them on a Dev\n  Drive wedged the VM management service twice - `vmms` at 0% CPU, even `Get-VM` hanging, host reboot\n  to recover - and moving to NTFS fixed it. This is an observation on one host, not a property of\n  ReFS: Hyper-V on plain ReFS is supported, so `-AllowReFsVolume` overrides the default refusal. The\n  scaffold and the exchange are unaffected and run fine on a Dev Drive.\n- Build on the host; run PowerToys and tests only in the VM when host execution is prohibited.\n- Invoke every focused, full-suite, and constrained controller run synchronously. Keep the active\n  agent turn attached until the controller returns matching status\u002FTRX evidence; never background\n  the controller or end the turn while it runs.\n- Complete the local correctness gate with two green full suites: Windows 10 and Windows 11, in\n  separate VMs. Windows 10 runs first for speed; Windows 11 runs the same unfiltered suite, never a\n  Win11-only subset. Narrow filters are for iteration, not for sign-off. On a Windows on ARM host\n  the ARM64 Windows 11 guest covers the Windows 11 half and the Windows 10 half needs an x64 host.\n- Establish a fully green correctness baseline with the default (4 vCPU \u002F 8 GB) resources before\n  running the same tests under `Constrained` (1 vCPU \u002F 4 GB) resources.\n- For implementation tasks, require both resource profiles and the subsequent pipeline handoff.\n  Report unavailable publication\u002FCI prerequisites as blocked, not as full validation success.\n- Keep VM files and writable exchange folders outside the repository.\n- Keep the guest's default inbound network posture. The control channel does not need connectivity,\n  so do not enable remoting, open ports, or attach the guest to a routable network for test dispatch.\n- Use a DPAPI-protected credential file. Never put credentials in prompts, scripts, request JSON,\n  unattend files kept after install, source control, or command-line arguments.\n- Run UI tests in an already logged-on standard-user desktop, never in session 0 or as `SYSTEM`.\n- Keep a separate administrator account only for VM control and scheduled-task registration.\n- Verify user, token integrity, Explorer presence, session ID, and display size before tests.\n- Run product\u002Ftests from guest-local storage under `C:\\PowerToysUiTestRun`.\n- Use PowerShell 7 for interactive probe\u002Ftest scheduled tasks. PowerShell Direct and OEM bootstrap\n  remain PS5.1-compatible by design; do not enable a remoting endpoint merely to use PS7.\n- Reuse payloads by per-component hashes; refresh only changed tests\u002Fproduct\u002Ftools.\n- Preserve assertions and visual thresholds. Classify VM-specific failures from evidence.\n- Always parse TRX and require `total > 0` plus `executed == total`. A process exit code alone cannot\n  distinguish assertions, skipped\u002Finconclusive tests, zero tests, timeout, or infrastructure failure.\n- Keep the VM after normal runs for iteration. Stop it explicitly when idle; delete its VHDX only for\n  an intentional baseline reset.\n- The controller requests automatic host sleep prevention and reports `HostSleepPrevented`; failure\n  is a warning. It cannot override manual sleep, lid-close policy, reboot, shutdown, or power loss.\n- Final clean-profile claims require a restored baseline checkpoint or a recreated guest. Restore with\n  `Reset-LocalVm.ps1 -Restore`.\n",{"name":5,"license":15,"description":7},"main","5ce7acee5356814f1fbd8e8b8fd27b95c11a6def",".github\u002Fskills\u002Fui-tests-local-vm",8729,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-12 02:45:55",{"source":8,"skillName":5,"commands":72,"prompt":82,"zipAvailable":83},[73,76,79],{"tool":74,"command":75},"npx","npx skills add microsoft\u002FPowerToys --skill ui-tests-local-vm",{"tool":77,"command":78},"bunx","bunx skills add microsoft\u002FPowerToys --skill ui-tests-local-vm",{"tool":80,"command":81},"pnpm","pnpm dlx skills add microsoft\u002FPowerToys --skill ui-tests-local-vm","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002FSKILL.md",true,[85,91,95,99,103,107,111,115,119,123,127,131,137,141,145,149,153,157,161,165,169,173,177,181,185,189,195,199,203,207,211,215,219,223],{"path":86,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":89,"sourceHtmlUrl":90},"dispositions.md","REFERENCE","参考文档",1225,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fmagpie\u002Fblob\u002Fmain\u002Fplugins\u002Fmagpie-issue\u002Fskills\u002Fstale-sweep\u002Fdispositions.md",{"path":92,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":93,"sourceHtmlUrl":94},"failure-modes.md",943,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fmagpie\u002Fblob\u002Fmain\u002Fplugins\u002Fmagpie-issue\u002Fskills\u002Fstale-sweep\u002Ffailure-modes.md",{"path":96,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":97,"sourceHtmlUrl":98},"item-failure-budget.md",2107,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fmagpie\u002Fblob\u002Fmain\u002Fplugins\u002Fmagpie-issue\u002Fskills\u002Fstale-sweep\u002Fitem-failure-budget.md",{"path":100,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":101,"sourceHtmlUrl":102},"link-form.md",1261,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fmagpie\u002Fblob\u002Fmain\u002Fplugins\u002Fmagpie-issue\u002Fskills\u002Fstale-sweep\u002Flink-form.md",{"path":104,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":105,"sourceHtmlUrl":106},"per-issue-activity.md",1342,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fmagpie\u002Fblob\u002Fmain\u002Fplugins\u002Fmagpie-issue\u002Fskills\u002Fstale-sweep\u002Fper-issue-activity.md",{"path":108,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":109,"sourceHtmlUrl":110},"posting-and-close.md",4020,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fmagpie\u002Fblob\u002Fmain\u002Fplugins\u002Fmagpie-issue\u002Fskills\u002Fstale-sweep\u002Fposting-and-close.md",{"path":112,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":113,"sourceHtmlUrl":114},"references\u002Fagentic-loop.md",11353,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Freferences\u002Fagentic-loop.md",{"path":116,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":117,"sourceHtmlUrl":118},"references\u002Fcustomization.md",7745,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Freferences\u002Fcustomization.md",{"path":120,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":121,"sourceHtmlUrl":122},"references\u002Fsetup.md",24333,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Freferences\u002Fsetup.md",{"path":124,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":125,"sourceHtmlUrl":126},"references\u002Fshell-extensions-and-signing.md",12880,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Freferences\u002Fshell-extensions-and-signing.md",{"path":128,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":129,"sourceHtmlUrl":130},"references\u002Ftroubleshooting.md",13814,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Freferences\u002Ftroubleshooting.md",{"path":132,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":135,"sourceHtmlUrl":136},"scripts\u002FGet-VmConsoleImage.ps1","SCRIPT","脚本",3737,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Fscripts\u002FGet-VmConsoleImage.ps1",{"path":138,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":139,"sourceHtmlUrl":140},"scripts\u002FGet-WindowsMedia.ps1",7322,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Fscripts\u002FGet-WindowsMedia.ps1",{"path":142,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":143,"sourceHtmlUrl":144},"scripts\u002FInitialize-LocalVm.ps1",2955,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Fscripts\u002FInitialize-LocalVm.ps1",{"path":146,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":147,"sourceHtmlUrl":148},"scripts\u002FInitialize-LocalVmHost.ps1",20573,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Fscripts\u002FInitialize-LocalVmHost.ps1",{"path":150,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":151,"sourceHtmlUrl":152},"scripts\u002FInvoke-GuestScript.ps1",2557,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Fscripts\u002FInvoke-GuestScript.ps1",{"path":154,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":155,"sourceHtmlUrl":156},"scripts\u002FInvoke-LocalVmUiTest.ps1",35734,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Fscripts\u002FInvoke-LocalVmUiTest.ps1",{"path":158,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":159,"sourceHtmlUrl":160},"scripts\u002FLocalVmGuest.psm1",15676,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Fscripts\u002FLocalVmGuest.psm1",{"path":162,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":163,"sourceHtmlUrl":164},"scripts\u002FUpdate-LocalVmGuest.ps1",7108,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Fscripts\u002FUpdate-LocalVmGuest.ps1",{"path":166,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":167,"sourceHtmlUrl":168},"security-screening.md",693,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fmagpie\u002Fblob\u002Fmain\u002Fplugins\u002Fmagpie-issue\u002Fskills\u002Fstale-sweep\u002Fsecurity-screening.md",{"path":170,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":171,"sourceHtmlUrl":172},"templates\u002Foem\u002FProvision-UiTestVm.ps1",9084,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Foem\u002FProvision-UiTestVm.ps1",{"path":174,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":175,"sourceHtmlUrl":176},"templates\u002Foem\u002FSet-GuestResolution.ps1",3913,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Foem\u002FSet-GuestResolution.ps1",{"path":178,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":179,"sourceHtmlUrl":180},"templates\u002Foem\u002FSet-UiTestAdminPasswordPolicy.ps1",2194,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Foem\u002FSet-UiTestAdminPasswordPolicy.ps1",{"path":182,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":183,"sourceHtmlUrl":184},"templates\u002Foem\u002FSet-UiTestAutoLogon.ps1",6878,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Foem\u002FSet-UiTestAutoLogon.ps1",{"path":186,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":187,"sourceHtmlUrl":188},"templates\u002Frun-ui-tests.ps1",20075,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Frun-ui-tests.ps1",{"path":190,"resourceType":191,"resourceTypeDesc":192,"sizeBytes":193,"sourceHtmlUrl":194},"templates\u002Fvm\u002F.gitignore","OTHER","其他",51,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Fvm\u002F.gitignore",{"path":196,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":197,"sourceHtmlUrl":198},"templates\u002Fvm\u002FNew-UiTestVm.ps1",26949,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Fvm\u002FNew-UiTestVm.ps1",{"path":200,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":201,"sourceHtmlUrl":202},"templates\u002Fvm\u002FReset-LocalVm.ps1",3531,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Fvm\u002FReset-LocalVm.ps1",{"path":204,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":205,"sourceHtmlUrl":206},"templates\u002Fvm\u002FStart-LocalVm.ps1",6663,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Fvm\u002FStart-LocalVm.ps1",{"path":208,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":209,"sourceHtmlUrl":210},"templates\u002Fvm\u002FStop-LocalVm.ps1",2845,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Fvm\u002FStop-LocalVm.ps1",{"path":212,"resourceType":191,"resourceTypeDesc":192,"sizeBytes":213,"sourceHtmlUrl":214},"templates\u002Fvm\u002Funattend\u002Fautounattend.xml.template",8853,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Fvm\u002Funattend\u002Fautounattend.xml.template",{"path":216,"resourceType":191,"resourceTypeDesc":192,"sizeBytes":217,"sourceHtmlUrl":218},"templates\u002Fvm\u002Fvm.config.example.psd1",1612,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftemplates\u002Fvm\u002Fvm.config.example.psd1",{"path":220,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":221,"sourceHtmlUrl":222},"tests\u002FAdminPasswordPolicy.Tests.ps1",16124,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftests\u002FAdminPasswordPolicy.Tests.ps1",{"path":224,"resourceType":133,"resourceTypeDesc":134,"sizeBytes":225,"sourceHtmlUrl":226},"tests\u002FInteractiveTask.Tests.ps1",4437,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-local-vm\u002Ftests\u002FInteractiveTask.Tests.ps1",[228,262,288,320,346,374],{"skillNo":229,"name":230,"nameZh":6,"description":231,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":232,"sourceHtmlUrl":233,"categories":234,"keywords":241,"publishedAt":57},"01M69BBVFWFXVP5T0QRVHVC764","winmd-api-search","Find and explore Windows desktop APIs. Use when building features that need platform capabilities — camera, file access, notifications, UI controls, AI\u002FML, sensors, networking, etc. Discovers the right API for a task and retrieves full type details (methods, properties, events, enumeration values).","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fwinmd-api-search\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fwinmd-api-search\u002FSKILL.md",[235,238],{"categoryNo":236,"categoryName":237,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":239,"categoryName":240,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师",[242,243,244,245,52,246,247,248,249,33,250,251,252,253,254,255,256,257,258,259,260,261],"winmd api search","search","api","file access","ml","desktop","networking","capabilities","notifications","explore","access","camera","methods","full","platform","events","controls","for","features","when",{"skillNo":263,"name":264,"nameZh":6,"description":265,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":266,"licenseFileUrl":267,"sourceHtmlUrl":268,"categories":269,"keywords":271,"publishedAt":57},"01M69BBM5F427YJB53DV40WFEV","ui-tests-migration","Create, migrate, and stabilize PowerToys UI tests with Microsoft.PowerToys.UITest.Next and winappcli, through local VM success, commit\u002Fpush, and CI validation. Use for ports, new UITest projects, flaky CI tests, persistent Hyper-V validation, Settings IPC authentication\u002Ftest signing, Explorer\u002FShell selection, preview handlers, thumbnail providers, hotkey activation, stateful process lifecycle, composed WinUI\u002FWebView visual baselines, or foreground failures. Covers APIs, scaffolding, test design, diagnostics, and the required handoff to ui-tests-pipeline-ci. Keywords: UI test, UITests, UITestAutomation.Next, winappcli, WinAppDriver, Selenium, Settings IPC, not-microsoft-signed, Authenticode, local VM, Hyper-V, checkpoint, migrate, flaky, CI stability, Explorer, Shell extension, WebView2.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-migration\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fui-tests-migration\u002FSKILL.md",[270],{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[272,33,273,29,274,46,275,55,9,54,276,277,49,278,279,34,44,280,281,282,283,284,285,30,286,287],"ui tests migration","migration","design","stability","diagnostics","create","authentication","selenium","migrate","projects","ports","selection","scaffolding","preview","stateful","new",{"skillNo":289,"name":290,"nameZh":6,"description":291,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":266,"licenseFileUrl":292,"sourceHtmlUrl":293,"categories":294,"keywords":295,"publishedAt":57},"01M69BBAKBN3RB0YF8CDV5TTAS","release-note-generation","Toolkit for generating PowerToys stable or preview release notes from GitHub milestones, commit ranges, or Azure DevOps release-candidate builds. Prepare draft preview releases with three-component GitHub tags while preserving four-component build and asset versions. Use when asked to create release notes, summarize milestone PRs, generate changelog, prepare a draft preview release, calculate PR deltas across main and stable, update release documentation, manage PR milestones, or prepare and validate release assets.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Frelease-note-generation\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Frelease-note-generation\u002FSKILL.md",[],[296,297,298,299,300,301,302,303,54,53,304,305,306,307,308,309,310,311,312,277,313,314,49,315,62,316,285,317,318,319,261],"release note generation","release","release note","generation","note","summarize","github","component","azure devops","prepare","documentation","create release","notes","azure","pr","release notes","toolkit","generate","update","deltas","milestone","across","milestones","candidate",{"skillNo":321,"name":322,"nameZh":6,"description":323,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":266,"licenseFileUrl":324,"sourceHtmlUrl":325,"categories":326,"keywords":328,"publishedAt":57},"01M69BB4235609E12GSMJTZWPT","powertoys-verification","Verify PowerToys behavior end-to-end with the winapp CLI across two scenarios: (A) a module's release checklist against the installed build; (B) PR validation — derive each PR's checklist from its description + diff, then drive it against the installed build (a merged\u002Fshipped PR, or a whole release\u002Fhotfix set) or by building + sideloading the module when the PR isn't in the build yet (unmerged or not-yet-released). Drive each item via UIA invoke \u002F Named Events \u002F settings.json edits \u002F clipboard \u002F GPO \u002F SendInput, and emit a structured PASS \u002F FAIL \u002F BLOCKED verdict per item with evidence (FAIL distinguishes product defects from stale\u002Fambiguous checklist items). Use when asked to verify a module checklist, validate a PR, sign off a release\u002Fhotfix's PRs, or QA installed\u002Fsideloaded PowerToys bits. Combines generic winapp ui mechanics (references\u002Fwinapp-ui-testing.md) with PT-specific recipes, per-scenario playbooks (references\u002Fscenarios\u002F), and the helper .ps1 files shipped with this skill.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fpowertoys-verification\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fpowertoys-verification\u002FSKILL.md",[327],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[49,329,330,331,332,53,310,297,33,333,334,335,336,337,338,339,340,257,341,342,343,344,345],"powertoys verification","verification","testing","cli","use","clipboard","files","build","scenario","module","recipes","verdict","release checklist","winapp cli","pt","prs","invoke",{"skillNo":347,"name":348,"nameZh":6,"description":349,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":350,"categories":351,"keywords":355,"publishedAt":57},"01M69BCCP7VKNARGZP6VSSW1PV","publish-extension","Publish your Command Palette extension to the Microsoft Store or WinGet. Use when asked to publish, distribute, release, deploy to store, create MSIX packages, submit to WinGet, set up CI\u002FCD for releases, or automate builds with GitHub Actions.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002Fsrc\u002Fmodules\u002Fcmdpal\u002FExtensionTemplate\u002FTemplateCmdPalExtension\u002F.github\u002Fskills\u002Fpublish-extension\u002FSKILL.md",[352],{"categoryNo":353,"categoryName":354,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",[356,357,358,302,9,359,360,361,277,362,297,363,34,364,365,366,367,368,369,370,371,372,373,261],"publish extension","publish","extension","msix","deploy","packages","command palette","actions","github actions","SET","automate","command","up","releases","distribute","submit","palette","CI\u002FCD",{"skillNo":375,"name":376,"nameZh":6,"description":377,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":378,"categories":379,"keywords":380,"publishedAt":57},"01M69BCAEPE3W6QZF2RTZ9Q28C","add-fallback-commands","Add fallback commands to your Command Palette extension for catch-all search behavior. Use when asked to add search functionality, query matching, direct input handling, calculator-style evaluation, URL opening, command execution, or results that appear when no other extension matches. Used by 14 of 20 built-in extensions.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FPowerToys\u002Fblob\u002Fmain\u002Fsrc\u002Fmodules\u002Fcmdpal\u002FExtensionTemplate\u002FTemplateCmdPalExtension\u002F.github\u002Fskills\u002Fadd-fallback-commands\u002FSKILL.md",[],[381,382,383,384,362,243,385,386,387,388,367,333,389,390,372,391,392,259,393,394,261],"add fallback commands","fallback","commands","add","Evaluation","execution","calculator","direct","query","input","URL","extensions","catch","input handling"]