mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-08-29 10:09:43 +02:00
## Summary of the Pull Request Adds a native C++ multi-call shim that exposes existing PowerToys CLIs through `PATH`. The shims are installed under the PowerToys `bin` subfolder and follow the `PowerToys.<ModuleName>.CLI.exe` naming convention. The launcher preserves the raw argument tail, shares the caller's console, and returns the target process exit code. | PATH-visible command | Target executable | | --- | --- | | `PowerToys.FancyZones.CLI.exe` | `FancyZonesCLI.exe` | | `PowerToys.ImageResizer.CLI.exe` | `WinUI3Apps/PowerToys.ImageResizerCLI.exe` | | `PowerToys.FileLocksmith.CLI.exe` | `FileLocksmithCLI.exe` | | `PowerToys.PowerDisplay.CLI.exe` | `WinUI3Apps/PowerToys.PowerDisplay.Cli.exe` | proof of this work: <img width="1044" height="294" alt="image" src="https://github.com/user-attachments/assets/b659c552-5c08-4430-85c3-eba48f286eb0" /> <img width="1137" height="244" alt="image" src="https://github.com/user-attachments/assets/5fed493f-dc30-428d-a618-bf612ccf3635" /> <img width="1727" height="868" alt="image" src="https://github.com/user-attachments/assets/5c32fd2e-4a3a-4138-b968-fb5434eebec3" /> ## PR Checklist - [x] Closes: #48634 - [x] **Communication:** Discussed with core contributors in this PR - [x] **Tests:** Added/updated and all pass - [ ] **Localization:** CLI diagnostic messages are not localized - [x] **Dev docs:** Updated CLI naming and installation conventions - [x] **New binaries:** Added on the required places - [x] Signing JSON - [x] WiX installer entries - [x] CI builds through `PowerToys.slnx`; no dedicated YML step is required - [x] The existing release pipeline covers the solution and installer - [x] **Documentation updated:** `doc/devdocs/cli-conventions.md` ## Detailed Description of the Pull Request / Additional comments - Uses one native launcher binary for all commands and resolves the target from the invoked shim filename. - Installs PATH-visible shims under `PowerToys\bin`. - Keeps the existing module CLI binaries and their deployment locations unchanged. - Rejects the previous unsuffixed and `*cli` command aliases. ## Validation Steps Performed - Built `tools/CliShim.UnitTests/CliShim.UnitTests.vcxproj` in `Release|x64`: 0 warnings, 0 errors. - Ran `CliShim.UnitTests.dll` with `vstest.console.exe`: 5/5 tests passed. - Verified the CLI manifest, WiX command names, and `bin` installation directory are synchronized. - Ran `git diff --check`. --------- Co-authored-by: Yu Leng <yuleng@microsoft.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d11c4221-248f-44a9-85fb-7017ed43f4ce
75 lines
3.6 KiB
XML
75 lines
3.6 KiB
XML
<Include>
|
|
<!-- Names of folders and projects -->
|
|
<?define FancyZonesProjectName="FancyZones"?>
|
|
<?define ImageResizerProjectName="ImageResizer"?>
|
|
<?define KeyboardManagerProjectName="KeyboardManager"?>
|
|
<?define PowerAccentProjectName="PowerAccent"?>
|
|
<?define PowerRenameProjectName="PowerRename"?>
|
|
<?define FileLocksmithProjectName="FileLocksmith"?>
|
|
<?define ColorPickerProjectName="ColorPicker"?>
|
|
<?define PowerOCRProjectName="PowerOCR"?>
|
|
<?define AwakeProjectName="Awake"?>
|
|
<?define MouseUtilsProjectName="MouseUtils"?>
|
|
<?define AlwaysOnTopProjectName="AlwaysOnTop"?>
|
|
<?define MeasureToolProjectName="MeasureTool"?>
|
|
<?define HostsProjectName="Hosts"?>
|
|
<?define MouseWithoutBordersProjectName="MouseWithoutBorders"?>
|
|
<?define AdvancedPasteProjectName="AdvancedPaste"?>
|
|
<?define RegistryPreviewProjectName="RegistryPreview"?>
|
|
<?define PeekProjectName="Peek"?>
|
|
<?define WorkspacesProjectName="Workspaces"?>
|
|
|
|
<?define RepoDir="$(var.ProjectDir)..\..\" ?>
|
|
<?if $(var.Platform) = x64?>
|
|
<?define PowerToysPlatform="x64"?>
|
|
<?define PlatformProgramFiles="[ProgramFiles64Folder]"?>
|
|
<?define PlatformLK="x64" ?>
|
|
<?define BinDir="$(var.RepoDir)x64\$(var.Configuration)\" ?>
|
|
<?else?>
|
|
<!-- stable WIX 3 doesn't support ARM64, so we build installers as x86 -->
|
|
<?define PowerToysPlatform="ARM64"?>
|
|
<!--TODO: define to ARM64 Program files once it's available-->
|
|
<?define PlatformProgramFiles="[ProgramFiles6432Folder]"?>
|
|
<?define PlatformLK="arm64" ?>
|
|
<?define BinDir="$(var.RepoDir)ARM64\$(var.Configuration)\" ?>
|
|
<?endif?>
|
|
|
|
<?if $(var.PerUser) = "true"?>
|
|
<?define PerMachineYesNo="no"?>
|
|
<?define MSIPath="UserSetup"?>
|
|
<?define MSIName="PowerToysUserSetup-$(var.Version)-$(var.PowerToysPlatform).msi"?>
|
|
<?define DefaultInstallDir="LocalAppDataFolder" ?>
|
|
<?define RegistryScope="HKCU" ?>
|
|
<?define InstallScope="perUser" ?>
|
|
<?define InstallPrivileges="limited" ?>
|
|
<?define UpgradeCodeGUID="D8B559DB-4C98-487A-A33F-50A8EEE42726" ?>
|
|
<?else?>
|
|
<?define PerMachineYesNo="yes"?>
|
|
<?define MSIPath="MachineSetup"?>
|
|
<?define MSIName="PowerToysSetup-$(var.Version)-$(var.PowerToysPlatform).msi"?>
|
|
<?define DefaultInstallDir="ProgramFiles64Folder" ?>
|
|
<?define RegistryScope="HKLM" ?>
|
|
<?define InstallScope="perMachine" ?>
|
|
<?define InstallPrivileges="elevated" ?>
|
|
<?define UpgradeCodeGUID="42B84BF7-5FBF-473B-9C8B-049DC16F7708" ?>
|
|
<?endif?>
|
|
|
|
<!--
|
|
DACL for every folder PowerToys adds to the machine PATH.
|
|
|
|
D:P is the point: it drops inherited ACEs. A per-machine INSTALLFOLDER is overridable
|
|
(PowerToys.wxs InstallFolder), and a custom root such as C:\PowerToys inherits
|
|
"Authenticated Users: Modify" from the drive root - which would let any standard user plant
|
|
binaries in a folder that every process on the machine searches. SYSTEM and Administrators
|
|
keep full control; BUILTIN\Users keep read + execute so non-admins can still run the commands.
|
|
|
|
Author this on the same component as the folder's Environment PATH entry, so a new
|
|
PATH-visible folder cannot ship without it. Per-user installs live under %LOCALAPPDATA% and
|
|
must NOT use this - InstallPrivileges is "limited" there, and this SDDL would leave the
|
|
installing user with only read + execute on their own install.
|
|
-->
|
|
<?define MachinePathFolderSddl="D:PAI(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GRGX;;;BU)(A;OICIIO;GA;;;CO)" ?>
|
|
|
|
<?define BinX32Dir="$(var.RepoDir)x86\$(var.Configuration)\" ?>
|
|
</Include>
|