Files
PowerToys/PowerToys.slnx
Zhibo Lin 19c4d80532 CmdPal: use unique IDs for PowerToys fallback commands (#50047)
## Summary of the Pull Request

PowerToys fallback commands currently all use the same fallback ID
(`com.microsoft.powertoys.fallback`). Because Command Palette persists
fallback settings by ID, disabling one command writes a setting that is
then read by every fallback command in the provider.

This change derives each fallback item's ID from the command's existing
stable ID by appending `.fallback`, so fallback settings are stored
independently without colliding with the underlying command IDs. It also
adds a focused regression test covering the generated fallback IDs.

## PR Checklist

* [x] Closes: #48607
* [x] **Communication:** The issue is labeled `Help Wanted`;
implementation intent and approach were posted in #28769.
* [ ] **Tests:** Added; official CI pending. The local PowerToys build
is blocked because the available Visual Studio/MSBuild 17.10 cannot load
the repository's .NET 10 SDK, which requires MSBuild 18.
* [x] **Localization:** No end-user-facing strings were added or
changed.
* [x] **Dev docs:** Not applicable; no public behavior or API contract
was added.
* [x] **New binaries:** No shipping binaries were added. The new
unit-test assembly is included in `PowerToys.slnx` and the applicable
Command Palette solution filters, and matches the existing
`*UnitTest*.dll` CI test discovery pattern.
* [x] **Documentation updated:** Not applicable.

## Detailed Description of the Pull Request / Additional comments

`ProviderSettingsViewModel` stores fallback state in a dictionary keyed
by `IFallbackCommandItem.Id`. The PowerToys extension generated many
fallback items with one shared ID, causing the last persisted state for
that key to apply to the entire provider after reopening settings.

All commands produced by the PowerToys module catalog already have
stable, unique IDs used for command identity and pinning. Appending
`.fallback` to those IDs gives each fallback item a stable, unique
identity while keeping it distinct from the underlying command. Existing
legacy settings under `com.microsoft.powertoys.fallback` are left
harmlessly unused because there is no meaningful way to map that shared
value back to one specific command.

The new unit-test project is also included in the applicable Command
Palette solution filters so it is available in the relevant development
and test configurations.

## Validation Steps Performed

* Added `FallbackItemsAppendFallbackSuffixToCommandIds`, covering two
commands and verifying that fallback IDs append `.fallback`, remain
distinct from the underlying command IDs, and remain unique across
commands.
* Added the new unit-test project to `PowerToys.slnx`,
`CommandPalette.slnf`, `CommandPalette - no UI tests.slnf`, and
`Microsoft.CmdPal.Ext.PowerToys.slnf`.
* Included `Microsoft.CmdPal.Ext.UnitTestsBase` in the
PowerToys-specific solution filter because it is a direct dependency of
the new unit-test project.
* Validated the modified solution and project files.
* Confirmed all 64 literal command IDs in the PowerToys module providers
are unique.
* Ran `git diff --check` successfully.
* Attempted the repository-prescribed targeted Release/x64 build. It
reached MSBuild but was blocked by the local toolchain version noted
above; authoritative build and test results are therefore left to CI.
2026-08-23 15:43:22 -05:00

77 KiB