Compare commits

..

8 Commits

Author SHA1 Message Date
Mike Griese
bc350cc10a Adds support for JUMBO thumbnails in the helper
We should expose this as a seperate toolkit function
2025-03-20 07:01:17 -05:00
Mike Griese
987d992a43 Merge remote-tracking branch 'origin/main' into dev/migrie/b/annoyed-at-you-git 2025-03-19 21:40:07 -05:00
Mike Griese
e690c206ab unsurprisingly, I broke hotkeys and aliases 2025-03-19 16:55:14 -05:00
Mike Griese
7386dbbbb3 Merge remote-tracking branch 'origin/main' into dev/migrie/b/annoyed-at-you-git 2025-03-19 16:54:58 -05:00
Mike Griese
e9ed7cde84 fwlinks for fun and profit 2025-03-19 14:54:28 -05:00
Mike Griese
873573d4c6 dead code 2025-03-19 14:09:19 -05:00
Mike Griese
b67ce31c53 reformat 2025-03-19 13:59:46 -05:00
Mike Griese
3b9297bf97 Squashed commit of the following:
commit c63fa5c21a
Merge: 45b82ef04 dfb727f9a
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 13:23:19 2025 -0500

    Merge remote-tracking branch 'upstream/main' into dev/migrie/b/426-merge-top-level-abstractions

commit 45b82ef043
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 13:22:23 2025 -0500

    fix fallbacks

commit 730b82e737
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 13:08:33 2025 -0500

    that's all the SUI changes

commit 0ea2960dd9
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 13:02:27 2025 -0500

    update the commands in the SUI when needed

commit f6d3356395
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 12:54:34 2025 -0500

    enable / disable on extension page too

commit 550964bcc3
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 10:20:30 2025 -0500

    writes the settings

commit d85d6d9f18
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 10:17:44 2025 -0500

    this can persist the setting, but doesn't on toggle

commit 482d40c86d
Merge: d791f3527 a13abc380
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 08:53:02 2025 -0500

    Merge remote-tracking branch 'upstream/main' into dev/migrie/b/426-merge-top-level-abstractions

    # Conflicts:
    #	src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.System/SystemCommandExtensionProvider.cs
    #	src/modules/cmdpal/Exts/Microsoft.CmdPal.Ext.TimeDate/TimeDateCommandsProvider.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/CommandProviderWrapper.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Commands/MainListPage.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/IconDataViewModel.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/IconInfoViewModel.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Messages/PerformCommandMessage.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/ProviderSettings.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/ProviderSettingsViewModel.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/SettingsModel.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/TopLevelCommandManager.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/TopLevelViewModel.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI/Pages/ShellPage.xaml.cs
    #	src/modules/cmdpal/Microsoft.CmdPal.UI/Settings/ExtensionsPage.xaml

commit d791f3527f
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 08:44:09 2025 -0500

    starting to add IExtension for built-ins

commit 7f4d85a7f5
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 08:38:01 2025 -0500

    disabling extensions

commit 5afe771abc
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 06:28:55 2025 -0500

    RIP in peace TopLevelCommandItemWrapper

commit 6b5acbb991
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 05:06:37 2025 -0500

    the settings don't crash anymore

commit 7fb8aa4dd5
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 04:02:59 2025 -0500

    I think that's all for TLCIW->TLVM. Now need to merge the providers

commit e0d879f241
Merge: f1067c290 327814658
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 19 03:13:38 2025 -0500

    Merge remote-tracking branch 'origin/main' into dev/migrie/b/426-merge-top-level-abstractions

commit 3278146589
Merge: edad8bf78 37cab3800
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Mar 18 20:43:06 2025 -0500

    Merge pull request #582 from zadjii-msft/dev/migrie/merge-upstream-again-again

    the last one (probably)

commit 37cab3800c
Merge: edad8bf78 a62acf7a7
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Mar 18 20:40:46 2025 -0500

    Merge remote-tracking branch 'upstream/main' into dev/migrie/merge-upstream-again-again

commit edad8bf784
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Mar 18 17:00:50 2025 -0500

    Add a new icon for run (#574)

    Couple other hotfixes:

    * We broke FastUpToDate in #559. `PreserveNewest` fixes this
    * Winget would fetch ALL the details before displaying the list. Big yikes. Lazy load that!
    * We needed to better handle the case where we fetched items in response to a `ItemsChanged`, Loading is set to false, && there's an EmptyContent - we shouldn't flash the empty state before displaying the results
    * Details had itsy-bitsy text (regressed in #482)

commit df65e2a568
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Mar 18 17:00:33 2025 -0500

    get rid of the thumbnail setting (#575)

commit 1d33f2b645
Author: Niels Laute <niels.laute@live.nl>
Date:   Tue Mar 18 19:32:48 2025 +0100

    Minor UX tweaks (#562)

    - Tweaking the empty-screen icon + text visualization
    - Fixed a bug in the details pane that clipped the content when scrolling (we were using padding on the scrollviewer vs. margin on the child grid)
    - Vertically center the tags on the item line

commit e6acb4deb6
Author: moooyo <42196638+moooyo@users.noreply.github.com>
Date:   Wed Mar 19 02:26:33 2025 +0800

    Migrate system commands extension (#452)

    ## Summary of the Pull Request

    Ports the PT System commands to CmdPal.

    Tooltips have been replaced with Details on those list items.

    CommandResult.Confirm was used for most of the MessageBox usages (the only remaining one is after the recycle bin is emptied)

    https://github.com/user-attachments/assets/5b849f56-8346-4a6d-9ecb-13757aed738a

    ## PR Checklist

    - [x] **Closes:** #384

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

commit 973b3323fe
Author: Seraphima Zykova <zykovas91@gmail.com>
Date:   Tue Mar 18 19:22:14 2025 +0100

    Thumbnails fix (#573)

    Fixed the crash related to thumbnails.
    * Set the Unicode charset for the native SHFILEINFO
    * Ensure proper releasing of the icon handle

    <!-- Please review the items on the PR checklist before submitting-->
    ## PR Checklist

    - [x] **Closes:** https://github.com/zadjii-msft/PowerToys/issues/440

commit 997c8acb46
Author: moooyo <42196638+moooyo@users.noreply.github.com>
Date:   Wed Mar 19 02:21:04 2025 +0800

    Fix the MSI installer issue when App plugin is running. (#557)

    Our App plugin used the ShellLink.Open to retrieve the FullPath. But it would open the ink file exclusively. This may cause some problem. Especially when we try to upgrade some installed App through MSI installer, installer would throw exception and show a prompt to user.

    Original discussion here:

    1. https://github.com/microsoft/PowerToys/pull/37654
    2. https://github.com/microsoft/PowerToys/pull/37924
    3. https://github.com/microsoft/PowerToys/pull/37987

    Tested locally with VS.

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

commit dc9bc113d8
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Tue Mar 18 15:40:13 2025 +0100

    Provide a bit better Settings/OOBE screenshots (#570)

    just a bit better placeholders so we don't merge current FIX THIS ones

commit 4e30d9ce88
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Mar 18 09:28:01 2025 -0500

    Some better logging for extension startup (#571)

    The E_PATH_NOT_FOUND happens if you just delete an extension, without uninstall

    This should make extension startup easier to track (at the least)

commit bab156763d
Author: Niels Laute <niels.laute@live.nl>
Date:   Tue Mar 18 15:18:38 2025 +0100

    ToastWindows tweak (#569)

    - Using default acrylic which is fine for notifications (it's not activated anyways because the window does not have focus..), and it removes a bunch of C# code.
    - Minor tweaks to the padding of the toastwindow so it's more similar to OS toasts

commit 56f6f144bd
Author: moooyo <42196638+moooyo@users.noreply.github.com>
Date:   Tue Mar 18 21:25:02 2025 +0800

    Add Icon for TimeDate extension in settings page. (#565)

    1. Remove unused file
    2. Fix Icon in Extensions setting page.
    3. Fix save settings issue

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

commit 6dcaa8dca4
Author: Niels Laute <niels.laute@live.nl>
Date:   Tue Mar 18 14:23:48 2025 +0100

    Searchbox with suggest text + cursor fix (#482)

    - Re-templated the search box template to use the TextBox `Description` property as the suggested text
    - Created a custom background color in lightmode so that the cursor has enough contrast and shows. As a result, the Acrylic is less intense in light mode :(.

    Closes #348
    Closes #427

    ---------

    Co-authored-by: Mike Griese <migrie@microsoft.com>

commit 47d0538a2f
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Mar 18 08:23:27 2025 -0500

    Make sure all the MinVersion's are 19041 (#568)

    Closes #493

commit df64a02738
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Mar 18 08:23:18 2025 -0500

    Mildly reduce memory leakage (#564)

    This doesn't totally resolve the leak tracked in #545, but it's dramatically less bad now.

    * Use a `WeakReference` to the page context for all extension objects.
      - actually makes the code much cleaner to read.
    * Revoke all event handlers we attach to ExtensionObjects

    Because it got mangled into this commit history:
    This also has the code we need to call for #546, but it doesn't work. I'll reach out to Mano for this.

commit 78c8195668
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Tue Mar 18 11:07:51 2025 +0100

    try fix ci 2 (#567)

commit 728b36420c
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Tue Mar 18 09:55:15 2025 +0100

    Try fix ci (#566)

commit 90d9bca81d
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Mar 17 15:48:30 2025 -0500

    more nits (#563)

    * MTAThread considered harmful
    * a bunch of spel
    * more spel
    * it helps to save files
    * Don't add a toggle if it doesn't do anything
    * ffs code just trim trailing whitespace on save

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 180ac1e84e
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Mon Mar 17 17:05:17 2025 +0100

    Various fixes. See description (#558)

    1) Clicking CmdPal in PT quick access flyout now shows CmdPal
    2) Removed New badge from settings. For now! we'll bring it back properly once we are close to the release!
    3) Reverted unrelated file (src/modules/registrypreview/RegistryPreviewUILib/MonacoEditorControl.xaml.cs) change
    4) Fix package name in customaction.cpp to fix package uninstall on PT uninstall
    5) Reverted unrelated file  (src/modules/launcher/PowerLauncher/Helper/ThemeManager.cs) change
    6) Fix wrongly added words in expect.txt
    7) Fix local build - do not include cmdpal
    8) Revert unrelated change - src/common/AllExperiments/Logger.cs
    9) Revert unrelated change - src/modules/AdvancedPaste/AdvancedPasteModuleInterface/dllmain.cpp

commit 0e77697e2a
Author: Niels Laute <niels.laute@live.nl>
Date:   Mon Mar 17 14:36:33 2025 +0100

    Colored icons (#559)

    * AllApps

    * File Explorer

    * Windows Settings

    * Windows Terminal

    * DateTime

    * Calculator

    * Registry

    * WinGet

    * WebSearch

    * Use PNGs instead of SVGs for better rendering

commit 57c193a2d0
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Mon Mar 17 13:31:49 2025 +0000

    Fix CommandPalette package checking at runtime (#556)

    <!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? -->
    ## Summary of the Pull Request

    After 33ec492389 , The logic for Command Palette module interface to verify if the package is installed is wrong because Command Palette's version doesn't track PowerToys version.

    This PR makes the version check optional so we can have a different logic when checking the package for Command Palette.

    <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well -->
    ## Validation Steps Performed
    Tested build from Dart and PowerToys started Command Palette correctly.

commit 6d07dba9e2
Author: Mike Griese <zadjii@gmail.com>
Date:   Sun Mar 16 06:08:31 2025 -0500

    Add some tooltips, and tighten up some phrasing (#555)

    * Tags have their tooltip default to their text, if no `ToolTip` is explicitly set
    * add a `ctrl+k` tooltip to the more commands button
    * change the naming of "indexer" to be "file search" (which is what folks really care about)
    * change the naming of "shell commands" to be "Run commands" (again, this is more intuitive)

commit 18ff9d4b99
Author: Mike Griese <zadjii@gmail.com>
Date:   Sun Mar 16 06:08:15 2025 -0500

    Add support for a startup task (#554)

    Closes #98

commit f762f0dc37
Author: Mike Griese <zadjii@gmail.com>
Date:   Sun Mar 16 06:07:56 2025 -0500

    Lazy-init details for app items (#552)

    Use less memory on apps by lazy-init'ing details, icons

commit 16650db1c9
Author: Mike Griese <zadjii@gmail.com>
Date:   Sat Mar 15 20:02:11 2025 -0500

    A pair of threading issues: MoreCommands and Tags (#553)

    * Issue the first: This hit with the media controls sample. I'm not really sure how it happened, with the menu changing which we were initializing it? But it happens, and now it doesn't
    * Issues the second: `Tags` was an `ObservableCollection`, and that was getting created off the UI thread, then updated on the UI thread, and everyone was upset, and there was a pile of COM WRONG_THREAD issues.
    * ISSUE THE THIRD: FIXES THE TAG COLORS! Closes #365

commit ef085c532a
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Sat Mar 15 03:08:06 2025 +0000

    [OOBE]Fix crash when opening OOBE (#551)

    <!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? -->
    ## Summary of the Pull Request

    Oobe changes were missing the insert of a module, causing Settings to crash when we tried to open OOBE.

    <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well -->
    ## Validation Steps Performed

    Run PowerToys Settings and click "Welcome to PowerToys" and verify it doesn't crash.

commit 4cb35e2954
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Mar 14 12:54:27 2025 -0500

    [MAIN] this is so bad (#550)

    (cherry picked from commit ddbfbd7b89105a9d3843b7a0284ff03ed367b808)
    (cherry picked from commit 803d800923f2144c61a484484a4796667ae57727)

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit cc92362f54
Author: Seraphima Zykova <zykovas91@gmail.com>
Date:   Fri Mar 14 18:44:19 2025 +0100

    [File Search] Fix unresponsive UI after scrolling (#535)

    UI could become unresponsive after searching and scrolling through files (to reproduce, I needed around 180-260 items in the list).

    The fix forces triggering loading more on a non-UI thread and ensures non-simultaneous loading.

commit fd5606bcfa
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Mar 13 16:50:40 2025 -0500

    [build] fix the bindir (#547)

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 28f129dc16
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Thu Mar 13 18:32:41 2025 +0000

    [Deps]Align Webview2 versions to fix deps.json check (#544)

    <!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? -->
    ## Summary of the Pull Request
    Bring back the WebView2 references that were removed in 9365bc1a7b

    <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well -->
    ## Validation Steps Performed
    deps.json local check is OK

    ---------

    Co-authored-by: Mike Griese <migrie@microsoft.com>

commit b728c341fa
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Mar 13 13:32:03 2025 -0500

    Add viewmodels to ConfirmResultArgs (#543)

    From #536 originally

    Also adds more elaborate samples for them.

    Closes #399

    ---------

    Co-authored-by: moooyo <42196638+moooyo@users.noreply.github.com>

commit b92525f9aa
Author: Kayla Cinnamon <cinnamon@microsoft.com>
Date:   Thu Mar 13 11:20:55 2025 -0400

    update banner on Run page (#540)

    Updates the description of Command Palette on the settings page
    Updates the banner on the Run settings page promoting Command Palette

commit 9365bc1a7b
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Mar 13 10:06:06 2025 -0500

    A bunch of PR nits (#541)

    * update template

    * Start drafting a doc for our core values

    mostly just stashing

    * Add more text

    * some pr nits

    * PG-SP-ID not needed after all

    * look a dependency we didn't need

    * more deps we didn't need

    * pretty sure these were removed upstream

    * Trying to merge expect.txt

    * okay sure

    * Revert "Trying to merge expect.txt"

    This reverts commit 96750a69161e36400acf270573a2f08200c8c7e5.

    * unnecessary local

    * enable nullable on clipboard history

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 916998ff25
Merge: 174cd5d99 13d41e0b2
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Mar 13 09:35:10 2025 -0500

    Merge pull request #542 from zadjii-msft/dev/migrie/merge-upstream-again

    Merges the upstream changes to expect.txt, which the PR is very confused about

commit 13d41e0b27
Merge: 174cd5d99 a00f56e31
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Mar 13 09:32:31 2025 -0500

    Merge remote-tracking branch 'upstream/main' into dev/migrie/merge-upstream-again

commit 174cd5d99e
Merge: ffab2db1f 4c420b59d
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Mar 12 13:05:35 2025 -0500

    Merge pull request #539 from zadjii-msft/dev/migrie/sync-upstream

    Already kinda did this in #537, but git doesn't know that

commit 4c420b59d9
Merge: ffab2db1f ccb77ff60
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Mar 12 13:02:39 2025 -0500

    Merge remote-tracking branch 'upstream/main' into dev/migrie/sync-upstream

commit ffab2db1f9
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Mar 12 06:55:46 2025 -0500

    Add a README (#538)

    Also fix one bug with the bookmarks and quit extensions

commit 2bb66b5404
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Mar 12 06:23:23 2025 -0500

    [Deps]Update dependencies to .NET 9.0.3 (#537)

    * [Deps]Update dependencies to .NET 9.0.3

    * Sometimes mike, you should build before rolling a CI build

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

commit abdc556ce6
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Wed Mar 12 10:53:18 2025 +0000

    [Deps]Update CommunityToolkit.WinUI to 8.2.250129-preview2 (#534)

    <!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? -->
    ## Summary of the Pull Request
    Update CommunityToolkit.WinUI dependencies to 8.2.250129-preview2 .
    Related to #245 - fixes the part about PowerToys Settings crashing when opening the Dashboard page.

    <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well -->
    ## Validation Steps Performed
    Open PowerToys settings and it opens in the Dashboard page without crashing.

commit f1067c290f
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Mar 11 16:06:39 2025 -0500

    Stash working on #426

    Goal here is to merge TopLevelCommandItemWrapper -> TopLevelViewModel.

    TLVM will have the IListItem implementation. It'll implement it by exposing
    properties off the CIVM.

    That way, we can wrap up the toplevel CI from the extension into a CIVM,
    stash the properties into the CIVM,
    then use the TLVM safely.

    Otherwise, the way the SUI works today is super unsafe. In fact, TLCIW is
    generally unsafe, just didn't realize it. It wasn't copying jack

    Stashing cause I have other stuff that needs to get done today

commit b9df74d227
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Mar 11 13:04:59 2025 -0500

    Bump the remaining vcxproj's to the new WASDK version (#533)

    This is from #531

commit a025870da2
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Mar 11 12:43:48 2025 -0500

    Format, and bump the project template to 0.0.9 (#532)

    Closes #492
    Closes #484

commit 3dcf93a3b3
Merge: ab576c6d3 88677e6b3
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Mar 11 12:41:30 2025 -0500

    Merge pull request #531 from zadjii-msft/dev/jaime/merge-latest-main

    <!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? -->
    ## Summary of the Pull Request
    Merges latest upstream main, so we can update to Windows App SDK 1.6.250205002 and CsWinRT 2.20

    This is required as a preliminary step to update WinUI toolkit controls to fix the crash in the Settings Dashboard page.

commit 88677e6b37
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Tue Mar 11 15:25:02 2025 +0000

    proper fix for spellcheck

commit d11ee7d320
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Tue Mar 11 15:20:22 2025 +0000

    Fix spellcheck

commit 5b1d7722bf
Merge: ab576c6d3 3b05cf127
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Tue Mar 11 14:45:15 2025 +0000

    Merge remote-tracking branch 'upstream/main' into main

commit ab576c6d3e
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Mar 11 09:01:41 2025 -0500

    Remove all the old samples that we can't ship ourselves (#530)

    There were some absolutely critical examples in here to make sure that the APIs
    worked, but at this point, those are usually exercised in a different sample
    somewhere.

    RIP in peace spongebot. You'll be missed.

    Closes #133
    Closes #154

commit 4fca47201d
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Mar 11 08:57:18 2025 -0500

    Localize all the remaining in-app resources (#521)

    There's a couple things I left un-translated, but those are typically:
    * exception text, that I thought should be left un-translated
    * weird things like the `quit` or `reload` command, that depend on literally typing `quit`

    Closes #352
    Closes #124

commit 971aaceaa3
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Mar 11 08:42:44 2025 -0500

    Last API breaks before 0.1 (#529)

    * Removes `ExtensionHost.HostingHwnd`
      * This closes #477
    * Removes `ExtensionHost.LanguageOverride`
      * This closes #135 (as not planned, frankly. Having a different locale than the OS has always been fraught with pain for the Terminal, not about to repeat that here)
    * This also removes the straggling `IFormPage`, `IForm`, `IMarkdownPage`, which were all replaced with `IContent`
    * Adds `StatusContext` to `ShowStatus`, so that messages can just be displayed on the page they're from
      * Closes #471

commit bb40313443
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Mar 11 08:09:22 2025 -0500

    Uhg, I broke everything (#528)

    This is stuff that regressed in #518, for the large part.

    This is also about the time I discovered #525, #526 and #527

commit 03db033bba
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Mon Mar 10 18:16:45 2025 +0100

    Fix scrolling when many items (e.g. All Apps) and fix Details labels update  (#498)

    Closes #407 (at least well enough)
    Closes #466
    Closes #481

    Related to #365, but doesn't fix that.

commit 68cc9b84f4
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Mon Mar 10 13:51:16 2025 +0000

    [GPO]Add a policy for controlling CmdPal enabled state (#503)

    As bad as the title sounds.

    Fix is as easy as you'd think.

    Closes #512.

commit 013881783a
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Mar 10 08:49:31 2025 -0500

    fix handling command invokes ON THE UI THREAD (#518)

    As bad as the title sounds.

    Fix is as easy as you'd think.

    Closes #512.

commit 5002889e27
Author: Mike Griese <zadjii@gmail.com>
Date:   Mon Mar 10 08:49:24 2025 -0500

    `virtual` on all, and other toolkit changes (#515)

    Closes #254
    Closes #472
    Closes #491

commit 6df8685b96
Author: Mike Griese <zadjii@gmail.com>
Date:   Mon Mar 10 08:49:13 2025 -0500

    Fix bookmarks bugs by tidying code (#513)

    The bookmarks code was always a little wacky. This is 100% less wack.

    Fixes #467
    Fixes #468

commit 26c663e396
Author: Mike Griese <zadjii@gmail.com>
Date:   Fri Mar 7 19:59:53 2025 -0600

    Add support for alt+left to go back (#487)

    Closes #398

commit 27797d031a
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Mar 7 19:59:08 2025 -0600

    Add support for svg icons (#486)

    Yep, it was this easy to add an SVG as an ImageSource on WinUI 3

    Pretty sure it's impossible in WinUI 2 though

    This is related to #182, but I think we should also like allow for `<path>` icons too

commit 92106e60de
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Mar 7 19:58:21 2025 -0600

    Don't fetch all the items all at once (#501)

    _targets #499_

    closes #389
    closes #390
    closes #391
    Probably also closes #388

    but also creates #502, and I think that's a reasonable tradeoff

commit 5147b26a01
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Mar 7 19:55:54 2025 -0600

    Browse command and EmptyContent (#499)

    Due to the nature of FHL I didn't do a great job disentangling the following two big features:

    * Support for `EmptyContent`
      * closes #261
    * Support for a "Browse" `DirectoryPage` which is like a file explorer.
      * Folder bookmarks can open it
      * So can folders in the file search
    * Also adds a fallback command for if you type a file path, we'll show that

    drive-by fixes the icon on the context menu flyout, if the Command has an icon that's different from the list item. We'll prefer the Command's icon to the CommandItem's icon

commit abdd298c3c
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Mar 5 16:08:14 2025 -0600

    Add support for commands on content pages (#495)

    Basically just abstracts what we already had for list items, and uses that abstraction for contentpageviewmodel too

    Closes #476

commit 5accdc636f
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Mar 5 16:07:57 2025 -0600

    Include the extension name in the weight of the item (#496)

    This better matches the way vscode works, even if it doesn't explicitly show the extension name in the item

    Weighting might need work, but it probably all needs work so 🤷

commit 9dc04d8f27
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Mar 5 16:07:41 2025 -0600

    This should make details observable (#497)

    This doesn't take care of #466, but it is a bug nonetheless

commit fcc350a73c
Merge: 29c5c78eb aaa226f99
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Feb 28 12:45:18 2025 -0600

    Merge pull request #469 from zadjii-msft/stefan/try_fix_git_history

    Merge upstream PT #14 and try fix git history

commit aaa226f99f
Merge: 29c5c78eb 22e29d125
Author: Stefan Markovic <stefan@janeasystems.com>
Date:   Fri Feb 28 15:06:18 2025 +0100

    Merge remote-tracking branch 'mainPT/main'

commit 29c5c78eb3
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 27 15:04:01 2025 -0600

    Bump template to 0.0.7 SDK (#464)

    Bump template to 0.0.7 SDK

commit d349e3374e
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Thu Feb 27 22:03:37 2025 +0100

    Merge upstream PT #13 (#462)

    * [Workspaces] implement the move feature (#35480)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * fix Move attribute after launch and snapshot

    * Extend WindowArranger with PWA functionality to detect different PWA apps. PwaHelper moved to the common library

    * fix repeat counter in the editor

    * Code optimization

    * code cleanup, optimization

    * fix double-processing window

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * [KeyboardManager]Fix mapping shift to numpad (#35890)

    * Keyboard Manger fix numpad as shift

    Fixed shift not being released if a numpad key as shift.

    * Added comments

    * Fix typo

    * Fix the numpad unlocked key not working if the locked version is overridden by shift

    * Fix spelling check.

    * Revert the VK_CLEAR change.

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [Analyzers] Update .editorconfig with rules to relax IDE errors (#36095)

    * [Analyzers] Remove duplicate pascal case style from .editorconfig

    * [Analyzers] Configured severity for individual IDE and CA rules showing as errors in VS

    Set severity for IDE0005, IDE0008, IDE0016, IDE0018, IDE0019, IDE0021, IDE0022, IDE0023, IDE0025, IDE0027, IDE0028, IDE0029, IDE0031, IDE0032, IDE0034, IDE0036, IDE0039, IDE0042, IDE0044, IDE0045, IDE0046, IDE0047, IDE0057, IDE0051, IDE0052, IDE0054, IDE0055, IDE0056, IDE0057, IDE0059, IDE0060, IDE0061, IDE0063, IDE0071, IDE0073, IDE0074, IDE0075, IDE0077, IDE0078, IDE0083, IDE0090, IDE0100, IDE0130, IDE160, IDE180, IDE0200, IDE0240, IDE0250, IDE0251, IDE0260, IDE0270, IDE0290, IDE0300, IDE0301, IDE0305, IDE1005, IDE1006, CA1859, CA2022, CA2263

    * [Analyzers] Fix mismatched analyzer descriptions

    * [Analyzers] Fix misspelling

    * Update .editorconfig

    Made the following style rules `silent` instead of `suggestion`:
    - Use explicit type instead of 'var'
    - Use expression body for ...
    - Use block-scoped namespace

    * [Analyzers] Set IDE0290 to silent

    * [Analyzers] Remove IDE1006 configuration from .editorconfig in favor of making exclusions for the few entries

    * [Analyzers][Indexer] Add IDE1006 suppressions

    * [Analyzers][Peek] Add IDE1006 suppression

    * [Analyzers][MWB] Add IDE1006 suppression.

    * [Analyzers][Plugins] Add IDE1006 suppression

    * [Analyzers][ImageResizer] Suppress IDE0073 to retain original copyright

    * [Analyzers] Remove IDE0073 severity change in .editorconfig

    ---------

    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>

    * [Workspaces] PWA follow-up (#36217)

    * [PTRun][Calculator]Allow scientific notation with lowercase 'e' (#36187)

    * [Workspaces] Add encoder parameter to bitmap.save() (#36228)

    * [Workspaces] Add encoder parameter to bitmap.save()

    * 1 more call fixed

    * Move repeated code to the csharp library

    * [Workspaces] Implement store of app window's size and position (#36086)

    * [Workspaces] Implement store of app window's size and position

    * Modifying the default values to -1. The program will use the original default values for the first run.

    * [ScreenRuler]Add setting to show the measurement in an extra unit (#35887)

    * display ruler: supporting millimeter and other units

    * Measurement Tool: UI Setting for an extra unit

    * Update images

    * spelling

    * spelling

    * suit code style

    * Fix for code review

    * remove weird file

    * rename field

    * [Deps]Update MSTest from 3.5.0 to 3.6.3 (#36115)

    * Update MSTest from 3.5.0 to 3.6.3

    * Use STA attributes that are now part of MSTest

    * Adding Jerry to community.md (#36232)

    Update COMMUNITY.md

    * [Workspaces] Arranger: smart timer (#36096)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] Arranger: Reset wait timer after each successful arrange action

    * fix merge error

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Upgrade to check-spelling v0.0.24 (#36235)

    This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24).

    A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur.

    There's a new accessibility forbidden pattern:

    > Do not use `(click) here` links
    > For more information, see:
    > * https://www.w3.org/QA/Tips/noClickHere
    > * https://webaim.org/techniques/hypertext/link_text
    > * https://granicus.com/blog/why-click-here-links-are-bad/
    > * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
    ```pl
    (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\()
    ```

    There are some minor bugs that I'm aware of and which I've fixed since this release, but I don't expect to make another release this month.

    I've added a pair of patterns for includes and pragmas. My argument is that the **compiler** will _generally_ tell you if you've misspelled an include and the **linker** will _generally_ tell you if you misspell a lib.

    - There's a caveat here: If your include case-insensitively matches the referenced file (but doesn't properly match it), then unless you either use a case-sensitive file system (as opposed to case-preserving) or beg clang to warn, you won't notice when you make this specific mistake -- this matters in that a couple of Windows headers (e.g. Unknwn.h) have particular case and repositories don't tend to consistently/properly write them.

    * Adjust to community.md, shifting jerry's github user name (#36242)

    Update COMMUNITY.md

    * [AOT compatible] Resolve AOT Build Error in Peek.UI (#36194)

    * add partial for aot support

    * add Microsoft.NET.ILLink.Tasks to packages.props

    * format

    * Revert "format"

    This reverts commit 742d5e2214.

    * add Microsoft.NET.ILLink.Tasks to notice.md

    * add auto reference

    * update script to remove the 'Auto-reference line'

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Awake Updates - `TILLSON_11272024` (#36049)

    * Update with bug fixes for tray icon and support for parent process

    * Process information enum

    * Update the docs

    * Fix spelling

    * Make sure that PID is used in PT config flow

    * Logic for checks based on #34148

    * Update with link to PR

    * Fixes #34717

    * Small cleanup

    * Proper task segmentation in a function

    * Cleanup the code

    * Fix synchronization context issue

    * Update planning doc

    * Test disabling caching to see if that manages to pass CI

    * Cleanup to make sure that we're logging things properly.

    * Update ci.yml

    * Disable cache to pass CI

    * Retry logic

    * Cleanup

    * Code cleanup

    * Fixes #35848

    * Update notes and codename

    * After third attempt, log error instead of throwing exception

    * More cleanup to avoid double execution

    * Add expected word

    * Safeguards for bad values for timed keep-awake

    * More updates to make sure I am using uint

    * Update error message

    * Update packages

    * Fix notice and revert CsWinRT upgrade

    * Codename update

    * Update expect.txt

    * Update the struct

    * Ensuring we're properly awaiting tray initialization

    * Update to make sure tray reflects the bound process

    * Cleanup, proper JSON serialization for logs.

    * Not needed.

    * Add command validation logic

    * Moving the initialization logic earlier

    * Make sure we show the display state in the tooltip

    * Update tray string

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update logic for icon resets

    * Update doc

    * Simplify function for setting mode shell icon

    * Issues should be properly linked

    * Minor cleanup

    * Update timed behavior

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Workspaces] detecting right app version (#36100)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] fix detection of specific version of apps

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Move the XamlStyler config to src/ (#36202)

    my never ending goal to minimize files in the root dir

    * [AdvancedPaste]Add Semantic Kernel opt-in to allow chaining of paste actions (#35902)

    * [AdvancedPaste] Semantic Kernel support

    * Changed log-line with potentially sensitive info

    * Spellcheck issues

    * Various improvements for Semantic Kernel

    * Spellcheck issue

    * Refactored Clipboard routines

    * Added integration tests for KernelService

    * Extra telemetry for AdvancedPaste

    * Added 'Hotkey' suffix to AdvancedPaste_Settings telemetry event

    * Added IsSavedQuery

    * Added KernelQueryCache

    * Refactoring

    * Added KernelQueryCache to BugReportTool delete list

    * Added opt-n for Semantic Kernel

    * Fixed bug with KernelQueryCache

    * Ability to view last AI chat message on error

    * Improved kernel query cache

    * Used System.IO.Abstractions and improved tests

    * Fixed under-count of token usage

    * Used Semantic Kernel icon

    * Cleanup

    * Add missing EndProject line

    * Fix dependency version conflicts

    * Fix NOTICE.md

    * Correct place of SemanticKernel in NOTICE.md

    * Unlinked CustomPreview toggle from AI

    * Added Microsoft.Bcl.AsyncInterfaces dependency to AdvancedPaste

    * Fixed NOTICE.md order

    * Moved Custom Preview to behaviour section

    * Made Image to Text raise error on empty output

    * Added AIServiceBatchIntegrationTests

    * Updated AIServiceBatchIntegrationTests

    * Added prompt moderation

    * Moved GPO Infobar to better location

    * [Launcher]Port from WPF-UI to .NET 9 WPF (#36215)

    * Initial implementation

    * Fix fluent style

    * Fix no endline

    * Update expect.txt

    * Fix formatting

    * Fix light theme looking bad on Windows 10

    * fix formatting

    * test change

    * Now really fixed W10

    * Add a comment

    * Fix typos

    * Fix spellcheck errors

    * Fix spellcheck pattern for websites

    * Change patterns for spellcheck in the right file

    * Fix XAML styling

    * Fix contrast colors on W11

    * Fix formatting

    * Removed emty line

    * Fix formatting

    * Added comment to fluentHC file

    * fix comment

    * Fix Windows10 again.
    Adress feedback.

    * W11 fix chaning from high contrast to normal not having correct background

    * W10 Fix high contrast not working after switching from light/dark moed

    * Address feedback

    * Fix formatting

    * Second W11 fix chaning from high contrast to normal not having correct background

    * [UX]Updating New+ and Settings icons (#36290)

    * Updated icons

    * Updating more icons and icos

    * [Settings][Dashboard] Accessibility fixes (#36280)

    * make narrator announce buttons/toggles

    * add toggles module name

    * [ci]Sign OpenAI dll that's not signed (#36299)

    * Update CODEOWNERS to include gordon, jerry and kayla (#36308)

    * Update CODEOWNERS

    * Update names.txt

    * Making the powertoys-code-owners team code owners (#36310)

    * Update CODEOWNERS

    * Update names.txt

    * Update CODEOWNERS

    * [FZEditor]Fix Create new layout dialog radio buttons IsChecked values  (#36320)

    * 0.87 changelog (#36335)

    * 0.87 changelog

    * Fix spellcheck

    * Update README.md

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [PTRun]Fix WPF transparent border issue on Windows 10 (#36392)

    * Added border on W10

    * Added a comment

    ---------
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>

    * [PTRun]Fix .NET 9 crash in OneNote (#36417)

    * Fix crash in OneNote Run

    * added better comment

    * [AdvancedPaste]Fix NullReferenceException on Dispose (#36428)

    [AdvancedPaste] Fixed NullReferenceException on Dispose

    * [Fuzz] Add fuzz testing for AdvancedPaste and new pipeline for onboarding OneFuzz (#36329)

    * add fuzz

    * install .net8

    * add spelling check

    * refine the pipeline

    * add readme and update the test code

    * fix spelling error

    * change to weekly run

    * Add New CI Pipeline for Latest WindowsAppSDK (#36282)

    This PR introduces the following changes to the CI pipeline and version management:

    Pipeline Enhancements:
    1. Added a new script UpdateVersions.ps1 to automate the update of Microsoft.WindowsAppSDK versions across various project files.
    2. Introduced a new pipeline configuration ci-using-the-latest-winappsdk.yml to build using the latest Microsoft.WindowsAppSDK.
    3. Updated existing pipeline configurations to support the new useLatestWinAppSDK parameter.

    Pipeline Configuration Updates:
    1. Updated job-build-project.yml to handle the useLatestWinAppSDK parameter and adjust the RestoreAdditionalProjectSourcesArg accordingly.
    2. Added a new template steps-update-winappsdk-and-restore-nuget.yml for updating and restoring NuGet packages with the latest Microsoft.WindowsAppSDK.
    3. Added WinAPPSDK version selection, the pipeline can be manually triggered to use the specified version.

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [AOT compatible] Make HostsUILib become AOT compatible (#36136)

    * Remove AOT configuration

    * Refer to AOT compatibility props

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [AOT compatible] Clean up some AOT build issue in FilePreviewCommon and MarkdownPreviewHandler (#36207)

    * Use AppContext.BaseDirectory to replace assembly.GetExeAseembly.Location.
    Fix json serilizer aot issue.

    * clean up some AOT build issue

    * Update src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandlerControl.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Update src/common/FilePreviewCommon/Formatters/JsonFormatter.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Add new pipeline using the latest webview2 from Edge Canary (#36317)

    * using the latest webview2 for testing

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Bug fix] Making the OpenAI key configuration page scrollable. (#36359)

    * Fixed #34470

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>

    * [Bug fix] Add a format validation step before format conversion. (#36404)

    This PR aims to fix the bug #35225 by introducing a new method IsJson to determine if a given text is in JSON format.
    The IsJson method is then utilized in the ToJsonFromXmlOrCsvAsync method to optimize the processing logic.
    If the text is already in JSON format, it is returned directly without further conversion from XML or CSV.

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * Add more STCA team members (#36438)

    * Add more STCA team members

    * Include more spelling check errors

    * Remove non-alpha in dictionary

    * Add Zhaopeng Wang

    * Fix spell checking error

    * Remove "prerelease: true" (#36484)

    * Remove "prerelease: true"

    The Microsoft.WinGet.DSC module is GA so prerelease: true is no longer needed.

    * Update expect.txt

    fixing spellcheck warning

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Docs]Update README for 0.87.1 release (#36534)

    * [CI] Enhance build Pipeline Reliability with Retry Logic and Improved Error Messaging (#36529)

    * update pipeline with retry

    * remove tests

    * Add team member (#36590)

    * [New+]Don't override New actions from Explorer on Windows 10 (#36467)

    * [New+]Don't override New actions from Explorer

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Add pattern for learn.microsoft links

    * Also only Query for context menu

    * [PTRun][Calculator]Handle hexadecimal numbers to not return divide by 0 error (#36390)

    * add '0x' handling for divide by 0 scenarios

    * fix comment on division by 0 check

    ---------

    Co-authored-by: Connor Plante <connor.plante@gmail.com>

    * [TextExtractor]Minor UI/Accessibility fixes in the overlay UI (#36356)

    minor UI and accessibility fixes

    * [PTRun][Calculator]Update mages to v3.0.0 and support for `randi(n)` (#36560)

    * update to mages 3.0.0

    * allow randi() in calculator plugin

    * fix tests and input validation

    * fix spell check

    * [QuickAccent]Added ć for Slovenian (#36336) (#36338)

    * Fix snapping Workspaces Editor to Fancy Zones (#36463)

    * Remove Workspaces Editor from Fancy Zone's excluded app list

    * removed unused string

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>

    * [PTRun]Fix drag on .NET 9 WPF (#36635)

    * [CQ]Continued to move stuff out of root - Solution.props (#36244)

    * [QuickAccent]Add Proto-Indo-European (#36408)

    * Add ḱ to PowerAccent for Proto-Indo-European

    * Fix Spelling Check

    * Add more letters to PIE

    * Order PIE after PI

    ---------

    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [PTRun]Add context buttons for VSCodeWorkspaces plugin (#36517)

    * [Settings][QuickAccent]Change 'character set' to plural form (#36565)

    * [PTRun][Calculator]Fix unit tests on non-english systems (#36569)

    * fix tests

    * update comment

    * [PTRun][Calc]Improve handling of non-base 10 numbers (#36700)

    * [Settings][PTRun]Show plugin version and website (#36580)

    * [Monaco]Add support for .resx and .resw preview support. (#36499)

    Added support for .resx and .resw preview support. These files are XML based files so I added the file extensions as part of the registerAdditionalLanguage("xmlExt"...) function.

    * [Settings] Add Workspaces' workspaces.json file to backup/restore list (#36714)

    * [Localization] Fix loc pipeline to send downloaded localized files to TDBuild upon retry after failure (#36766)

    * [AdvancedPaste]Fixed issues with Screen Reader integration (#36778)

    * Remove Advent calendar from README (#36777)

    * Remove Advent calendar from README

    * Update hero image

    * Delete doc/images/overview/PT_holiday_hero_image.png

    * [AdvancedPaste]Add all BitmapDecoder supported image filetypes to ImageToText (#35600)

    Adds support to ImageToText for all image filetypes supported by BitmapDecoder.

    * [AOT]Clean up some AOT build issues in PowerAccent.Core (#36264)

    * init

    * Use AotCompatibility instead

    * Replace typeof(Lanaguge) with GetValues<Language>

    * Create new folder to place source generation context file.

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [WinUI3]Fix Windows 10 title bar borders (#36429)

    * Fix borders for windows in the Settings UI

    * Fix HOSTS window

    * Fix Advanced Paste

    * Fix Environment Variables

    * Fix File Locksmith

    * Fix Peek, with a caveat

    * Fix Registry Preview

    * Remove unused imports

    * Clean up imports in OobeShellPage

    * Move OSVersionHelper from Common.UI up into ManagedCommon

    * [QuickAccent]Fix unstable language loading (#36721)

    * [Peek]Bring into foreground if previously minimized (#36506)

    Added Activate() to bring Peek.UI window into focus upon Toggle. This allows the UI to be presented even if it was previously minimized.

    * Update Run docs README (#36857)

    * Update Run docs README

    * Remove System dupe

    * [Monaco]Make minimap toggleable (#33742)

    * [Monaco]Fix Json format preview setting (#36867)

    * [KBM]Added option for exact match shortcut (#36000)

    * Added option for exact match shortcut

    * Fix spell-check

    * [Deps][Security]Update .NET Packages from 9.0.0 to 9.0.1  (#36879)

    * [Deps] Update NuGet packages to version 9.0.1

    Updated several NuGet packages from version 9.0.0 to 9.0.1, including:
    - Microsoft.Data.Sqlite
    - Microsoft.Bcl.AsyncInterfaces
    - Microsoft.Extensions.DependencyInjection
    - Microsoft.Extensions.Logging
    - Microsoft.Extensions.Logging.Abstractions
    - Microsoft.Extensions.Hosting
    - Microsoft.Extensions.Hosting.WindowsServices
    - Microsoft.Win32.SystemEvents
    - Microsoft.Windows.Compatibility
    - System.CodeDom
    - System.ComponentModel.Composition
    - System.Configuration.ConfigurationManager
    - System.Data.OleDb
    - System.Diagnostics.EventLog
    - System.Diagnostics.PerformanceCounter
    - System.Drawing.Common
    - System.Management
    - System.Runtime.Caching
    - System.ServiceProcess.ServiceController
    - System.Text.Encoding.CodePages
    - System.Text.Json

    * [Deps] Update NOTICE.md

    * [Peek]Fix using the correct Monaco assets at runtime (#36890)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area (#36769)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area

    * Update src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    ---------

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    * [Workspaces] Saving app properties on launch and recapture (#36751)

    * [Workspaces] Implementing set and get GUID to/from HWND to distinguish windows moved by the Workspaces tool

    * After launch and capture copy the CLI args from the "original" project

    * Fix getting GUID

    * spell check

    * modification to be able to handle different data sizes on different systems

    * code optimisation

    * Replacing string parameter by InvokePoint

    * renaming variable

    * [AdvancedPaste]Use background thread for interactions between runner and Advanced Paste (#36858)

    * [Advanced Paste] Use background thread for runner-Advanced Paste interaction

    * Fixed typo

    * [VCM]Deprecate the Video Conference Mute utility (#36772)

    * Remove all VideoConferenceMute related code and files

    * Clean up vcm driver registry keys

    * Also remove the Webcam report tool

    * Also clean out video conference on the installer

    * Fix spellcheck

    * Remove comment about video conf

    * Update gpo files revision

    * Revert removing the VCM policies

    * Deprecate VCM GPO policy

    * Change deprecation message to show first supported version

    * Tweak supported strings in the adml

    * Goodbye friends, you are forever part of the team (#36905)

    * Goodbye friends

    Forever part of the team 😢

    * Update COMMUNITY.md

    * Fix formatting issues in COMMUNITY.md

    * [New utility]Sysinternals ZoomIt (#35880)

    * ZoomIt initial code dump

    * Change vcxproj to normalize dependency versions

    * Fix code quality to build

    * Add to PowerToys solution

    * Clean out C-style casts

    * Fix some more analyzer errors

    * Constexpr a function

    * Disable some warnings locally that it seemed better not to touch

    * Add ZoomIt module interface

    * Add GPO

    * Add Settings page with Enable button

    * Output as PowerToys.ZoomIt.exe

    * Extract ZoomIt Settings definition to its own header

    * Make ZoomItModuleInterface build with ZoomItSettings too

    * WinRT C++ interop for ZoomItSettings

    * From Registry To PowerToys Json

    * Properly fix const_cast analyzer error

    * Initial Settings page loading from registry

    * Zoom mode settings

    * Save settings

    * Add file picker and DemoType file support

    * Remaining DemoType settings

    * Have ZoomIt properly reloading Settings and exiting

    * Remove context menu entries for Options and Exit

    * ZoomIt simple Break Options

    * Break advanced options

    * Simple Record settings

    * Record Microphone setting

    * Fix break background file picker title

    * Font setting

    * Fix build issues after merge

    * Add ZoomIt conflict warning to Settings

    * Exclude Eula from spell checking

    * Fix spellcheck errors

    * Fix spell check for accelerated menu items

    * Remove cursor files from spellcheck. They're binary

    * Fix forbidden patterns

    * Fix XAML style

    * Fix C# analyzers

    * Fix signing

    * Also sign module interface dll

    * Use actual ZoomIt icon

    * Add OOBE page for ZoomIt

    * ZoomIt image for Settings

    * Flyout and Dashboard entries

    * Fix type speed slider labels

    * Correctly load default Font

    * Correctly register shortcuts on ZoomIt startup first run

    * Fix modifier keys not changing until restart

    * Show MsgBox on taken shortcut

    * Start PowerToys Settings

    * Normalize ZoomIt file properties with rest of PowerToys

    * Add attribution

    * Add ZoomIt team to Community.md

    * More copyright adjustments

    * Fix spellcheck

    * Fix MsgBox simultaneous instance to the front

    * Add mention of capturevideosample code use

    * Add ZoomIt to process lists

    * Add telemetry

    * Add logging

    * React to gpo

    * Normalize code to space identation

    * Fix installer build

    * Localize percent setting

    * Fix XAML styling

    * Update src/settings-ui/Settings.UI/Strings/en-us/Resources.resw

    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * Fix spellcheck

    * One more spellcheck fix

    * Integrate LiveDraw feature changes from upstream

    * Fix name reuse in same scope

    * Fix c-style casts

    * Also register LIVEDRAW_HOTKEY

    * Fix newLiveZoomToggleKey

    * Update LiveZoom description in Settings to take LiveDraw into account

    * Fix spellcheck

    * Fix more spellcheck

    * Fix Sysinternals capitalization

    * Fix ARM64 Debug build

    * Support Sysinternals build (#36873)

    * Remove unneeded files

    * Make build compatible with Sysinternals

    * Separate PowerToys ZoomIt product name (#36887)

    * Separate PowerToys ZoomIt product name

    To help maintain the Sysinternals branding in the standalone version.

    * Clarify branding-related includes

    * Remove ZoomIt.sln

    * Add foxmsft to spell-check names

    * Add ZoomIt to README

    * Add ZoomIt to GH templates

    * Add ZoomIt events to DATA_AND_PRIVACY.md

    * Remove publish_config.json

    * Remove publish_config.json from vcxproj too

    ---------

    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * [PTRun]Add hotkey to the show telemetry event (#36869)

    * [PTRun]Update the code for .NET 9.0.1 - remove workarounds (#36909)

    * Revove some unneeded changes after pdating to .net9.1

    * [RegistryPreview]Copy context menu, data tooltip, MULTI_SZ fix (#36631)

    * add context menus

    * string resources for contextmenu

    * fix line break parsing for MULTI_SZ

    * better presentation of multiline values and value tooltip

    * cleanup

    * [MWB] - refactoring "Common" classes - Common.Log.cs, Common.Receiver.cs (#35726)

    * [PTRun]Add setting for different trigonometric units in Calculator (#36717)

    * Added angle units to PowerToys Run Calculator plugin.

    * Update Resources.resx

    * Added GitHub SpellCheck rule for 'gradians'.

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [ci]Remove steps to build abstracted utilities packages (#36934)

    * [Settings]Update GPO infobar icon, improve some pages and fix bugs (#33703)

    * changes part 1

    * fix xaml code

    * changes part 2

    * fix cmdNotFound page

    * Update PowerOcrPage

    * More Pages changed

    * More Pages changed

    * revert temporary change

    * fix spelling

    * add resw comment

    * add resw comment

    * Update MouseWihtoutBorderPage.xaml

    * PowerPreview page

    * workspaces page

    * fix awake page gpo handling

    * NewPlus page

    * update new+ page!

    * AdvancedPaste.xaml: Move Info bar.

    * Update MouseJumpPanel.xaml

    * Update GeneralPage.xaml

    * fix position of info bar and some ui quirks

    * fix xaml style

    * fix string resources

    * string changes

    * prepare megre main

    * update new+ page

    * zoomit page

    * various fixes

    * [Common]NotificationUtil helper class with FileWatcher (#36720)

    * add NotificationUtil helper with file watcher and cache

    * fix spellcheck

    * indentation

    * [PTRun][Docs]Add YubicoOauthOTP to Third-Party plugins (#36761)

    * [PTRun]Fixed typo in Value Generator messages (#36951)

    * [AOT] Clean up some AOT issues in Advanced Paste module (#36297)

    * Clean up the aot build issue.

    * Merge main and clean up new AOT build issue

    * Update LogEvent define.

    * Update src/modules/AdvancedPaste/AdvancedPaste/Helpers/LogEvent.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * update typo bug

    * Remove unused allow list item

    * Create a new folder to place source generation context

    * Merge main and rename LogEvent to AIServiceFormatEvent

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * [ZoomIt]React to gpo setting when run as standalone (#36975)

    * [Settings]ImageResizer settings accessibility updates, fixes and refactor (#36903)

    * Fix issue with missing Image Resizer unit and fit information in settings description.

    * Fix accessibility issues on Edit and Remove buttons. Fix various issues and refactor view model and ImageSize. New resources for accessibility text formats.

    * Fix unit test because of change to new preset width and height. Fix 2 unit tests having incorrect expected/actual orderings.

    * Post-review update: accessibility strings now formatted within the converter, instead of via format strings; simplified encoder GUID collection declaration and retrieval.

    * Minor example text fix.

    * [Settings]Update "Back up" mentions when it should be used as a verb (#36965)

    * Update Back up name

    * Rename Backup to Back up

    * [New+]Update last modified date to now for all templates created (#36133)

    * Update last modified date to now for all templates created

    * Now also set last update for directories. Thank you htcfreek!

    * [ImageResizer][ci]Fix XAML style errors (#37009)

    * [Settings] Add "new" labels to navigation for new utilities (#36939)

    * initial implementation

    * move new label to zoomit

    * cleanup

    * more cleanup

    * fix XAML formatting

    * update padding to 4px

    * add badge to dashboard item

    * fix XAML formatting

    * Tweaking UX

    ---------

    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [MWB]Fix helper process termination issue in service mode (#36892)

    * [MWB] Changed to suppress the flow of the execution context

    * Fix build after merge

    * [MWB] Fix helper process termination issue in service mode

    * Add some comments

    * [runner]Fix crashes caused by wrong setting AllowDataDiagnostics registry value (#37015)

    * Fix setting registry value

    * Prevent future similar crashes

    * [PTRun][Calculator]Error check when loading trigonometry mode (#37033)

    * [ZoomIt]Fix transparent draw after changing another setting (#37042)

    * [Settings]Fix ZoomIt page changing current directory (#37052)

    * [ci]Remove vc tools version workaround (#37098)

    * 0.88 changelog (#37056)

    * 0.88 changelog

    * Update README.md

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * Add installer hashes

    * Fix aka.ms link for ZoomIt

    * Add mention to the PTRun plugin's dll file version

    * Update README.md

    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>

    * Update README.md - update What's Planned to 0.89 (#37157)

    Update README.md

    Just a tiny update, as reference to 0.88 was missed.

    * [ci]Proper workaround for the vc tools version check (#37130)

    * Revert "[ci]Remove vc tools version workaround (#37098)"

    This reverts commit 2c069ce708.

    * Adopt the same workaround as in Terminal

    * build: add a couple more signing variables to ESRP (#37328)

    This is in support of some identity changes we need to make.

    * [Docs] Update runner-ipc.md to fix broken links (#36994)

    Update runner-ipc.md

    Fix broken file links.

    * [ContextMenu]Update win11 msix menus if wrong version is detected (#37289)

    * [ContextMenus]Update win11 msix menus if wrong version

    * Remove extra line in code

    * [Build]Compatibility with VS17.3 and later, for C++23 <expected>(#37321)

    [Build] compatibility with VS17.3 and later, for C++23 <expected> has been introduced in VS17.3.6, and std::expected has conflict/inconsistent with the makeshift (expected-lite)

    * [Deps]Update .NET Packages from 9.0.1 to 9.0.2 (#37400)

    * [Deps] Update NuGet package versions to 9.0.2

    * [CI] Update NOTICE.md

    * Ignore 0.0.0.0 versions as well for PowerToys files

    * Verify we're not shipping any 0.0.0.0 files

    * Add MSFT file that's expected as 0.0.0.0

    * Fix spellcheck

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [ci]Fix OutOfMemory in download by separating test-only artifacts and filtering unused files before publishing (#37403)

    * chunk download

    * change pipeline

    * update pipeline

    * filter

    * for testing

    * use Variable

    * rebase file

    * add new line

    * rebase the pipeline

    * [GPO][MWB]Add policy to disable service mode (#37366)

    * [MWB]Add policy to disable service mode

    * Add restart note

    * Tweak settings to disable setting

    * Tweak infobars

    * Policy should be machine only

    * [GPO]Add policy to define the run at startup setting (#37385)

    * [GPO]Add policy to define the run at startup setting

    * Use message for single setting managed by policy instead

    * [Zoomit]Fix warning C4706 and related error C2220 (#37283)

    * [KeyboardManager WinUI3] Create WinUI3 project and wrapper for Keyboard Manager Editor (#37427)

    * Set up KBM WinUI3 Editor UI project

    * Test invoking the KBM library via wrapper for WinUI3 C# UI

    * Set up Editor Library Wrapper and enable logging

    * fix spelling

    * update spacing and remove unused file

    * fix formatting

    * update sln

    * update wrapper project config

    * import common props

    * update UI reference

    * gate the new editor with the experimentation toggle in settings

    * [Workspaces] Fix case: monitor not present at launch (#37005)

    * [Workspaces] Fix case: monitor not present at launch

    * Fix DPI multiplicator calculation when monitor not present

    * [PowerRename] Fix negative enumerate start parameter parse bug.   (#37375)

    Fix reg bug to make PowerRename accept negative number as start parameter

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * Use system default web browser when opening links through Monaco in RegistryPreview (#37466)

    * Handled NewWindowRequested WebView2 event, to allow links opened through Registry Preview to open in the system default web browser, rather than a new WebView2 window.

    * Modified RegistryPreview implementatiion to use the open URI dialog that is currently used in Peek.

    * [QuickAccent]Add more letters with caron to IPA (#37369)

    Co-authored-by: Stefan Markovic <stefan@janeasystems.com>

    * [QuickAccent]Added ` (backtick) and ~ (tilde) to VK_OEM_5 (#20333) (#37286)

    * [MouseHighlighter]Fix stray highlights stucking (#37309)

    * [MouseHighlighter]Fix stray highlights stucking

    * Fix spellcheck

    ---------

    Co-authored-by: Stefan Markovic <stefan@janeasystems.com>

    * [Settings] Fixed missing accessibility name of secondary links panel (#37014)

    Co-authored-by: Stefan Markovic <stefan@janeasystems.com>

    * [CI] fix: Use Azure CLI for artifact download to prevent OutOfMemory issues (#37455)

    * for testing az

    * change file

    * update test

    * install python

    * update

    * test

    * use powershell

    * tes

    * update enve

    * update

    * test

    * add

    * test

    * merge

    * az

    * change

    * update

    * test cli

    * add debug

    * test large

    * fix

    * use templete

    * fix x64 python install

    * for testing

    * add

    * fix

    * use 3.11.1

    * change for test

    * revert some testing file

    * update the file name for spelling check

    * use azure cli zip

    * use aka.ms

    * rename the zip file

    * Update runner documentation to reflect newest code structure

    * [Image Resizer] Added AutomationProperties.HelpText to dimensions combo-box (#37122)

    Co-authored-by: Stefan Markovic <stefan@janeasystems.com>

    * [Fuzz] Add fuzz testing for Hosts (#37516)

    * add hostsfile fuzztests templates code

    * modify  typos of hostsfile

    * add hosts file

    * add hosts fuzz to pipeline

    * modify varify depjson rule

    * fuzz validIPv4

    * update  .net7 to .net 8

    * add valid6/validhosts tests on hosts

    * catch all exception

    * update onefuzzconfig.json to add 3 test cases

    * add fuzz writeasync tests and fill exception

    * add writeasync onefuzz config

    * add dll of writeasync in job dependencies

    * for testing az

    * change file

    * use mock filesystem in hosts tests projct

    * fix spell erro

    * fix spell erro and change notations

    * update test

    * fix space erro in code

    * install python

    * update

    * test

    * use powershell

    * remove unused dll in oneconfig.json

    * change download artifacts

    * update

    * test

    * add

    * test

    * merge

    * az

    * change

    * update

    * test cli

    * add debug

    * test large

    * fix

    * use templete

    * remove pdb file filter in job test project

    * fix x64 python install

    * for testing

    * add

    * fix

    * use 3.11.1

    * change for test

    * revert some testing file

    * update the file name for spelling check

    * use azure cli zip

    * use aka.ms

    * rename the zip file

    * remove test artifactname

    * add exception and job dependencies

    * Remove the limitation of fuzzing only on hosts

    * add fuzz readme

    * remove unused changes and space

    * fix x86 in sln and remove newtonsoft.json.dll in oneconfig.json

    * readd wrapper.dll in oneconfig.json

    * drop randomsplit when fuzz writeasync and remove unuseful package

    ---------

    * UITestAutomation Framework (#37461)

    * Add UITestAutomation framework

    * add code comments

    * Optimized code format

    * Optimized code format

    * Update commons and add keyboard manager ui test project

    * Optimized code format

    * test scope and fix fancyzone exe path

    * Add readme

    * Optimize helper functions and UI test method

    * Fix spelling errors and restore module UI tests

    * Restore Indent

    * Update NOTICE.md

    * Update comments to Session and Elements

    * Update comments for Button and Window

    * delete unnecessary code

    * change FindElementByName to FindElmenet

    * Update comments for ModuleConfigData

    * Update readme and comments

    * Remove extra comments

    * change public property

    * Optimize code readability

    * add default Attach Function

    * change attach function name

    * Update comments to XML format

    * Hide by internal functions

    * Update readme

    * Refine the framework

    * Fix process start position and update readme

    * Remove Enum PowerToysModuleWindow

    * Update attach comments

    * Update ModuleConfigData comments

    ---------

    Co-authored-by: Zhaopeng Wang (from Dev Box) <zhaopengwang@microsoft.com>
    Co-authored-by: Xiaofeng Wang (from Dev Box) <xiaofengwang@microsoft.com>
    Co-authored-by: urnotdfs <709586527@qq.com>

    * [Fancy Zones] Fixed accessibility text of monitors on Layout Editor (#36997)

    Co-authored-by: Stefan Markovic <stefan@janeasystems.com>

    * [Run] Fix dark mode detection code, plus refactor (#37324)

    * Fix risky int cast in dark mode detection.

    * Refactored Helper and Manager classes. New unit tests and changes to support Registry access mocking.

    * Spelling update.

    * Improve documentation for the registry-related classes.

    * Fix issue with UpdateTheme raised in review. Enhance documentation. Rewrite tests to use parameterised unit tests, and expand to cover more cases.

    * [MWB] Fix file transfer not working in service mode (#37542)

    * [MWB] Fix file transfer not working in service mode

    * Spellcheck issues

    * Remove "new" label from ZoomIt (#37417)

    remove new from zoomit

    * [PTRun][Calc]Add list separator handling for different cultures (#36735)

    * Ready for Review - [Mouse Without Borders] - refactoring "Common" classes (Part 3) - #35155 (#36950)

    * [MWB] - refactoring MachineInf from Common.MachineStuff.cs into MachineInf.cs - #35155

    * [MWB] - fixing references to MachineInf - #35155

    * [MWB] - cleaning up MachineInf.cs - #35155

    * [MWB] - moving MyRectangle from Common.MachineStuff.cs into MyRectangle.cs - #35155

    * [MWB] - cleaning up MyRectangle.cs - #35155

    * [MWB] - moving Common.MachineStuff.cs to MachineStuff.cs - #35155

    * [MWB] - fixing references to MachineStuff - #35155

    * [MWB] - cleaning up MachineStuff.cs - #35155

    * [MWB] - cleaning up MachineStuff.cs - #35155

    * [MWB] - moving Common.DragDrop.cs to DragDrop.cs - #35155

    * [MWB] - fixing references to DragDrop - #35155

    * [MWB] - fixing unit test - #35155

    * [MWB] - cleaning up DragDrop.cs - #35155

    * [MWB] - cleaning up DragDrop.cs - #35155

    * PowerToys Run Calculator: Add trigonometric angle unit conversion functions (#37475)

    * Added trig unit conversion macros to PowerToys Run Calculator plugin.

    * Added testing for unit conversions.

    * Removed debug messages.

    * [PTRun][Docs] Update new plugin checklist (#36789)

    [Docs] Update new plugin checklist

    * [PowerRename]Add `$`, `^` and quantifiers to RegEx cheatsheet (#37062)

    * [PowerRename]Add `$`, `^` and `.*` to RegEx cheatsheet

    * Add * and +, remove combinations

    * correct spelling

    * Add ? and \s

    * fix spelling once again

    * Update UI-Test Automation Framework (#37597)

    * Improve UITest Automation

    * Improve UITest Automation

    * Exclude all UI-Test projects instead of just fancyZone UITest

    * Exclude all UI-Test projects instead of just fancyZone UITest

    * Fix code-style

    * [Hosts] Add UITest Cases for Hosts Module (#37600)

    * Add UI-Tests for Host Module

    * [Build] Revert "[Hosts] Add UITest Cases for Hosts Module (#37600)" to fix CI issue (#37606)

    Revert "[Hosts] Add UITest Cases for Hosts Module (#37600)"

    This reverts commit c656dcc9c5.

    * [AOT] clean up AOT issue in Settings.UI (#36559)

    * Rename source generation context file

    * fix build issue

    * fix path bug

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [AOT] Clean up AOT build issue  in Common.UI (#36376)

    * init commit

    * Use path.combine

    * Add useWPF and useWindowsForms back

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [ci]Sign and fix KeyboardManagerEditorLibraryWrapper.dll (#37601)

    * [ci]Sign KeyboardManagerEditorLibraryWrapper.dll

    * Fix dll metadata

    * [Settings]Fix ColorPicker dashboard shortcut (#37547)

    * Fix color picker dashboard shortcut

    * remove not needed code

    * Remove comment

    * [ImageResizer] Fix issues with blank Width and Height controls (#37373)

    * Allow custom preset's dimensions to be blank in the UI while still persisted as 0.

    * XAML formatting - reorder namespaces.

    * Add "(auto)" text to zero-value Width/Height in Settings. Ensure Width and Height fields in flyout are formatted to empty when their value is 0.

    * [Workspaces][ARM64] Bring icon to packaged apps (#37625)

    Bring icon to packaged apps

    * [PTRun] Disable CETCompat in Launcher (#37550)

    * Disable CETCompat in Launcher

    * Added comment

    * Improved comment

    * [AOT] Refactor Logger function to improve performance and mark managedCommon as AOT compatible (#36327)

    * Use function to init static value

    * Replace GetFileName with GetFileNameWithoutExtension

    * Add exception catch for GetCallerInfo

    * Remove sourceLineNumber

    * Add kernal to allow list

    * Remove unused commit

    * Add new folder to place source generation context

    * update

    * fix build issue

    * Move line number back

    * Use fileName to replace full path

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [AdvancedPaste]Add paste actions to allow transcoding of media files (#37188)

    * [AdvancedPaste] Additional actions, including Image to text

    * Spellcheck issue

    * [AdvancedPaste] Paste as file and many other improvements

    * Fixed typo

    * Fixed typo

    * [AdvancedPaste] Improved paste window menu layout

    * [AdvancedPaste] Improved settings window layout

    * [AdvancedPaste] Removed AudioToText for the moment

    * Code cleanup

    * Minor fixes

    * [AdvancedPaste] Semantic Kernel support

    * Changed log-line with potentially sensitive info

    * Spellcheck issues

    * Various improvements for Semantic Kernel

    * Spellcheck issue

    * Refactored Clipboard routines

    * Added integration tests for KernelService

    * Extra telemetry for AdvancedPaste

    * Added 'Hotkey' suffix to AdvancedPaste_Settings telemetry event

    * Added IsSavedQuery

    * Added KernelQueryCache

    * Refactoring

    * Added KernelQueryCache to BugReportTool delete list

    * Added opt-n for Semantic Kernel

    * Fixed bug with KernelQueryCache

    * Ability to view last AI chat message on error

    * Improved kernel query cache

    * Used System.IO.Abstractions and improved tests

    * Fixed under-count of token usage

    * Used Semantic Kernel icon

    * Cleanup

    * Add missing EndProject line

    * Fix dependency version conflicts

    * Fix NOTICE.md

    * Correct place of SemanticKernel in NOTICE.md

    * Unlinked CustomPreview toggle from AI

    * Added Microsoft.Bcl.AsyncInterfaces dependency to AdvancedPaste

    * Fixed NOTICE.md order

    * Moved Custom Preview to behaviour section

    * Made Image to Text raise error on empty output

    * Added AIServiceBatchIntegrationTests

    * Updated AIServiceBatchIntegrationTests

    * Added prompt moderation

    * [AdvancedPaste] Media Transcoding support

    * Spellcheck issue

    * Improved transcoding output profile and added tests

    * Moved GPO Infobar to better location

    * Added cancel button and minor bug fixes

    * Fixed crash

    * Minor cleanups

    * Improved transcoding error messages

    * Used software back when transcoding fails with hardware accerlation

    * Added Reencode to spellcheck

    * Spellcheck issue

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Dustin L. Howett <dustin@howett.net>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * [QuickAccent]Add final sigma ( ς ) to the Greek character set (#37611)

    * Revert "[Hosts] Add UITest Cases for Hosts Module" (#37619)

    * Revert "[Hosts] Add UITest Cases for Hosts Module (#37600)"

    This reverts commit c656dcc9c5.

    * Matching all UITest projects and UITestAutomation project

    * Add back Hosts UITests

    ---------

    Co-authored-by: Jerry Xu <nxu@microsoft.com>

    * [Workspaces] Fix regression when capturing minimized apps (#37599)

    * [check-spelling] Update metadata

    Update for https://github.com/zadjii-msft/PowerToys/actions/runs/13549652582/attempts/1
    Accepted in https://github.com/zadjii-msft/PowerToys/pull/462#issuecomment-2685731408

    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>

    * Fix bad merged

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    Co-authored-by: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com>
    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>
    Co-authored-by: Ionuț Manța <ionut@janeasystems.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>
    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>
    Co-authored-by: PesBandi <127593627+PesBandi@users.noreply.github.com>
    Co-authored-by: Wenjian Chern <55335597+Sophanatprime@users.noreply.github.com>
    Co-authored-by: Youssef Victor <youssefvictor00@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
    Co-authored-by: leileizhang <leilzh@microsoft.com>
    Co-authored-by: Den Delimarsky 🔐 <sign@den.dev>
    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>
    Co-authored-by: Shuai Yuan <128874481+shuaiyuanxx@users.noreply.github.com>
    Co-authored-by: moooyo <42196638+moooyo@users.noreply.github.com>
    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jerry Xu <n.xu@outlook.com>
    Co-authored-by: Demitrius Nelon <denelon@microsoft.com>
    Co-authored-by: Kai Tao <69313318+vanzue@users.noreply.github.com>
    Co-authored-by: Connor Plante <150482134+plante-msft@users.noreply.github.com>
    Co-authored-by: Connor Plante <connor.plante@gmail.com>
    Co-authored-by: Domen Soklič <soklicd@gmail.com>
    Co-authored-by: Hao Liu <liuhaobupt@163.com>
    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: immi <iafullprogrammer@gmail.com>
    Co-authored-by: Asif Islam <77113884+asif4318@users.noreply.github.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>
    Co-authored-by: Dave Rayment <dave.rayment@gmail.com>
    Co-authored-by: Neil McAlister <pingzing@users.noreply.github.com>
    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Michael Clayton <mike@kingslandconsulting.co.uk>
    Co-authored-by: Nathan Gill <nathan.j.gill@outlook.com>
    Co-authored-by: Daniel Nilsson <daniel.nilsson1989@gmail.com>
    Co-authored-by: JackStuart <jack@jstuart.io>
    Co-authored-by: Christian Gaarden Gaardmark <cgaarden@hotmail.com>
    Co-authored-by: YDKK <YDKK@users.noreply.github.com>
    Co-authored-by: Dustin L. Howett <duhowett@microsoft.com>
    Co-authored-by: LNKLEO <LinkeyLeo@outlook.com>
    Co-authored-by: Massimiliano Alberti <821344+xanatos@users.noreply.github.com>
    Co-authored-by: Hao Liu <liuhao3418@gmail.com>
    Co-authored-by: chenmy77 <162882040+chenmy77@users.noreply.github.com>
    Co-authored-by: dreamstart <33367956+wang563681252@users.noreply.github.com>
    Co-authored-by: Zhaopeng Wang (from Dev Box) <zhaopengwang@microsoft.com>
    Co-authored-by: Xiaofeng Wang (from Dev Box) <xiaofengwang@microsoft.com>
    Co-authored-by: urnotdfs <709586527@qq.com>
    Co-authored-by: Henrik Lau Eriksson <henrik.lau.eriksson@gmail.com>
    Co-authored-by: Dustin L. Howett <dustin@howett.net>
    Co-authored-by: Smeagol <Thesmeagol360@gmail.com>
    Co-authored-by: Jerry Xu <ninxu@microsoft.com>
    Co-authored-by: Jerry Xu <nxu@microsoft.com>
    Co-authored-by: Stefan Markovic <stefansjfw@users.noreply.github.com>

commit eda7e503d8
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 26 12:31:38 2025 -0600

    Make a viewmodel for ICommand itself (#463)

    Closes #253

    This whole `item.Command.Unsafe.Name` buisiness has been weird for far too long

commit 716d0c2b4b
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 26 10:01:04 2025 -0600

    Add to the SUI a setting to control where the window is summoned (#461)

    Closes #446

    Setting is pretty straightforward. Same as PT Run, with an added "leave it where it is", from the Terminal codebase.

    The `DisplayArea` code is net-new (PT used WPF for that, and Terminal used C++), but it's pretty same-y to everything else.

    Drive-by fixes "holy whitespace batman", by making the SUI less wide.

commit 626d265f3f
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 26 05:25:43 2025 -0600

    Enable editing aliases in the SUI (#460)

    This is a very rough UI element for setting aliases in the UI.

    * the command weighting from #454 was bad. It would always grant a recent command weight. Probably shouldn't do that
    * The tags could soft-crash when opening the SUI? I think that was from the ObservableCollection being created on a COM thread, then "updated" on the main thread.
      * this may be #426 but I'm not sure

    Closes #92 (but it isn't pretty)

commit 5e953dbd94
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 26 05:25:13 2025 -0600

    Officially deprecate FormPage and MarkdownPage (#459)

    `ContentPage` is the more generic form of this.
    I'm deprecating this here in 0.0.8, and in 0.0.9 I'm gonna outright remove it.

commit 7e115735fd
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 26 05:24:53 2025 -0600

    A pair of drive-by bug fixes (#457)

    * Allow trailing commas in terminal `settings.json`
    * in the Clipboard history copy, actually use the toast message

commit c82a8e875f
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Feb 25 05:34:39 2025 -0600

    Implement a basic recently-used-apps algorithm  (#454)

    This is a very basic frecency implementation, to let MRU apps and commands show up higher in search results.

    Adds support for a `state.json` file, to store this state. Implication is the same as Terminal:
    * `settings.json`: These are _your_ settings, take this with you where you go
    * `state.json`: this is state _we_ own. You can take it with you at your peril. **We** control this file.

    This seemed good enough to get "VS" to match to "Visual studio" after just a single launch of VS.

    We can iterate on the weighting in the future.

    Closes #317
    This was also half-tracked in closes #147

commit cc01986b53
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Feb 25 05:34:06 2025 -0600

    Add edit & delete to Bookmarks (#451)

    Re-write the bookmarks extension, to add support for edit and delete commands. This is one of the older extensions in the codebase so it was quite dated. Along the way:

    * Resolved a COM threading issue with `CommandResults` (which I never saw before?)
    * Also a really good idea I just had: `AnonymousCommand`s, so you can just pass a lambda to a CommandItem and that's the whole command. Don't need to define a whole command class just for that.
    * Drive-by:
      * Closes #251
      * Closes #344

commit 4c4d53ec37
Author: Seraphima Zykova <zykovas91@gmail.com>
Date:   Tue Feb 25 12:33:31 2025 +0100

    [Search files] Loading more items fix (#453)

    <!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? -->
    ## Summary of the Pull Request

    A fix for the issue that not all results in file search are shown when scrolling to the bottom.

    * Added a request to load new items when the user scrolls to the bottom
    * Re-request items when facing an error in the file search to ensure we show all results in the list

    <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well -->
    ## Validation Steps Performed

    * Search something that should get more than 20 results (I usually typed a single letter for testing)
    * Scroll down to the bottom and check if new entries are loading.

    Closes #351

commit 23c22331e8
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Feb 21 05:52:15 2025 -0600

    add wyhash as an exception (#445)

    Boy does PT ever have a lot of sanity checking [[good]]

commit 86911adb5e
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 20 17:06:49 2025 -0600

    fix a 'hang' on quit (#444)

    Hey guess what, you need to close all the windows.

    regressed in #442

commit a4719daf71
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 20 16:10:49 2025 -0600

    Add rudimentary support for Toast messages (#442)

    Well, I started by wanting to just close #385. Then I thought, "well, the copy command really needs that toast, doesn't it"

    one thing lead to another, and now

    ![clipboard-history-toast](https://github.com/user-attachments/assets/4d84225c-17bd-4b42-9587-6411888db922)

    Closes #385
    Closes # what I never filed `ShowToast`, from https://github.com/zadjii-msft/PowerToys/pull/395

commit d3b52660e8
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 20 07:03:59 2025 -0600

    Tidy up the clipboard history code (#441)

    Tidying from #437

commit e9a8457111
Author: ironyman <ironyman@users.noreply.github.com>
Date:   Thu Feb 20 04:40:20 2025 -0800

    Add Clipboard History built-in command (#437)

    This is a resurrection of #151.
    This implements support for the windows clipboard history, as a command palette extension.

    ---------

    Co-authored-by: joadoumie <98557455+joadoumie@users.noreply.github.com>
    Co-authored-by: Jordi Adoumie <jordiadoumie@microsoft.com>
    Co-authored-by: Mike Griese <migrie@microsoft.com>
    Co-authored-by: Changyu Li <changyl@microsoft.com>

commit d214c45cb6
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 20 06:27:10 2025 -0600

    Add a setting to revert back to thumbnails (#436)

    This PR adds a setting to revert back to the original exe-based thumbnails. We've set it to use exe's by default, because crashes are no good.

    We can figure this out in post.

commit 7c9fa6fb6e
Author: Niels Laute <niels.laute@live.nl>
Date:   Thu Feb 20 12:41:14 2025 +0100

    CommandBarFlyout restyling (#434)

    - Restyled the ListView to make it look like a MenuFlyout
    - Added support for displaying the optional shortcut

commit 50fcc4c789
Author: Niels Laute <niels.laute@live.nl>
Date:   Thu Feb 20 03:03:42 2025 +0100

    Remove nested ListViewItem (#435)

    In `ListPage`, the listview had a ListViewItem inside of a ListViewItem.

commit 50ee0b7dab
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 19 16:41:55 2025 -0600

    Add the ability to bind a global hotkey to anything (#430)

    Adds support for binding hotkeys to top-level commands.

    For commands that don't have an ID, we'll generate one.

    Also makes `Tags` observable, because they weren't before

    Hugely re-writes how `ShortcutControl` tracks the active hwnd, because it didn't work in 0.0.6

    Closes #93

commit 138039caa4
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 19 13:09:25 2025 -0600

    Fix copy on calc (also, enable observable context menus) (#433)

    I was testing #152 and realized that the Copy command on the calculator page was never working quite right.

    And to make it work, i had to fix #360

    so, closes #360

commit d51c2cc00e
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 19 10:33:00 2025 -0600

    Fix the HostingHwnd for built-in (#432)

    This static `CommandPaletteHost` instance is definitely problematic, and we should fix that.

    But for now, this fixes the issue where all extensions (including builtins) couldn't access the HWND.

    We need this for #151, and it might help resolve what we were seeing in #152

commit 00dd9b6ba2
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 19 10:32:18 2025 -0600

    Disable PATH apps by default, and the WW explorer error (#431)

    No one likes these settings.
    The first one causes like, 1000 apps to be loaded, including everything from system32 (yikes)
    The second, well, it just doesn't matter.

commit e502a126f3
Author: moooyo <42196638+moooyo@users.noreply.github.com>
Date:   Wed Feb 19 23:50:29 2025 +0800

    Migrate TimeDate extension from PowerToys run to CommandPalette (#412)

    ## Summary of the Pull Request
    * Assets: copied from v1 plugin's images folder.
    * Helpers folder: Most of them are ported from V1 plugin. Created settings manager to support settings in this extension.
    * Pages folder: Created settingsPage for setting UI. And timeDateExtensionPage is our main page for this extension.
    * Program.cs and SampleExtension.cs: auto created by new ext ps script.
    * TimeDateExtensionCommandsProvider.cs: Title, description and icon. No any special thing in this file.
    * AliasManager: populate our alias (')')

    Some features that are not ported into V2:
    * Global search support (eg: type now in the mian page search box).

    Next steps:
    * We need to migate the related ut to v2.

    <!-- Please review the items on the PR checklist before submitting-->
    ## PR Checklist

    - [ ] **Closes:** #xxx
    - [ ] **Communication:** I've discussed this with core contributors already. If work hasn't been agreed, this work might be rejected
    - [ ] **Tests:** Added/updated and all pass
    Some manual test result:

    extension item:
    ![image](https://github.com/user-attachments/assets/1539af90-cd8d-411c-af13-806a303d89b9)
    setting:
    ![image](https://github.com/user-attachments/assets/dca6cad0-9a00-44c7-a02a-6e88fc3df705)
    extension main page (with empty query string):
    ![image](https://github.com/user-attachments/assets/fad31ea8-5082-48c3-9ef4-413d2af3213c)
    Invalid input:
    ![image](https://github.com/user-attachments/assets/d541b406-57cf-4f59-a3de-1f01f8d40e7a)
    unix timestamp
    ![image](https://github.com/user-attachments/assets/264624a9-2014-479d-9eb4-fdea4b1cc8cd)
    now:
    ![image](https://github.com/user-attachments/assets/44a037d1-1c08-4e62-a946-7912b5bab843)
    year:
    ![image](https://github.com/user-attachments/assets/9d50fdd5-e75e-44a6-b9fd-1440088421ee)

    - [ ] **Localization:** All end user facing strings can be localized
    - [ ] **Dev docs:** Added/updated
    - [ ] **New binaries:** Added on the required places
       - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries
       - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder
       - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects
       - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
    - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx

    <!-- Provide a more detailed description of the PR, other things fixed or any additional comments/features here -->
    ## Detailed Description of the Pull Request / Additional comments

    <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well -->
    ## Validation Steps Performed

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

commit fb8dfa5184
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 19 09:26:51 2025 -0600

    Attempt to fix the crash on launch (#429)

    It fixes it On My Machine, but not on Clint's unfortunately

commit 826bbd4733
Author: Niels Laute <niels.laute@live.nl>
Date:   Mon Feb 17 20:51:34 2025 +0100

    ContentIcon (#428)

    - Created ContentIcon to host a UIElement
    - Moved converters / template selectors from the root folder to the `Converters` folder.

commit c3f5cce7ce
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Feb 13 18:42:58 2025 -0600

    BUILD fix samples

    oops

commit f91f591e76
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 13 16:30:08 2025 -0600

    Add settings for All Apps (#424)

    Expose a couple of the settings for apps as actual settings in the settings UI

commit cd5a541b3e
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 13 11:43:19 2025 -0600

    Add a command for quickly creating a new extension (#423)

    This adds a new form page for quickly creating a new extension.

    * `ExtensionTemplate/` should be zipped up into `template.zip`.
    * fill in that form, then when you submit the form, we'll unzip the template.
    * You should be able to just open that solution up and just **go**
    * I moved the built-in commands lower in the list. The only visible commands it exposes are "Open CmdPal settings" and "Create new extension" (the others are hidden fallbacks, so it doesn't really matter)
    * To mitigate that the settings command is lower in the list, I added it to the "page title" spot in the command bar (only on the root view).

    Closes #311

commit ef58863fac
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 13 11:43:01 2025 -0600

    Add extension settings to the SUI (#419)

    closes #100
    closes #276

    Converts the Toolkit settings to be a `ICommandSettings`, to make things a bit easier.

    Adds per-extension settings to the SUI. Each page should list off the commands from that extension, the `CommandProvider.Settings`, and a simple "About" block for that package.

    Also makes the settings window _not gigantic_

commit 36f42d971c
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 13 11:32:51 2025 -0600

    Lock both lists at the same time (#422)

    In #416 I tried to lock the lists before we modify them.

    Problem was, on L143 I only locked the `FilteredItems`, when `Items` can change there too.

    One singular lock for both makes the most sense anyways.

commit 38a7f184c3
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Thu Feb 13 18:32:25 2025 +0100

    Port All Apps plugin again (#409)

    MISSING:
     - Support arguments passing
    ~Live app detection (newly installed apps, updates, etc..)~
     ~Localization~
    ~Cleanup~

    Argument passing requires conversion to DynamicListPage and is low priority. Let's merge this first and I'll work on this as a follow up

    Closes #76

commit b04c04b591
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 13 06:18:51 2025 -0600

    BUILD: xaml format (#421)

commit 6b9ea06b02
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Feb 12 20:04:21 2025 -0600

    Fix the winget icon (#420)

    yea, it was that stupid

commit 93cad5d5c4
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 12 20:04:03 2025 -0600

    Developer XAML version of TextToSuggest (#416)

    This is just a very rough prototype of "TextToSuggest", to make it do _something_. I'll link this to #358, but it's not clean enough to close it.

    I just slapped a TextBlock with the suggested text to the right of the input, just so users can see that there is a suggestion and that you can press `right` to accept it.

    The best extension to test this with is the Registry one, but that crashes heavily in `ListHelpers.InPlaceUpdateList`. I think it's for two reasons:
    * a null item in the list? (we should ignore that!)
    * and we're modifying the list as we're updating it (definitely shouldn't do that)

    I'm guessing the second is actually the cause of #324, though I've had a hard time reproing that as of late.

commit 7f6c25b737
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Thu Feb 13 03:03:40 2025 +0100

    Merge PT #12 (#417)

    * [Workspaces] implement the move feature (#35480)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * fix Move attribute after launch and snapshot

    * Extend WindowArranger with PWA functionality to detect different PWA apps. PwaHelper moved to the common library

    * fix repeat counter in the editor

    * Code optimization

    * code cleanup, optimization

    * fix double-processing window

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * [KeyboardManager]Fix mapping shift to numpad (#35890)

    * Keyboard Manger fix numpad as shift

    Fixed shift not being released if a numpad key as shift.

    * Added comments

    * Fix typo

    * Fix the numpad unlocked key not working if the locked version is overridden by shift

    * Fix spelling check.

    * Revert the VK_CLEAR change.

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [Analyzers] Update .editorconfig with rules to relax IDE errors (#36095)

    * [Analyzers] Remove duplicate pascal case style from .editorconfig

    * [Analyzers] Configured severity for individual IDE and CA rules showing as errors in VS

    Set severity for IDE0005, IDE0008, IDE0016, IDE0018, IDE0019, IDE0021, IDE0022, IDE0023, IDE0025, IDE0027, IDE0028, IDE0029, IDE0031, IDE0032, IDE0034, IDE0036, IDE0039, IDE0042, IDE0044, IDE0045, IDE0046, IDE0047, IDE0057, IDE0051, IDE0052, IDE0054, IDE0055, IDE0056, IDE0057, IDE0059, IDE0060, IDE0061, IDE0063, IDE0071, IDE0073, IDE0074, IDE0075, IDE0077, IDE0078, IDE0083, IDE0090, IDE0100, IDE0130, IDE160, IDE180, IDE0200, IDE0240, IDE0250, IDE0251, IDE0260, IDE0270, IDE0290, IDE0300, IDE0301, IDE0305, IDE1005, IDE1006, CA1859, CA2022, CA2263

    * [Analyzers] Fix mismatched analyzer descriptions

    * [Analyzers] Fix misspelling

    * Update .editorconfig

    Made the following style rules `silent` instead of `suggestion`:
    - Use explicit type instead of 'var'
    - Use expression body for ...
    - Use block-scoped namespace

    * [Analyzers] Set IDE0290 to silent

    * [Analyzers] Remove IDE1006 configuration from .editorconfig in favor of making exclusions for the few entries

    * [Analyzers][Indexer] Add IDE1006 suppressions

    * [Analyzers][Peek] Add IDE1006 suppression

    * [Analyzers][MWB] Add IDE1006 suppression.

    * [Analyzers][Plugins] Add IDE1006 suppression

    * [Analyzers][ImageResizer] Suppress IDE0073 to retain original copyright

    * [Analyzers] Remove IDE0073 severity change in .editorconfig

    ---------

    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>

    * [Workspaces] PWA follow-up (#36217)

    * [PTRun][Calculator]Allow scientific notation with lowercase 'e' (#36187)

    * [Workspaces] Add encoder parameter to bitmap.save() (#36228)

    * [Workspaces] Add encoder parameter to bitmap.save()

    * 1 more call fixed

    * Move repeated code to the csharp library

    * [Workspaces] Implement store of app window's size and position (#36086)

    * [Workspaces] Implement store of app window's size and position

    * Modifying the default values to -1. The program will use the original default values for the first run.

    * [ScreenRuler]Add setting to show the measurement in an extra unit (#35887)

    * display ruler: supporting millimeter and other units

    * Measurement Tool: UI Setting for an extra unit

    * Update images

    * spelling

    * spelling

    * suit code style

    * Fix for code review

    * remove weird file

    * rename field

    * [Deps]Update MSTest from 3.5.0 to 3.6.3 (#36115)

    * Update MSTest from 3.5.0 to 3.6.3

    * Use STA attributes that are now part of MSTest

    * Adding Jerry to community.md (#36232)

    Update COMMUNITY.md

    * [Workspaces] Arranger: smart timer (#36096)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] Arranger: Reset wait timer after each successful arrange action

    * fix merge error

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Upgrade to check-spelling v0.0.24 (#36235)

    This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24).

    A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur.

    There's a new accessibility forbidden pattern:

    > Do not use `(click) here` links
    > For more information, see:
    > * https://www.w3.org/QA/Tips/noClickHere
    > * https://webaim.org/techniques/hypertext/link_text
    > * https://granicus.com/blog/why-click-here-links-are-bad/
    > * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
    ```pl
    (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\()
    ```

    There are some minor bugs that I'm aware of and which I've fixed since this release, but I don't expect to make another release this month.

    I've added a pair of patterns for includes and pragmas. My argument is that the **compiler** will _generally_ tell you if you've misspelled an include and the **linker** will _generally_ tell you if you misspell a lib.

    - There's a caveat here: If your include case-insensitively matches the referenced file (but doesn't properly match it), then unless you either use a case-sensitive file system (as opposed to case-preserving) or beg clang to warn, you won't notice when you make this specific mistake -- this matters in that a couple of Windows headers (e.g. Unknwn.h) have particular case and repositories don't tend to consistently/properly write them.

    * Adjust to community.md, shifting jerry's github user name (#36242)

    Update COMMUNITY.md

    * [AOT compatible] Resolve AOT Build Error in Peek.UI (#36194)

    * add partial for aot support

    * add Microsoft.NET.ILLink.Tasks to packages.props

    * format

    * Revert "format"

    This reverts commit 742d5e2214.

    * add Microsoft.NET.ILLink.Tasks to notice.md

    * add auto reference

    * update script to remove the 'Auto-reference line'

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Awake Updates - `TILLSON_11272024` (#36049)

    * Update with bug fixes for tray icon and support for parent process

    * Process information enum

    * Update the docs

    * Fix spelling

    * Make sure that PID is used in PT config flow

    * Logic for checks based on #34148

    * Update with link to PR

    * Fixes #34717

    * Small cleanup

    * Proper task segmentation in a function

    * Cleanup the code

    * Fix synchronization context issue

    * Update planning doc

    * Test disabling caching to see if that manages to pass CI

    * Cleanup to make sure that we're logging things properly.

    * Update ci.yml

    * Disable cache to pass CI

    * Retry logic

    * Cleanup

    * Code cleanup

    * Fixes #35848

    * Update notes and codename

    * After third attempt, log error instead of throwing exception

    * More cleanup to avoid double execution

    * Add expected word

    * Safeguards for bad values for timed keep-awake

    * More updates to make sure I am using uint

    * Update error message

    * Update packages

    * Fix notice and revert CsWinRT upgrade

    * Codename update

    * Update expect.txt

    * Update the struct

    * Ensuring we're properly awaiting tray initialization

    * Update to make sure tray reflects the bound process

    * Cleanup, proper JSON serialization for logs.

    * Not needed.

    * Add command validation logic

    * Moving the initialization logic earlier

    * Make sure we show the display state in the tooltip

    * Update tray string

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update logic for icon resets

    * Update doc

    * Simplify function for setting mode shell icon

    * Issues should be properly linked

    * Minor cleanup

    * Update timed behavior

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Workspaces] detecting right app version (#36100)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] fix detection of specific version of apps

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Move the XamlStyler config to src/ (#36202)

    my never ending goal to minimize files in the root dir

    * [AdvancedPaste]Add Semantic Kernel opt-in to allow chaining of paste actions (#35902)

    * [AdvancedPaste] Semantic Kernel support

    * Changed log-line with potentially sensitive info

    * Spellcheck issues

    * Various improvements for Semantic Kernel

    * Spellcheck issue

    * Refactored Clipboard routines

    * Added integration tests for KernelService

    * Extra telemetry for AdvancedPaste

    * Added 'Hotkey' suffix to AdvancedPaste_Settings telemetry event

    * Added IsSavedQuery

    * Added KernelQueryCache

    * Refactoring

    * Added KernelQueryCache to BugReportTool delete list

    * Added opt-n for Semantic Kernel

    * Fixed bug with KernelQueryCache

    * Ability to view last AI chat message on error

    * Improved kernel query cache

    * Used System.IO.Abstractions and improved tests

    * Fixed under-count of token usage

    * Used Semantic Kernel icon

    * Cleanup

    * Add missing EndProject line

    * Fix dependency version conflicts

    * Fix NOTICE.md

    * Correct place of SemanticKernel in NOTICE.md

    * Unlinked CustomPreview toggle from AI

    * Added Microsoft.Bcl.AsyncInterfaces dependency to AdvancedPaste

    * Fixed NOTICE.md order

    * Moved Custom Preview to behaviour section

    * Made Image to Text raise error on empty output

    * Added AIServiceBatchIntegrationTests

    * Updated AIServiceBatchIntegrationTests

    * Added prompt moderation

    * Moved GPO Infobar to better location

    * [Launcher]Port from WPF-UI to .NET 9 WPF (#36215)

    * Initial implementation

    * Fix fluent style

    * Fix no endline

    * Update expect.txt

    * Fix formatting

    * Fix light theme looking bad on Windows 10

    * fix formatting

    * test change

    * Now really fixed W10

    * Add a comment

    * Fix typos

    * Fix spellcheck errors

    * Fix spellcheck pattern for websites

    * Change patterns for spellcheck in the right file

    * Fix XAML styling

    * Fix contrast colors on W11

    * Fix formatting

    * Removed emty line

    * Fix formatting

    * Added comment to fluentHC file

    * fix comment

    * Fix Windows10 again.
    Adress feedback.

    * W11 fix chaning from high contrast to normal not having correct background

    * W10 Fix high contrast not working after switching from light/dark moed

    * Address feedback

    * Fix formatting

    * Second W11 fix chaning from high contrast to normal not having correct background

    * [UX]Updating New+ and Settings icons (#36290)

    * Updated icons

    * Updating more icons and icos

    * [Settings][Dashboard] Accessibility fixes (#36280)

    * make narrator announce buttons/toggles

    * add toggles module name

    * [ci]Sign OpenAI dll that's not signed (#36299)

    * Update CODEOWNERS to include gordon, jerry and kayla (#36308)

    * Update CODEOWNERS

    * Update names.txt

    * Making the powertoys-code-owners team code owners (#36310)

    * Update CODEOWNERS

    * Update names.txt

    * Update CODEOWNERS

    * [FZEditor]Fix Create new layout dialog radio buttons IsChecked values  (#36320)

    * 0.87 changelog (#36335)

    * 0.87 changelog

    * Fix spellcheck

    * Update README.md

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [PTRun]Fix WPF transparent border issue on Windows 10 (#36392)

    * Added border on W10

    * Added a comment

    ---------
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>

    * [PTRun]Fix .NET 9 crash in OneNote (#36417)

    * Fix crash in OneNote Run

    * added better comment

    * [AdvancedPaste]Fix NullReferenceException on Dispose (#36428)

    [AdvancedPaste] Fixed NullReferenceException on Dispose

    * [Fuzz] Add fuzz testing for AdvancedPaste and new pipeline for onboarding OneFuzz (#36329)

    * add fuzz

    * install .net8

    * add spelling check

    * refine the pipeline

    * add readme and update the test code

    * fix spelling error

    * change to weekly run

    * Add New CI Pipeline for Latest WindowsAppSDK (#36282)

    This PR introduces the following changes to the CI pipeline and version management:

    Pipeline Enhancements:
    1. Added a new script UpdateVersions.ps1 to automate the update of Microsoft.WindowsAppSDK versions across various project files.
    2. Introduced a new pipeline configuration ci-using-the-latest-winappsdk.yml to build using the latest Microsoft.WindowsAppSDK.
    3. Updated existing pipeline configurations to support the new useLatestWinAppSDK parameter.

    Pipeline Configuration Updates:
    1. Updated job-build-project.yml to handle the useLatestWinAppSDK parameter and adjust the RestoreAdditionalProjectSourcesArg accordingly.
    2. Added a new template steps-update-winappsdk-and-restore-nuget.yml for updating and restoring NuGet packages with the latest Microsoft.WindowsAppSDK.
    3. Added WinAPPSDK version selection, the pipeline can be manually triggered to use the specified version.

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [AOT compatible] Make HostsUILib become AOT compatible (#36136)

    * Remove AOT configuration

    * Refer to AOT compatibility props

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [AOT compatible] Clean up some AOT build issue in FilePreviewCommon and MarkdownPreviewHandler (#36207)

    * Use AppContext.BaseDirectory to replace assembly.GetExeAseembly.Location.
    Fix json serilizer aot issue.

    * clean up some AOT build issue

    * Update src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandlerControl.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Update src/common/FilePreviewCommon/Formatters/JsonFormatter.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Add new pipeline using the latest webview2 from Edge Canary (#36317)

    * using the latest webview2 for testing

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Bug fix] Making the OpenAI key configuration page scrollable. (#36359)

    * Fixed #34470

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>

    * [Bug fix] Add a format validation step before format conversion. (#36404)

    This PR aims to fix the bug #35225 by introducing a new method IsJson to determine if a given text is in JSON format.
    The IsJson method is then utilized in the ToJsonFromXmlOrCsvAsync method to optimize the processing logic.
    If the text is already in JSON format, it is returned directly without further conversion from XML or CSV.

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * Add more STCA team members (#36438)

    * Add more STCA team members

    * Include more spelling check errors

    * Remove non-alpha in dictionary

    * Add Zhaopeng Wang

    * Fix spell checking error

    * Remove "prerelease: true" (#36484)

    * Remove "prerelease: true"

    The Microsoft.WinGet.DSC module is GA so prerelease: true is no longer needed.

    * Update expect.txt

    fixing spellcheck warning

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Docs]Update README for 0.87.1 release (#36534)

    * [CI] Enhance build Pipeline Reliability with Retry Logic and Improved Error Messaging (#36529)

    * update pipeline with retry

    * remove tests

    * Add team member (#36590)

    * [New+]Don't override New actions from Explorer on Windows 10 (#36467)

    * [New+]Don't override New actions from Explorer

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Add pattern for learn.microsoft links

    * Also only Query for context menu

    * [PTRun][Calculator]Handle hexadecimal numbers to not return divide by 0 error (#36390)

    * add '0x' handling for divide by 0 scenarios

    * fix comment on division by 0 check

    ---------

    Co-authored-by: Connor Plante <connor.plante@gmail.com>

    * [TextExtractor]Minor UI/Accessibility fixes in the overlay UI (#36356)

    minor UI and accessibility fixes

    * [PTRun][Calculator]Update mages to v3.0.0 and support for `randi(n)` (#36560)

    * update to mages 3.0.0

    * allow randi() in calculator plugin

    * fix tests and input validation

    * fix spell check

    * [QuickAccent]Added ć for Slovenian (#36336) (#36338)

    * Fix snapping Workspaces Editor to Fancy Zones (#36463)

    * Remove Workspaces Editor from Fancy Zone's excluded app list

    * removed unused string

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>

    * [PTRun]Fix drag on .NET 9 WPF (#36635)

    * [CQ]Continued to move stuff out of root - Solution.props (#36244)

    * [QuickAccent]Add Proto-Indo-European (#36408)

    * Add ḱ to PowerAccent for Proto-Indo-European

    * Fix Spelling Check

    * Add more letters to PIE

    * Order PIE after PI

    ---------

    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [PTRun]Add context buttons for VSCodeWorkspaces plugin (#36517)

    * [Settings][QuickAccent]Change 'character set' to plural form (#36565)

    * [PTRun][Calculator]Fix unit tests on non-english systems (#36569)

    * fix tests

    * update comment

    * [PTRun][Calc]Improve handling of non-base 10 numbers (#36700)

    * [Settings][PTRun]Show plugin version and website (#36580)

    * [Monaco]Add support for .resx and .resw preview support. (#36499)

    Added support for .resx and .resw preview support. These files are XML based files so I added the file extensions as part of the registerAdditionalLanguage("xmlExt"...) function.

    * [Settings] Add Workspaces' workspaces.json file to backup/restore list (#36714)

    * [Localization] Fix loc pipeline to send downloaded localized files to TDBuild upon retry after failure (#36766)

    * [AdvancedPaste]Fixed issues with Screen Reader integration (#36778)

    * Remove Advent calendar from README (#36777)

    * Remove Advent calendar from README

    * Update hero image

    * Delete doc/images/overview/PT_holiday_hero_image.png

    * [AdvancedPaste]Add all BitmapDecoder supported image filetypes to ImageToText (#35600)

    Adds support to ImageToText for all image filetypes supported by BitmapDecoder.

    * [AOT]Clean up some AOT build issues in PowerAccent.Core (#36264)

    * init

    * Use AotCompatibility instead

    * Replace typeof(Lanaguge) with GetValues<Language>

    * Create new folder to place source generation context file.

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [WinUI3]Fix Windows 10 title bar borders (#36429)

    * Fix borders for windows in the Settings UI

    * Fix HOSTS window

    * Fix Advanced Paste

    * Fix Environment Variables

    * Fix File Locksmith

    * Fix Peek, with a caveat

    * Fix Registry Preview

    * Remove unused imports

    * Clean up imports in OobeShellPage

    * Move OSVersionHelper from Common.UI up into ManagedCommon

    * [QuickAccent]Fix unstable language loading (#36721)

    * [Peek]Bring into foreground if previously minimized (#36506)

    Added Activate() to bring Peek.UI window into focus upon Toggle. This allows the UI to be presented even if it was previously minimized.

    * Update Run docs README (#36857)

    * Update Run docs README

    * Remove System dupe

    * [Monaco]Make minimap toggleable (#33742)

    * [Monaco]Fix Json format preview setting (#36867)

    * [KBM]Added option for exact match shortcut (#36000)

    * Added option for exact match shortcut

    * Fix spell-check

    * [Deps][Security]Update .NET Packages from 9.0.0 to 9.0.1  (#36879)

    * [Deps] Update NuGet packages to version 9.0.1

    Updated several NuGet packages from version 9.0.0 to 9.0.1, including:
    - Microsoft.Data.Sqlite
    - Microsoft.Bcl.AsyncInterfaces
    - Microsoft.Extensions.DependencyInjection
    - Microsoft.Extensions.Logging
    - Microsoft.Extensions.Logging.Abstractions
    - Microsoft.Extensions.Hosting
    - Microsoft.Extensions.Hosting.WindowsServices
    - Microsoft.Win32.SystemEvents
    - Microsoft.Windows.Compatibility
    - System.CodeDom
    - System.ComponentModel.Composition
    - System.Configuration.ConfigurationManager
    - System.Data.OleDb
    - System.Diagnostics.EventLog
    - System.Diagnostics.PerformanceCounter
    - System.Drawing.Common
    - System.Management
    - System.Runtime.Caching
    - System.ServiceProcess.ServiceController
    - System.Text.Encoding.CodePages
    - System.Text.Json

    * [Deps] Update NOTICE.md

    * [Peek]Fix using the correct Monaco assets at runtime (#36890)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area (#36769)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area

    * Update src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    ---------

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    * [Workspaces] Saving app properties on launch and recapture (#36751)

    * [Workspaces] Implementing set and get GUID to/from HWND to distinguish windows moved by the Workspaces tool

    * After launch and capture copy the CLI args from the "original" project

    * Fix getting GUID

    * spell check

    * modification to be able to handle different data sizes on different systems

    * code optimisation

    * Replacing string parameter by InvokePoint

    * renaming variable

    * [AdvancedPaste]Use background thread for interactions between runner and Advanced Paste (#36858)

    * [Advanced Paste] Use background thread for runner-Advanced Paste interaction

    * Fixed typo

    * [VCM]Deprecate the Video Conference Mute utility (#36772)

    * Remove all VideoConferenceMute related code and files

    * Clean up vcm driver registry keys

    * Also remove the Webcam report tool

    * Also clean out video conference on the installer

    * Fix spellcheck

    * Remove comment about video conf

    * Update gpo files revision

    * Revert removing the VCM policies

    * Deprecate VCM GPO policy

    * Change deprecation message to show first supported version

    * Tweak supported strings in the adml

    * Goodbye friends, you are forever part of the team (#36905)

    * Goodbye friends

    Forever part of the team 😢

    * Update COMMUNITY.md

    * Fix formatting issues in COMMUNITY.md

    * [New utility]Sysinternals ZoomIt (#35880)

    * ZoomIt initial code dump

    * Change vcxproj to normalize dependency versions

    * Fix code quality to build

    * Add to PowerToys solution

    * Clean out C-style casts

    * Fix some more analyzer errors

    * Constexpr a function

    * Disable some warnings locally that it seemed better not to touch

    * Add ZoomIt module interface

    * Add GPO

    * Add Settings page with Enable button

    * Output as PowerToys.ZoomIt.exe

    * Extract ZoomIt Settings definition to its own header

    * Make ZoomItModuleInterface build with ZoomItSettings too

    * WinRT C++ interop for ZoomItSettings

    * From Registry To PowerToys Json

    * Properly fix const_cast analyzer error

    * Initial Settings page loading from registry

    * Zoom mode settings

    * Save settings

    * Add file picker and DemoType file support

    * Remaining DemoType settings

    * Have ZoomIt properly reloading Settings and exiting

    * Remove context menu entries for Options and Exit

    * ZoomIt simple Break Options

    * Break advanced options

    * Simple Record settings

    * Record Microphone setting

    * Fix break background file picker title

    * Font setting

    * Fix build issues after merge

    * Add ZoomIt conflict warning to Settings

    * Exclude Eula from spell checking

    * Fix spellcheck errors

    * Fix spell check for accelerated menu items

    * Remove cursor files from spellcheck. They're binary

    * Fix forbidden patterns

    * Fix XAML style

    * Fix C# analyzers

    * Fix signing

    * Also sign module interface dll

    * Use actual ZoomIt icon

    * Add OOBE page for ZoomIt

    * ZoomIt image for Settings

    * Flyout and Dashboard entries

    * Fix type speed slider labels

    * Correctly load default Font

    * Correctly register shortcuts on ZoomIt startup first run

    * Fix modifier keys not changing until restart

    * Show MsgBox on taken shortcut

    * Start PowerToys Settings

    * Normalize ZoomIt file properties with rest of PowerToys

    * Add attribution

    * Add ZoomIt team to Community.md

    * More copyright adjustments

    * Fix spellcheck

    * Fix MsgBox simultaneous instance to the front

    * Add mention of capturevideosample code use

    * Add ZoomIt to process lists

    * Add telemetry

    * Add logging

    * React to gpo

    * Normalize code to space identation

    * Fix installer build

    * Localize percent setting

    * Fix XAML styling

    * Update src/settings-ui/Settings.UI/Strings/en-us/Resources.resw

    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * Fix spellcheck

    * One more spellcheck fix

    * Integrate LiveDraw feature changes from upstream

    * Fix name reuse in same scope

    * Fix c-style casts

    * Also register LIVEDRAW_HOTKEY

    * Fix newLiveZoomToggleKey

    * Update LiveZoom description in Settings to take LiveDraw into account

    * Fix spellcheck

    * Fix more spellcheck

    * Fix Sysinternals capitalization

    * Fix ARM64 Debug build

    * Support Sysinternals build (#36873)

    * Remove unneeded files

    * Make build compatible with Sysinternals

    * Separate PowerToys ZoomIt product name (#36887)

    * Separate PowerToys ZoomIt product name

    To help maintain the Sysinternals branding in the standalone version.

    * Clarify branding-related includes

    * Remove ZoomIt.sln

    * Add foxmsft to spell-check names

    * Add ZoomIt to README

    * Add ZoomIt to GH templates

    * Add ZoomIt events to DATA_AND_PRIVACY.md

    * Remove publish_config.json

    * Remove publish_config.json from vcxproj too

    ---------

    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * [PTRun]Add hotkey to the show telemetry event (#36869)

    * [PTRun]Update the code for .NET 9.0.1 - remove workarounds (#36909)

    * Revove some unneeded changes after pdating to .net9.1

    * [RegistryPreview]Copy context menu, data tooltip, MULTI_SZ fix (#36631)

    * add context menus

    * string resources for contextmenu

    * fix line break parsing for MULTI_SZ

    * better presentation of multiline values and value tooltip

    * cleanup

    * [MWB] - refactoring "Common" classes - Common.Log.cs, Common.Receiver.cs (#35726)

    * [PTRun]Add setting for different trigonometric units in Calculator (#36717)

    * Added angle units to PowerToys Run Calculator plugin.

    * Update Resources.resx

    * Added GitHub SpellCheck rule for 'gradians'.

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [ci]Remove steps to build abstracted utilities packages (#36934)

    * [Settings]Update GPO infobar icon, improve some pages and fix bugs (#33703)

    * changes part 1

    * fix xaml code

    * changes part 2

    * fix cmdNotFound page

    * Update PowerOcrPage

    * More Pages changed

    * More Pages changed

    * revert temporary change

    * fix spelling

    * add resw comment

    * add resw comment

    * Update MouseWihtoutBorderPage.xaml

    * PowerPreview page

    * workspaces page

    * fix awake page gpo handling

    * NewPlus page

    * update new+ page!

    * AdvancedPaste.xaml: Move Info bar.

    * Update MouseJumpPanel.xaml

    * Update GeneralPage.xaml

    * fix position of info bar and some ui quirks

    * fix xaml style

    * fix string resources

    * string changes

    * prepare megre main

    * update new+ page

    * zoomit page

    * various fixes

    * [Common]NotificationUtil helper class with FileWatcher (#36720)

    * add NotificationUtil helper with file watcher and cache

    * fix spellcheck

    * indentation

    * [PTRun][Docs]Add YubicoOauthOTP to Third-Party plugins (#36761)

    * [PTRun]Fixed typo in Value Generator messages (#36951)

    * [AOT] Clean up some AOT issues in Advanced Paste module (#36297)

    * Clean up the aot build issue.

    * Merge main and clean up new AOT build issue

    * Update LogEvent define.

    * Update src/modules/AdvancedPaste/AdvancedPaste/Helpers/LogEvent.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * update typo bug

    * Remove unused allow list item

    * Create a new folder to place source generation context

    * Merge main and rename LogEvent to AIServiceFormatEvent

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * [ZoomIt]React to gpo setting when run as standalone (#36975)

    * [Settings]ImageResizer settings accessibility updates, fixes and refactor (#36903)

    * Fix issue with missing Image Resizer unit and fit information in settings description.

    * Fix accessibility issues on Edit and Remove buttons. Fix various issues and refactor view model and ImageSize. New resources for accessibility text formats.

    * Fix unit test because of change to new preset width and height. Fix 2 unit tests having incorrect expected/actual orderings.

    * Post-review update: accessibility strings now formatted within the converter, instead of via format strings; simplified encoder GUID collection declaration and retrieval.

    * Minor example text fix.

    * [Settings]Update "Back up" mentions when it should be used as a verb (#36965)

    * Update Back up name

    * Rename Backup to Back up

    * [New+]Update last modified date to now for all templates created (#36133)

    * Update last modified date to now for all templates created

    * Now also set last update for directories. Thank you htcfreek!

    * [ImageResizer][ci]Fix XAML style errors (#37009)

    * [Settings] Add "new" labels to navigation for new utilities (#36939)

    * initial implementation

    * move new label to zoomit

    * cleanup

    * more cleanup

    * fix XAML formatting

    * update padding to 4px

    * add badge to dashboard item

    * fix XAML formatting

    * Tweaking UX

    ---------

    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [MWB]Fix helper process termination issue in service mode (#36892)

    * [MWB] Changed to suppress the flow of the execution context

    * Fix build after merge

    * [MWB] Fix helper process termination issue in service mode

    * Add some comments

    * [runner]Fix crashes caused by wrong setting AllowDataDiagnostics registry value (#37015)

    * Fix setting registry value

    * Prevent future similar crashes

    * [PTRun][Calculator]Error check when loading trigonometry mode (#37033)

    * [ZoomIt]Fix transparent draw after changing another setting (#37042)

    * [Settings]Fix ZoomIt page changing current directory (#37052)

    * [ci]Remove vc tools version workaround (#37098)

    * 0.88 changelog (#37056)

    * 0.88 changelog

    * Update README.md

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * Add installer hashes

    * Fix aka.ms link for ZoomIt

    * Add mention to the PTRun plugin's dll file version

    * Update README.md

    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>

    * Update README.md - update What's Planned to 0.89 (#37157)

    Update README.md

    Just a tiny update, as reference to 0.88 was missed.

    * [ci]Proper workaround for the vc tools version check (#37130)

    * Revert "[ci]Remove vc tools version workaround (#37098)"

    This reverts commit 2c069ce708.

    * Adopt the same workaround as in Terminal

    * build: add a couple more signing variables to ESRP (#37328)

    This is in support of some identity changes we need to make.

    * [Docs] Update runner-ipc.md to fix broken links (#36994)

    Update runner-ipc.md

    Fix broken file links.

    * [ContextMenu]Update win11 msix menus if wrong version is detected (#37289)

    * [ContextMenus]Update win11 msix menus if wrong version

    * Remove extra line in code

    * [Build]Compatibility with VS17.3 and later, for C++23 <expected>(#37321)

    [Build] compatibility with VS17.3 and later, for C++23 <expected> has been introduced in VS17.3.6, and std::expected has conflict/inconsistent with the makeshift (expected-lite)

    * [Deps]Update .NET Packages from 9.0.1 to 9.0.2 (#37400)

    * [Deps] Update NuGet package versions to 9.0.2

    * [CI] Update NOTICE.md

    * Ignore 0.0.0.0 versions as well for PowerToys files

    * Verify we're not shipping any 0.0.0.0 files

    * Add MSFT file that's expected as 0.0.0.0

    * Fix spellcheck

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Fix bad merge

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com>
    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>
    Co-authored-by: Ionuț Manța <ionut@janeasystems.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>
    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>
    Co-authored-by: PesBandi <127593627+PesBandi@users.noreply.github.com>
    Co-authored-by: Wenjian Chern <55335597+Sophanatprime@users.noreply.github.com>
    Co-authored-by: Youssef Victor <youssefvictor00@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
    Co-authored-by: leileizhang <leilzh@microsoft.com>
    Co-authored-by: Den Delimarsky 🔐 <sign@den.dev>
    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>
    Co-authored-by: Shuai Yuan <128874481+shuaiyuanxx@users.noreply.github.com>
    Co-authored-by: moooyo <42196638+moooyo@users.noreply.github.com>
    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jerry Xu <n.xu@outlook.com>
    Co-authored-by: Demitrius Nelon <denelon@microsoft.com>
    Co-authored-by: Kai Tao <69313318+vanzue@users.noreply.github.com>
    Co-authored-by: Connor Plante <150482134+plante-msft@users.noreply.github.com>
    Co-authored-by: Connor Plante <connor.plante@gmail.com>
    Co-authored-by: Domen Soklič <soklicd@gmail.com>
    Co-authored-by: Hao Liu <liuhaobupt@163.com>
    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: immi <iafullprogrammer@gmail.com>
    Co-authored-by: Asif Islam <77113884+asif4318@users.noreply.github.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>
    Co-authored-by: Dave Rayment <dave.rayment@gmail.com>
    Co-authored-by: Neil McAlister <pingzing@users.noreply.github.com>
    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Michael Clayton <mike@kingslandconsulting.co.uk>
    Co-authored-by: Nathan Gill <nathan.j.gill@outlook.com>
    Co-authored-by: Daniel Nilsson <daniel.nilsson1989@gmail.com>
    Co-authored-by: JackStuart <jack@jstuart.io>
    Co-authored-by: Christian Gaarden Gaardmark <cgaarden@hotmail.com>
    Co-authored-by: YDKK <YDKK@users.noreply.github.com>
    Co-authored-by: Dustin L. Howett <duhowett@microsoft.com>
    Co-authored-by: LNKLEO <LinkeyLeo@outlook.com>
    Co-authored-by: Mike Griese <migrie@microsoft.com>

commit d93e5f5bd7
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 12 15:24:44 2025 -0600

    Add a license to our nuget (#418)

    title

commit 43bae6f922
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Feb 7 10:44:22 2025 -0600

    Add the form data too (#414)

    Hey turns out that commented out `dataString` was important!

    This isn't _terribly_ breaking, because `IFormContent` is new.

commit 066ebe104e
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Feb 7 10:44:07 2025 -0600

    Prepare for a new template project (#410)

    This moves the extension template out to its own solution (with the SDK manually packed into it for now)

    I've tested that I can now zip this up, then unzip and string replace on it, and we'll get a fully deployable, runnable extension, like 🫰

commit 595fd3b6ee
Author: Seraphima Zykova <zykovas91@gmail.com>
Date:   Fri Feb 7 17:43:40 2025 +0100

    [Indexer] File icons (#343)

    - [x] **Closes:** #316

    ![image](https://github.com/user-attachments/assets/4daeff29-4f56-41c3-8648-8d866b971382)

commit 4d696e1cfc
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Feb 7 05:15:29 2025 -0600

    BUILD: Fix signing the SDK (#413)

    thanks dustin

    This needed to also happen when we merged the upstream PT in #411

commit c2245be456
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Thu Feb 6 22:45:51 2025 +0100

    Merge upstream PT #11 (#411)

    * [Workspaces] implement the move feature (#35480)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * fix Move attribute after launch and snapshot

    * Extend WindowArranger with PWA functionality to detect different PWA apps. PwaHelper moved to the common library

    * fix repeat counter in the editor

    * Code optimization

    * code cleanup, optimization

    * fix double-processing window

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * [KeyboardManager]Fix mapping shift to numpad (#35890)

    * Keyboard Manger fix numpad as shift

    Fixed shift not being released if a numpad key as shift.

    * Added comments

    * Fix typo

    * Fix the numpad unlocked key not working if the locked version is overridden by shift

    * Fix spelling check.

    * Revert the VK_CLEAR change.

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [Analyzers] Update .editorconfig with rules to relax IDE errors (#36095)

    * [Analyzers] Remove duplicate pascal case style from .editorconfig

    * [Analyzers] Configured severity for individual IDE and CA rules showing as errors in VS

    Set severity for IDE0005, IDE0008, IDE0016, IDE0018, IDE0019, IDE0021, IDE0022, IDE0023, IDE0025, IDE0027, IDE0028, IDE0029, IDE0031, IDE0032, IDE0034, IDE0036, IDE0039, IDE0042, IDE0044, IDE0045, IDE0046, IDE0047, IDE0057, IDE0051, IDE0052, IDE0054, IDE0055, IDE0056, IDE0057, IDE0059, IDE0060, IDE0061, IDE0063, IDE0071, IDE0073, IDE0074, IDE0075, IDE0077, IDE0078, IDE0083, IDE0090, IDE0100, IDE0130, IDE160, IDE180, IDE0200, IDE0240, IDE0250, IDE0251, IDE0260, IDE0270, IDE0290, IDE0300, IDE0301, IDE0305, IDE1005, IDE1006, CA1859, CA2022, CA2263

    * [Analyzers] Fix mismatched analyzer descriptions

    * [Analyzers] Fix misspelling

    * Update .editorconfig

    Made the following style rules `silent` instead of `suggestion`:
    - Use explicit type instead of 'var'
    - Use expression body for ...
    - Use block-scoped namespace

    * [Analyzers] Set IDE0290 to silent

    * [Analyzers] Remove IDE1006 configuration from .editorconfig in favor of making exclusions for the few entries

    * [Analyzers][Indexer] Add IDE1006 suppressions

    * [Analyzers][Peek] Add IDE1006 suppression

    * [Analyzers][MWB] Add IDE1006 suppression.

    * [Analyzers][Plugins] Add IDE1006 suppression

    * [Analyzers][ImageResizer] Suppress IDE0073 to retain original copyright

    * [Analyzers] Remove IDE0073 severity change in .editorconfig

    ---------

    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>

    * [Workspaces] PWA follow-up (#36217)

    * [PTRun][Calculator]Allow scientific notation with lowercase 'e' (#36187)

    * [Workspaces] Add encoder parameter to bitmap.save() (#36228)

    * [Workspaces] Add encoder parameter to bitmap.save()

    * 1 more call fixed

    * Move repeated code to the csharp library

    * [Workspaces] Implement store of app window's size and position (#36086)

    * [Workspaces] Implement store of app window's size and position

    * Modifying the default values to -1. The program will use the original default values for the first run.

    * [ScreenRuler]Add setting to show the measurement in an extra unit (#35887)

    * display ruler: supporting millimeter and other units

    * Measurement Tool: UI Setting for an extra unit

    * Update images

    * spelling

    * spelling

    * suit code style

    * Fix for code review

    * remove weird file

    * rename field

    * [Deps]Update MSTest from 3.5.0 to 3.6.3 (#36115)

    * Update MSTest from 3.5.0 to 3.6.3

    * Use STA attributes that are now part of MSTest

    * Adding Jerry to community.md (#36232)

    Update COMMUNITY.md

    * [Workspaces] Arranger: smart timer (#36096)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] Arranger: Reset wait timer after each successful arrange action

    * fix merge error

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Upgrade to check-spelling v0.0.24 (#36235)

    This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24).

    A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur.

    There's a new accessibility forbidden pattern:

    > Do not use `(click) here` links
    > For more information, see:
    > * https://www.w3.org/QA/Tips/noClickHere
    > * https://webaim.org/techniques/hypertext/link_text
    > * https://granicus.com/blog/why-click-here-links-are-bad/
    > * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
    ```pl
    (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\()
    ```

    There are some minor bugs that I'm aware of and which I've fixed since this release, but I don't expect to make another release this month.

    I've added a pair of patterns for includes and pragmas. My argument is that the **compiler** will _generally_ tell you if you've misspelled an include and the **linker** will _generally_ tell you if you misspell a lib.

    - There's a caveat here: If your include case-insensitively matches the referenced file (but doesn't properly match it), then unless you either use a case-sensitive file system (as opposed to case-preserving) or beg clang to warn, you won't notice when you make this specific mistake -- this matters in that a couple of Windows headers (e.g. Unknwn.h) have particular case and repositories don't tend to consistently/properly write them.

    * Adjust to community.md, shifting jerry's github user name (#36242)

    Update COMMUNITY.md

    * [AOT compatible] Resolve AOT Build Error in Peek.UI (#36194)

    * add partial for aot support

    * add Microsoft.NET.ILLink.Tasks to packages.props

    * format

    * Revert "format"

    This reverts commit 742d5e2214.

    * add Microsoft.NET.ILLink.Tasks to notice.md

    * add auto reference

    * update script to remove the 'Auto-reference line'

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Awake Updates - `TILLSON_11272024` (#36049)

    * Update with bug fixes for tray icon and support for parent process

    * Process information enum

    * Update the docs

    * Fix spelling

    * Make sure that PID is used in PT config flow

    * Logic for checks based on #34148

    * Update with link to PR

    * Fixes #34717

    * Small cleanup

    * Proper task segmentation in a function

    * Cleanup the code

    * Fix synchronization context issue

    * Update planning doc

    * Test disabling caching to see if that manages to pass CI

    * Cleanup to make sure that we're logging things properly.

    * Update ci.yml

    * Disable cache to pass CI

    * Retry logic

    * Cleanup

    * Code cleanup

    * Fixes #35848

    * Update notes and codename

    * After third attempt, log error instead of throwing exception

    * More cleanup to avoid double execution

    * Add expected word

    * Safeguards for bad values for timed keep-awake

    * More updates to make sure I am using uint

    * Update error message

    * Update packages

    * Fix notice and revert CsWinRT upgrade

    * Codename update

    * Update expect.txt

    * Update the struct

    * Ensuring we're properly awaiting tray initialization

    * Update to make sure tray reflects the bound process

    * Cleanup, proper JSON serialization for logs.

    * Not needed.

    * Add command validation logic

    * Moving the initialization logic earlier

    * Make sure we show the display state in the tooltip

    * Update tray string

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update logic for icon resets

    * Update doc

    * Simplify function for setting mode shell icon

    * Issues should be properly linked

    * Minor cleanup

    * Update timed behavior

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Workspaces] detecting right app version (#36100)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] fix detection of specific version of apps

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Move the XamlStyler config to src/ (#36202)

    my never ending goal to minimize files in the root dir

    * [AdvancedPaste]Add Semantic Kernel opt-in to allow chaining of paste actions (#35902)

    * [AdvancedPaste] Semantic Kernel support

    * Changed log-line with potentially sensitive info

    * Spellcheck issues

    * Various improvements for Semantic Kernel

    * Spellcheck issue

    * Refactored Clipboard routines

    * Added integration tests for KernelService

    * Extra telemetry for AdvancedPaste

    * Added 'Hotkey' suffix to AdvancedPaste_Settings telemetry event

    * Added IsSavedQuery

    * Added KernelQueryCache

    * Refactoring

    * Added KernelQueryCache to BugReportTool delete list

    * Added opt-n for Semantic Kernel

    * Fixed bug with KernelQueryCache

    * Ability to view last AI chat message on error

    * Improved kernel query cache

    * Used System.IO.Abstractions and improved tests

    * Fixed under-count of token usage

    * Used Semantic Kernel icon

    * Cleanup

    * Add missing EndProject line

    * Fix dependency version conflicts

    * Fix NOTICE.md

    * Correct place of SemanticKernel in NOTICE.md

    * Unlinked CustomPreview toggle from AI

    * Added Microsoft.Bcl.AsyncInterfaces dependency to AdvancedPaste

    * Fixed NOTICE.md order

    * Moved Custom Preview to behaviour section

    * Made Image to Text raise error on empty output

    * Added AIServiceBatchIntegrationTests

    * Updated AIServiceBatchIntegrationTests

    * Added prompt moderation

    * Moved GPO Infobar to better location

    * [Launcher]Port from WPF-UI to .NET 9 WPF (#36215)

    * Initial implementation

    * Fix fluent style

    * Fix no endline

    * Update expect.txt

    * Fix formatting

    * Fix light theme looking bad on Windows 10

    * fix formatting

    * test change

    * Now really fixed W10

    * Add a comment

    * Fix typos

    * Fix spellcheck errors

    * Fix spellcheck pattern for websites

    * Change patterns for spellcheck in the right file

    * Fix XAML styling

    * Fix contrast colors on W11

    * Fix formatting

    * Removed emty line

    * Fix formatting

    * Added comment to fluentHC file

    * fix comment

    * Fix Windows10 again.
    Adress feedback.

    * W11 fix chaning from high contrast to normal not having correct background

    * W10 Fix high contrast not working after switching from light/dark moed

    * Address feedback

    * Fix formatting

    * Second W11 fix chaning from high contrast to normal not having correct background

    * [UX]Updating New+ and Settings icons (#36290)

    * Updated icons

    * Updating more icons and icos

    * [Settings][Dashboard] Accessibility fixes (#36280)

    * make narrator announce buttons/toggles

    * add toggles module name

    * [ci]Sign OpenAI dll that's not signed (#36299)

    * Update CODEOWNERS to include gordon, jerry and kayla (#36308)

    * Update CODEOWNERS

    * Update names.txt

    * Making the powertoys-code-owners team code owners (#36310)

    * Update CODEOWNERS

    * Update names.txt

    * Update CODEOWNERS

    * [FZEditor]Fix Create new layout dialog radio buttons IsChecked values  (#36320)

    * 0.87 changelog (#36335)

    * 0.87 changelog

    * Fix spellcheck

    * Update README.md

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [PTRun]Fix WPF transparent border issue on Windows 10 (#36392)

    * Added border on W10

    * Added a comment

    ---------
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>

    * [PTRun]Fix .NET 9 crash in OneNote (#36417)

    * Fix crash in OneNote Run

    * added better comment

    * [AdvancedPaste]Fix NullReferenceException on Dispose (#36428)

    [AdvancedPaste] Fixed NullReferenceException on Dispose

    * [Fuzz] Add fuzz testing for AdvancedPaste and new pipeline for onboarding OneFuzz (#36329)

    * add fuzz

    * install .net8

    * add spelling check

    * refine the pipeline

    * add readme and update the test code

    * fix spelling error

    * change to weekly run

    * Add New CI Pipeline for Latest WindowsAppSDK (#36282)

    This PR introduces the following changes to the CI pipeline and version management:

    Pipeline Enhancements:
    1. Added a new script UpdateVersions.ps1 to automate the update of Microsoft.WindowsAppSDK versions across various project files.
    2. Introduced a new pipeline configuration ci-using-the-latest-winappsdk.yml to build using the latest Microsoft.WindowsAppSDK.
    3. Updated existing pipeline configurations to support the new useLatestWinAppSDK parameter.

    Pipeline Configuration Updates:
    1. Updated job-build-project.yml to handle the useLatestWinAppSDK parameter and adjust the RestoreAdditionalProjectSourcesArg accordingly.
    2. Added a new template steps-update-winappsdk-and-restore-nuget.yml for updating and restoring NuGet packages with the latest Microsoft.WindowsAppSDK.
    3. Added WinAPPSDK version selection, the pipeline can be manually triggered to use the specified version.

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [AOT compatible] Make HostsUILib become AOT compatible (#36136)

    * Remove AOT configuration

    * Refer to AOT compatibility props

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [AOT compatible] Clean up some AOT build issue in FilePreviewCommon and MarkdownPreviewHandler (#36207)

    * Use AppContext.BaseDirectory to replace assembly.GetExeAseembly.Location.
    Fix json serilizer aot issue.

    * clean up some AOT build issue

    * Update src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandlerControl.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Update src/common/FilePreviewCommon/Formatters/JsonFormatter.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Add new pipeline using the latest webview2 from Edge Canary (#36317)

    * using the latest webview2 for testing

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Bug fix] Making the OpenAI key configuration page scrollable. (#36359)

    * Fixed #34470

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>

    * [Bug fix] Add a format validation step before format conversion. (#36404)

    This PR aims to fix the bug #35225 by introducing a new method IsJson to determine if a given text is in JSON format.
    The IsJson method is then utilized in the ToJsonFromXmlOrCsvAsync method to optimize the processing logic.
    If the text is already in JSON format, it is returned directly without further conversion from XML or CSV.

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * Add more STCA team members (#36438)

    * Add more STCA team members

    * Include more spelling check errors

    * Remove non-alpha in dictionary

    * Add Zhaopeng Wang

    * Fix spell checking error

    * Remove "prerelease: true" (#36484)

    * Remove "prerelease: true"

    The Microsoft.WinGet.DSC module is GA so prerelease: true is no longer needed.

    * Update expect.txt

    fixing spellcheck warning

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Docs]Update README for 0.87.1 release (#36534)

    * [CI] Enhance build Pipeline Reliability with Retry Logic and Improved Error Messaging (#36529)

    * update pipeline with retry

    * remove tests

    * Add team member (#36590)

    * [New+]Don't override New actions from Explorer on Windows 10 (#36467)

    * [New+]Don't override New actions from Explorer

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Add pattern for learn.microsoft links

    * Also only Query for context menu

    * [PTRun][Calculator]Handle hexadecimal numbers to not return divide by 0 error (#36390)

    * add '0x' handling for divide by 0 scenarios

    * fix comment on division by 0 check

    ---------

    Co-authored-by: Connor Plante <connor.plante@gmail.com>

    * [TextExtractor]Minor UI/Accessibility fixes in the overlay UI (#36356)

    minor UI and accessibility fixes

    * [PTRun][Calculator]Update mages to v3.0.0 and support for `randi(n)` (#36560)

    * update to mages 3.0.0

    * allow randi() in calculator plugin

    * fix tests and input validation

    * fix spell check

    * [QuickAccent]Added ć for Slovenian (#36336) (#36338)

    * Fix snapping Workspaces Editor to Fancy Zones (#36463)

    * Remove Workspaces Editor from Fancy Zone's excluded app list

    * removed unused string

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>

    * [PTRun]Fix drag on .NET 9 WPF (#36635)

    * [CQ]Continued to move stuff out of root - Solution.props (#36244)

    * [QuickAccent]Add Proto-Indo-European (#36408)

    * Add ḱ to PowerAccent for Proto-Indo-European

    * Fix Spelling Check

    * Add more letters to PIE

    * Order PIE after PI

    ---------

    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [PTRun]Add context buttons for VSCodeWorkspaces plugin (#36517)

    * [Settings][QuickAccent]Change 'character set' to plural form (#36565)

    * [PTRun][Calculator]Fix unit tests on non-english systems (#36569)

    * fix tests

    * update comment

    * [PTRun][Calc]Improve handling of non-base 10 numbers (#36700)

    * [Settings][PTRun]Show plugin version and website (#36580)

    * [Monaco]Add support for .resx and .resw preview support. (#36499)

    Added support for .resx and .resw preview support. These files are XML based files so I added the file extensions as part of the registerAdditionalLanguage("xmlExt"...) function.

    * [Settings] Add Workspaces' workspaces.json file to backup/restore list (#36714)

    * [Localization] Fix loc pipeline to send downloaded localized files to TDBuild upon retry after failure (#36766)

    * [AdvancedPaste]Fixed issues with Screen Reader integration (#36778)

    * Remove Advent calendar from README (#36777)

    * Remove Advent calendar from README

    * Update hero image

    * Delete doc/images/overview/PT_holiday_hero_image.png

    * [AdvancedPaste]Add all BitmapDecoder supported image filetypes to ImageToText (#35600)

    Adds support to ImageToText for all image filetypes supported by BitmapDecoder.

    * [AOT]Clean up some AOT build issues in PowerAccent.Core (#36264)

    * init

    * Use AotCompatibility instead

    * Replace typeof(Lanaguge) with GetValues<Language>

    * Create new folder to place source generation context file.

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [WinUI3]Fix Windows 10 title bar borders (#36429)

    * Fix borders for windows in the Settings UI

    * Fix HOSTS window

    * Fix Advanced Paste

    * Fix Environment Variables

    * Fix File Locksmith

    * Fix Peek, with a caveat

    * Fix Registry Preview

    * Remove unused imports

    * Clean up imports in OobeShellPage

    * Move OSVersionHelper from Common.UI up into ManagedCommon

    * [QuickAccent]Fix unstable language loading (#36721)

    * [Peek]Bring into foreground if previously minimized (#36506)

    Added Activate() to bring Peek.UI window into focus upon Toggle. This allows the UI to be presented even if it was previously minimized.

    * Update Run docs README (#36857)

    * Update Run docs README

    * Remove System dupe

    * [Monaco]Make minimap toggleable (#33742)

    * [Monaco]Fix Json format preview setting (#36867)

    * [KBM]Added option for exact match shortcut (#36000)

    * Added option for exact match shortcut

    * Fix spell-check

    * [Deps][Security]Update .NET Packages from 9.0.0 to 9.0.1  (#36879)

    * [Deps] Update NuGet packages to version 9.0.1

    Updated several NuGet packages from version 9.0.0 to 9.0.1, including:
    - Microsoft.Data.Sqlite
    - Microsoft.Bcl.AsyncInterfaces
    - Microsoft.Extensions.DependencyInjection
    - Microsoft.Extensions.Logging
    - Microsoft.Extensions.Logging.Abstractions
    - Microsoft.Extensions.Hosting
    - Microsoft.Extensions.Hosting.WindowsServices
    - Microsoft.Win32.SystemEvents
    - Microsoft.Windows.Compatibility
    - System.CodeDom
    - System.ComponentModel.Composition
    - System.Configuration.ConfigurationManager
    - System.Data.OleDb
    - System.Diagnostics.EventLog
    - System.Diagnostics.PerformanceCounter
    - System.Drawing.Common
    - System.Management
    - System.Runtime.Caching
    - System.ServiceProcess.ServiceController
    - System.Text.Encoding.CodePages
    - System.Text.Json

    * [Deps] Update NOTICE.md

    * [Peek]Fix using the correct Monaco assets at runtime (#36890)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area (#36769)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area

    * Update src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    ---------

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    * [Workspaces] Saving app properties on launch and recapture (#36751)

    * [Workspaces] Implementing set and get GUID to/from HWND to distinguish windows moved by the Workspaces tool

    * After launch and capture copy the CLI args from the "original" project

    * Fix getting GUID

    * spell check

    * modification to be able to handle different data sizes on different systems

    * code optimisation

    * Replacing string parameter by InvokePoint

    * renaming variable

    * [AdvancedPaste]Use background thread for interactions between runner and Advanced Paste (#36858)

    * [Advanced Paste] Use background thread for runner-Advanced Paste interaction

    * Fixed typo

    * [VCM]Deprecate the Video Conference Mute utility (#36772)

    * Remove all VideoConferenceMute related code and files

    * Clean up vcm driver registry keys

    * Also remove the Webcam report tool

    * Also clean out video conference on the installer

    * Fix spellcheck

    * Remove comment about video conf

    * Update gpo files revision

    * Revert removing the VCM policies

    * Deprecate VCM GPO policy

    * Change deprecation message to show first supported version

    * Tweak supported strings in the adml

    * Goodbye friends, you are forever part of the team (#36905)

    * Goodbye friends

    Forever part of the team 😢

    * Update COMMUNITY.md

    * Fix formatting issues in COMMUNITY.md

    * [New utility]Sysinternals ZoomIt (#35880)

    * ZoomIt initial code dump

    * Change vcxproj to normalize dependency versions

    * Fix code quality to build

    * Add to PowerToys solution

    * Clean out C-style casts

    * Fix some more analyzer errors

    * Constexpr a function

    * Disable some warnings locally that it seemed better not to touch

    * Add ZoomIt module interface

    * Add GPO

    * Add Settings page with Enable button

    * Output as PowerToys.ZoomIt.exe

    * Extract ZoomIt Settings definition to its own header

    * Make ZoomItModuleInterface build with ZoomItSettings too

    * WinRT C++ interop for ZoomItSettings

    * From Registry To PowerToys Json

    * Properly fix const_cast analyzer error

    * Initial Settings page loading from registry

    * Zoom mode settings

    * Save settings

    * Add file picker and DemoType file support

    * Remaining DemoType settings

    * Have ZoomIt properly reloading Settings and exiting

    * Remove context menu entries for Options and Exit

    * ZoomIt simple Break Options

    * Break advanced options

    * Simple Record settings

    * Record Microphone setting

    * Fix break background file picker title

    * Font setting

    * Fix build issues after merge

    * Add ZoomIt conflict warning to Settings

    * Exclude Eula from spell checking

    * Fix spellcheck errors

    * Fix spell check for accelerated menu items

    * Remove cursor files from spellcheck. They're binary

    * Fix forbidden patterns

    * Fix XAML style

    * Fix C# analyzers

    * Fix signing

    * Also sign module interface dll

    * Use actual ZoomIt icon

    * Add OOBE page for ZoomIt

    * ZoomIt image for Settings

    * Flyout and Dashboard entries

    * Fix type speed slider labels

    * Correctly load default Font

    * Correctly register shortcuts on ZoomIt startup first run

    * Fix modifier keys not changing until restart

    * Show MsgBox on taken shortcut

    * Start PowerToys Settings

    * Normalize ZoomIt file properties with rest of PowerToys

    * Add attribution

    * Add ZoomIt team to Community.md

    * More copyright adjustments

    * Fix spellcheck

    * Fix MsgBox simultaneous instance to the front

    * Add mention of capturevideosample code use

    * Add ZoomIt to process lists

    * Add telemetry

    * Add logging

    * React to gpo

    * Normalize code to space identation

    * Fix installer build

    * Localize percent setting

    * Fix XAML styling

    * Update src/settings-ui/Settings.UI/Strings/en-us/Resources.resw

    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * Fix spellcheck

    * One more spellcheck fix

    * Integrate LiveDraw feature changes from upstream

    * Fix name reuse in same scope

    * Fix c-style casts

    * Also register LIVEDRAW_HOTKEY

    * Fix newLiveZoomToggleKey

    * Update LiveZoom description in Settings to take LiveDraw into account

    * Fix spellcheck

    * Fix more spellcheck

    * Fix Sysinternals capitalization

    * Fix ARM64 Debug build

    * Support Sysinternals build (#36873)

    * Remove unneeded files

    * Make build compatible with Sysinternals

    * Separate PowerToys ZoomIt product name (#36887)

    * Separate PowerToys ZoomIt product name

    To help maintain the Sysinternals branding in the standalone version.

    * Clarify branding-related includes

    * Remove ZoomIt.sln

    * Add foxmsft to spell-check names

    * Add ZoomIt to README

    * Add ZoomIt to GH templates

    * Add ZoomIt events to DATA_AND_PRIVACY.md

    * Remove publish_config.json

    * Remove publish_config.json from vcxproj too

    ---------

    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * [PTRun]Add hotkey to the show telemetry event (#36869)

    * [PTRun]Update the code for .NET 9.0.1 - remove workarounds (#36909)

    * Revove some unneeded changes after pdating to .net9.1

    * [RegistryPreview]Copy context menu, data tooltip, MULTI_SZ fix (#36631)

    * add context menus

    * string resources for contextmenu

    * fix line break parsing for MULTI_SZ

    * better presentation of multiline values and value tooltip

    * cleanup

    * [MWB] - refactoring "Common" classes - Common.Log.cs, Common.Receiver.cs (#35726)

    * [PTRun]Add setting for different trigonometric units in Calculator (#36717)

    * Added angle units to PowerToys Run Calculator plugin.

    * Update Resources.resx

    * Added GitHub SpellCheck rule for 'gradians'.

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [ci]Remove steps to build abstracted utilities packages (#36934)

    * [Settings]Update GPO infobar icon, improve some pages and fix bugs (#33703)

    * changes part 1

    * fix xaml code

    * changes part 2

    * fix cmdNotFound page

    * Update PowerOcrPage

    * More Pages changed

    * More Pages changed

    * revert temporary change

    * fix spelling

    * add resw comment

    * add resw comment

    * Update MouseWihtoutBorderPage.xaml

    * PowerPreview page

    * workspaces page

    * fix awake page gpo handling

    * NewPlus page

    * update new+ page!

    * AdvancedPaste.xaml: Move Info bar.

    * Update MouseJumpPanel.xaml

    * Update GeneralPage.xaml

    * fix position of info bar and some ui quirks

    * fix xaml style

    * fix string resources

    * string changes

    * prepare megre main

    * update new+ page

    * zoomit page

    * various fixes

    * [Common]NotificationUtil helper class with FileWatcher (#36720)

    * add NotificationUtil helper with file watcher and cache

    * fix spellcheck

    * indentation

    * [PTRun][Docs]Add YubicoOauthOTP to Third-Party plugins (#36761)

    * [PTRun]Fixed typo in Value Generator messages (#36951)

    * [AOT] Clean up some AOT issues in Advanced Paste module (#36297)

    * Clean up the aot build issue.

    * Merge main and clean up new AOT build issue

    * Update LogEvent define.

    * Update src/modules/AdvancedPaste/AdvancedPaste/Helpers/LogEvent.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * update typo bug

    * Remove unused allow list item

    * Create a new folder to place source generation context

    * Merge main and rename LogEvent to AIServiceFormatEvent

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * [ZoomIt]React to gpo setting when run as standalone (#36975)

    * [Settings]ImageResizer settings accessibility updates, fixes and refactor (#36903)

    * Fix issue with missing Image Resizer unit and fit information in settings description.

    * Fix accessibility issues on Edit and Remove buttons. Fix various issues and refactor view model and ImageSize. New resources for accessibility text formats.

    * Fix unit test because of change to new preset width and height. Fix 2 unit tests having incorrect expected/actual orderings.

    * Post-review update: accessibility strings now formatted within the converter, instead of via format strings; simplified encoder GUID collection declaration and retrieval.

    * Minor example text fix.

    * [Settings]Update "Back up" mentions when it should be used as a verb (#36965)

    * Update Back up name

    * Rename Backup to Back up

    * [New+]Update last modified date to now for all templates created (#36133)

    * Update last modified date to now for all templates created

    * Now also set last update for directories. Thank you htcfreek!

    * [ImageResizer][ci]Fix XAML style errors (#37009)

    * [Settings] Add "new" labels to navigation for new utilities (#36939)

    * initial implementation

    * move new label to zoomit

    * cleanup

    * more cleanup

    * fix XAML formatting

    * update padding to 4px

    * add badge to dashboard item

    * fix XAML formatting

    * Tweaking UX

    ---------

    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [MWB]Fix helper process termination issue in service mode (#36892)

    * [MWB] Changed to suppress the flow of the execution context

    * Fix build after merge

    * [MWB] Fix helper process termination issue in service mode

    * Add some comments

    * [runner]Fix crashes caused by wrong setting AllowDataDiagnostics registry value (#37015)

    * Fix setting registry value

    * Prevent future similar crashes

    * [PTRun][Calculator]Error check when loading trigonometry mode (#37033)

    * [ZoomIt]Fix transparent draw after changing another setting (#37042)

    * [Settings]Fix ZoomIt page changing current directory (#37052)

    * [ci]Remove vc tools version workaround (#37098)

    * 0.88 changelog (#37056)

    * 0.88 changelog

    * Update README.md

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * Add installer hashes

    * Fix aka.ms link for ZoomIt

    * Add mention to the PTRun plugin's dll file version

    * Update README.md

    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>

    * Update README.md - update What's Planned to 0.89 (#37157)

    Update README.md

    Just a tiny update, as reference to 0.88 was missed.

    * [ci]Proper workaround for the vc tools version check (#37130)

    * Revert "[ci]Remove vc tools version workaround (#37098)"

    This reverts commit 2c069ce708.

    * Adopt the same workaround as in Terminal

    * build: add a couple more signing variables to ESRP (#37328)

    This is in support of some identity changes we need to make.

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com>
    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>
    Co-authored-by: Ionuț Manța <ionut@janeasystems.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>
    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>
    Co-authored-by: PesBandi <127593627+PesBandi@users.noreply.github.com>
    Co-authored-by: Wenjian Chern <55335597+Sophanatprime@users.noreply.github.com>
    Co-authored-by: Youssef Victor <youssefvictor00@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
    Co-authored-by: leileizhang <leilzh@microsoft.com>
    Co-authored-by: Den Delimarsky 🔐 <sign@den.dev>
    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>
    Co-authored-by: Shuai Yuan <128874481+shuaiyuanxx@users.noreply.github.com>
    Co-authored-by: moooyo <42196638+moooyo@users.noreply.github.com>
    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jerry Xu <n.xu@outlook.com>
    Co-authored-by: Demitrius Nelon <denelon@microsoft.com>
    Co-authored-by: Kai Tao <69313318+vanzue@users.noreply.github.com>
    Co-authored-by: Connor Plante <150482134+plante-msft@users.noreply.github.com>
    Co-authored-by: Connor Plante <connor.plante@gmail.com>
    Co-authored-by: Domen Soklič <soklicd@gmail.com>
    Co-authored-by: Hao Liu <liuhaobupt@163.com>
    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: immi <iafullprogrammer@gmail.com>
    Co-authored-by: Asif Islam <77113884+asif4318@users.noreply.github.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>
    Co-authored-by: Dave Rayment <dave.rayment@gmail.com>
    Co-authored-by: Neil McAlister <pingzing@users.noreply.github.com>
    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Michael Clayton <mike@kingslandconsulting.co.uk>
    Co-authored-by: Nathan Gill <nathan.j.gill@outlook.com>
    Co-authored-by: Daniel Nilsson <daniel.nilsson1989@gmail.com>
    Co-authored-by: JackStuart <jack@jstuart.io>
    Co-authored-by: Christian Gaarden Gaardmark <cgaarden@hotmail.com>
    Co-authored-by: YDKK <YDKK@users.noreply.github.com>
    Co-authored-by: Dustin L. Howett <duhowett@microsoft.com>

commit 2f3efa3e46
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 6 05:39:57 2025 -0600

    Change the default hotkey to Win+alt+space (#405)

    Title

    This is just a much simpler keybind. It harkens the mind to `alt+space`, without actually stealing that keybinding.

    I recommend `ctrl+alt+space` for the dev version (though, I'm not setting that for you)

commit 96404f02b2
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Feb 6 05:39:38 2025 -0600

    Pilfer `TypedEventHandlerExtensions` from WCT (#404)

    I think this pilfers the `InvokeAsync` as mentioned in #333

    WE can't use the actual version for the same reason we can't use that one TryEnqueue extension - the WCT MD Text block we're on uses a different version of the WCT than the latest version, so the two get confused.

    We can remove this pilfered copy after either #245 or #219

    Closes #333

commit da40c449bd
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 5 10:11:50 2025 -0600

    Separate out the nuget, CmdPal, and PT versions (#406)

    Fixes #345

    This adds a pair of variables to allow us to set the CmdPal version separately from the PT version.

    Also fixes up some naming of the nuget package

commit b9322373b6
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Feb 5 17:03:12 2025 +0100

    Merge upstream PT #10 (#402)

    * [Workspaces] implement the move feature (#35480)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * fix Move attribute after launch and snapshot

    * Extend WindowArranger with PWA functionality to detect different PWA apps. PwaHelper moved to the common library

    * fix repeat counter in the editor

    * Code optimization

    * code cleanup, optimization

    * fix double-processing window

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * [KeyboardManager]Fix mapping shift to numpad (#35890)

    * Keyboard Manger fix numpad as shift

    Fixed shift not being released if a numpad key as shift.

    * Added comments

    * Fix typo

    * Fix the numpad unlocked key not working if the locked version is overridden by shift

    * Fix spelling check.

    * Revert the VK_CLEAR change.

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [Analyzers] Update .editorconfig with rules to relax IDE errors (#36095)

    * [Analyzers] Remove duplicate pascal case style from .editorconfig

    * [Analyzers] Configured severity for individual IDE and CA rules showing as errors in VS

    Set severity for IDE0005, IDE0008, IDE0016, IDE0018, IDE0019, IDE0021, IDE0022, IDE0023, IDE0025, IDE0027, IDE0028, IDE0029, IDE0031, IDE0032, IDE0034, IDE0036, IDE0039, IDE0042, IDE0044, IDE0045, IDE0046, IDE0047, IDE0057, IDE0051, IDE0052, IDE0054, IDE0055, IDE0056, IDE0057, IDE0059, IDE0060, IDE0061, IDE0063, IDE0071, IDE0073, IDE0074, IDE0075, IDE0077, IDE0078, IDE0083, IDE0090, IDE0100, IDE0130, IDE160, IDE180, IDE0200, IDE0240, IDE0250, IDE0251, IDE0260, IDE0270, IDE0290, IDE0300, IDE0301, IDE0305, IDE1005, IDE1006, CA1859, CA2022, CA2263

    * [Analyzers] Fix mismatched analyzer descriptions

    * [Analyzers] Fix misspelling

    * Update .editorconfig

    Made the following style rules `silent` instead of `suggestion`:
    - Use explicit type instead of 'var'
    - Use expression body for ...
    - Use block-scoped namespace

    * [Analyzers] Set IDE0290 to silent

    * [Analyzers] Remove IDE1006 configuration from .editorconfig in favor of making exclusions for the few entries

    * [Analyzers][Indexer] Add IDE1006 suppressions

    * [Analyzers][Peek] Add IDE1006 suppression

    * [Analyzers][MWB] Add IDE1006 suppression.

    * [Analyzers][Plugins] Add IDE1006 suppression

    * [Analyzers][ImageResizer] Suppress IDE0073 to retain original copyright

    * [Analyzers] Remove IDE0073 severity change in .editorconfig

    ---------

    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>

    * [Workspaces] PWA follow-up (#36217)

    * [PTRun][Calculator]Allow scientific notation with lowercase 'e' (#36187)

    * [Workspaces] Add encoder parameter to bitmap.save() (#36228)

    * [Workspaces] Add encoder parameter to bitmap.save()

    * 1 more call fixed

    * Move repeated code to the csharp library

    * [Workspaces] Implement store of app window's size and position (#36086)

    * [Workspaces] Implement store of app window's size and position

    * Modifying the default values to -1. The program will use the original default values for the first run.

    * [ScreenRuler]Add setting to show the measurement in an extra unit (#35887)

    * display ruler: supporting millimeter and other units

    * Measurement Tool: UI Setting for an extra unit

    * Update images

    * spelling

    * spelling

    * suit code style

    * Fix for code review

    * remove weird file

    * rename field

    * [Deps]Update MSTest from 3.5.0 to 3.6.3 (#36115)

    * Update MSTest from 3.5.0 to 3.6.3

    * Use STA attributes that are now part of MSTest

    * Adding Jerry to community.md (#36232)

    Update COMMUNITY.md

    * [Workspaces] Arranger: smart timer (#36096)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] Arranger: Reset wait timer after each successful arrange action

    * fix merge error

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Upgrade to check-spelling v0.0.24 (#36235)

    This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24).

    A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur.

    There's a new accessibility forbidden pattern:

    > Do not use `(click) here` links
    > For more information, see:
    > * https://www.w3.org/QA/Tips/noClickHere
    > * https://webaim.org/techniques/hypertext/link_text
    > * https://granicus.com/blog/why-click-here-links-are-bad/
    > * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
    ```pl
    (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\()
    ```

    There are some minor bugs that I'm aware of and which I've fixed since this release, but I don't expect to make another release this month.

    I've added a pair of patterns for includes and pragmas. My argument is that the **compiler** will _generally_ tell you if you've misspelled an include and the **linker** will _generally_ tell you if you misspell a lib.

    - There's a caveat here: If your include case-insensitively matches the referenced file (but doesn't properly match it), then unless you either use a case-sensitive file system (as opposed to case-preserving) or beg clang to warn, you won't notice when you make this specific mistake -- this matters in that a couple of Windows headers (e.g. Unknwn.h) have particular case and repositories don't tend to consistently/properly write them.

    * Adjust to community.md, shifting jerry's github user name (#36242)

    Update COMMUNITY.md

    * [AOT compatible] Resolve AOT Build Error in Peek.UI (#36194)

    * add partial for aot support

    * add Microsoft.NET.ILLink.Tasks to packages.props

    * format

    * Revert "format"

    This reverts commit 742d5e2214.

    * add Microsoft.NET.ILLink.Tasks to notice.md

    * add auto reference

    * update script to remove the 'Auto-reference line'

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Awake Updates - `TILLSON_11272024` (#36049)

    * Update with bug fixes for tray icon and support for parent process

    * Process information enum

    * Update the docs

    * Fix spelling

    * Make sure that PID is used in PT config flow

    * Logic for checks based on #34148

    * Update with link to PR

    * Fixes #34717

    * Small cleanup

    * Proper task segmentation in a function

    * Cleanup the code

    * Fix synchronization context issue

    * Update planning doc

    * Test disabling caching to see if that manages to pass CI

    * Cleanup to make sure that we're logging things properly.

    * Update ci.yml

    * Disable cache to pass CI

    * Retry logic

    * Cleanup

    * Code cleanup

    * Fixes #35848

    * Update notes and codename

    * After third attempt, log error instead of throwing exception

    * More cleanup to avoid double execution

    * Add expected word

    * Safeguards for bad values for timed keep-awake

    * More updates to make sure I am using uint

    * Update error message

    * Update packages

    * Fix notice and revert CsWinRT upgrade

    * Codename update

    * Update expect.txt

    * Update the struct

    * Ensuring we're properly awaiting tray initialization

    * Update to make sure tray reflects the bound process

    * Cleanup, proper JSON serialization for logs.

    * Not needed.

    * Add command validation logic

    * Moving the initialization logic earlier

    * Make sure we show the display state in the tooltip

    * Update tray string

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update logic for icon resets

    * Update doc

    * Simplify function for setting mode shell icon

    * Issues should be properly linked

    * Minor cleanup

    * Update timed behavior

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Workspaces] detecting right app version (#36100)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] fix detection of specific version of apps

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Move the XamlStyler config to src/ (#36202)

    my never ending goal to minimize files in the root dir

    * [AdvancedPaste]Add Semantic Kernel opt-in to allow chaining of paste actions (#35902)

    * [AdvancedPaste] Semantic Kernel support

    * Changed log-line with potentially sensitive info

    * Spellcheck issues

    * Various improvements for Semantic Kernel

    * Spellcheck issue

    * Refactored Clipboard routines

    * Added integration tests for KernelService

    * Extra telemetry for AdvancedPaste

    * Added 'Hotkey' suffix to AdvancedPaste_Settings telemetry event

    * Added IsSavedQuery

    * Added KernelQueryCache

    * Refactoring

    * Added KernelQueryCache to BugReportTool delete list

    * Added opt-n for Semantic Kernel

    * Fixed bug with KernelQueryCache

    * Ability to view last AI chat message on error

    * Improved kernel query cache

    * Used System.IO.Abstractions and improved tests

    * Fixed under-count of token usage

    * Used Semantic Kernel icon

    * Cleanup

    * Add missing EndProject line

    * Fix dependency version conflicts

    * Fix NOTICE.md

    * Correct place of SemanticKernel in NOTICE.md

    * Unlinked CustomPreview toggle from AI

    * Added Microsoft.Bcl.AsyncInterfaces dependency to AdvancedPaste

    * Fixed NOTICE.md order

    * Moved Custom Preview to behaviour section

    * Made Image to Text raise error on empty output

    * Added AIServiceBatchIntegrationTests

    * Updated AIServiceBatchIntegrationTests

    * Added prompt moderation

    * Moved GPO Infobar to better location

    * [Launcher]Port from WPF-UI to .NET 9 WPF (#36215)

    * Initial implementation

    * Fix fluent style

    * Fix no endline

    * Update expect.txt

    * Fix formatting

    * Fix light theme looking bad on Windows 10

    * fix formatting

    * test change

    * Now really fixed W10

    * Add a comment

    * Fix typos

    * Fix spellcheck errors

    * Fix spellcheck pattern for websites

    * Change patterns for spellcheck in the right file

    * Fix XAML styling

    * Fix contrast colors on W11

    * Fix formatting

    * Removed emty line

    * Fix formatting

    * Added comment to fluentHC file

    * fix comment

    * Fix Windows10 again.
    Adress feedback.

    * W11 fix chaning from high contrast to normal not having correct background

    * W10 Fix high contrast not working after switching from light/dark moed

    * Address feedback

    * Fix formatting

    * Second W11 fix chaning from high contrast to normal not having correct background

    * [UX]Updating New+ and Settings icons (#36290)

    * Updated icons

    * Updating more icons and icos

    * [Settings][Dashboard] Accessibility fixes (#36280)

    * make narrator announce buttons/toggles

    * add toggles module name

    * [ci]Sign OpenAI dll that's not signed (#36299)

    * Update CODEOWNERS to include gordon, jerry and kayla (#36308)

    * Update CODEOWNERS

    * Update names.txt

    * Making the powertoys-code-owners team code owners (#36310)

    * Update CODEOWNERS

    * Update names.txt

    * Update CODEOWNERS

    * [FZEditor]Fix Create new layout dialog radio buttons IsChecked values  (#36320)

    * 0.87 changelog (#36335)

    * 0.87 changelog

    * Fix spellcheck

    * Update README.md

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [PTRun]Fix WPF transparent border issue on Windows 10 (#36392)

    * Added border on W10

    * Added a comment

    ---------
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>

    * [PTRun]Fix .NET 9 crash in OneNote (#36417)

    * Fix crash in OneNote Run

    * added better comment

    * [AdvancedPaste]Fix NullReferenceException on Dispose (#36428)

    [AdvancedPaste] Fixed NullReferenceException on Dispose

    * [Fuzz] Add fuzz testing for AdvancedPaste and new pipeline for onboarding OneFuzz (#36329)

    * add fuzz

    * install .net8

    * add spelling check

    * refine the pipeline

    * add readme and update the test code

    * fix spelling error

    * change to weekly run

    * Add New CI Pipeline for Latest WindowsAppSDK (#36282)

    This PR introduces the following changes to the CI pipeline and version management:

    Pipeline Enhancements:
    1. Added a new script UpdateVersions.ps1 to automate the update of Microsoft.WindowsAppSDK versions across various project files.
    2. Introduced a new pipeline configuration ci-using-the-latest-winappsdk.yml to build using the latest Microsoft.WindowsAppSDK.
    3. Updated existing pipeline configurations to support the new useLatestWinAppSDK parameter.

    Pipeline Configuration Updates:
    1. Updated job-build-project.yml to handle the useLatestWinAppSDK parameter and adjust the RestoreAdditionalProjectSourcesArg accordingly.
    2. Added a new template steps-update-winappsdk-and-restore-nuget.yml for updating and restoring NuGet packages with the latest Microsoft.WindowsAppSDK.
    3. Added WinAPPSDK version selection, the pipeline can be manually triggered to use the specified version.

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [AOT compatible] Make HostsUILib become AOT compatible (#36136)

    * Remove AOT configuration

    * Refer to AOT compatibility props

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [AOT compatible] Clean up some AOT build issue in FilePreviewCommon and MarkdownPreviewHandler (#36207)

    * Use AppContext.BaseDirectory to replace assembly.GetExeAseembly.Location.
    Fix json serilizer aot issue.

    * clean up some AOT build issue

    * Update src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandlerControl.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Update src/common/FilePreviewCommon/Formatters/JsonFormatter.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Add new pipeline using the latest webview2 from Edge Canary (#36317)

    * using the latest webview2 for testing

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Bug fix] Making the OpenAI key configuration page scrollable. (#36359)

    * Fixed #34470

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>

    * [Bug fix] Add a format validation step before format conversion. (#36404)

    This PR aims to fix the bug #35225 by introducing a new method IsJson to determine if a given text is in JSON format.
    The IsJson method is then utilized in the ToJsonFromXmlOrCsvAsync method to optimize the processing logic.
    If the text is already in JSON format, it is returned directly without further conversion from XML or CSV.

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * Add more STCA team members (#36438)

    * Add more STCA team members

    * Include more spelling check errors

    * Remove non-alpha in dictionary

    * Add Zhaopeng Wang

    * Fix spell checking error

    * Remove "prerelease: true" (#36484)

    * Remove "prerelease: true"

    The Microsoft.WinGet.DSC module is GA so prerelease: true is no longer needed.

    * Update expect.txt

    fixing spellcheck warning

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Docs]Update README for 0.87.1 release (#36534)

    * [CI] Enhance build Pipeline Reliability with Retry Logic and Improved Error Messaging (#36529)

    * update pipeline with retry

    * remove tests

    * Add team member (#36590)

    * [New+]Don't override New actions from Explorer on Windows 10 (#36467)

    * [New+]Don't override New actions from Explorer

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Add pattern for learn.microsoft links

    * Also only Query for context menu

    * [PTRun][Calculator]Handle hexadecimal numbers to not return divide by 0 error (#36390)

    * add '0x' handling for divide by 0 scenarios

    * fix comment on division by 0 check

    ---------

    Co-authored-by: Connor Plante <connor.plante@gmail.com>

    * [TextExtractor]Minor UI/Accessibility fixes in the overlay UI (#36356)

    minor UI and accessibility fixes

    * [PTRun][Calculator]Update mages to v3.0.0 and support for `randi(n)` (#36560)

    * update to mages 3.0.0

    * allow randi() in calculator plugin

    * fix tests and input validation

    * fix spell check

    * [QuickAccent]Added ć for Slovenian (#36336) (#36338)

    * Fix snapping Workspaces Editor to Fancy Zones (#36463)

    * Remove Workspaces Editor from Fancy Zone's excluded app list

    * removed unused string

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>

    * [PTRun]Fix drag on .NET 9 WPF (#36635)

    * [CQ]Continued to move stuff out of root - Solution.props (#36244)

    * [QuickAccent]Add Proto-Indo-European (#36408)

    * Add ḱ to PowerAccent for Proto-Indo-European

    * Fix Spelling Check

    * Add more letters to PIE

    * Order PIE after PI

    ---------

    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [PTRun]Add context buttons for VSCodeWorkspaces plugin (#36517)

    * [Settings][QuickAccent]Change 'character set' to plural form (#36565)

    * [PTRun][Calculator]Fix unit tests on non-english systems (#36569)

    * fix tests

    * update comment

    * [PTRun][Calc]Improve handling of non-base 10 numbers (#36700)

    * [Settings][PTRun]Show plugin version and website (#36580)

    * [Monaco]Add support for .resx and .resw preview support. (#36499)

    Added support for .resx and .resw preview support. These files are XML based files so I added the file extensions as part of the registerAdditionalLanguage("xmlExt"...) function.

    * [Settings] Add Workspaces' workspaces.json file to backup/restore list (#36714)

    * [Localization] Fix loc pipeline to send downloaded localized files to TDBuild upon retry after failure (#36766)

    * [AdvancedPaste]Fixed issues with Screen Reader integration (#36778)

    * Remove Advent calendar from README (#36777)

    * Remove Advent calendar from README

    * Update hero image

    * Delete doc/images/overview/PT_holiday_hero_image.png

    * [AdvancedPaste]Add all BitmapDecoder supported image filetypes to ImageToText (#35600)

    Adds support to ImageToText for all image filetypes supported by BitmapDecoder.

    * [AOT]Clean up some AOT build issues in PowerAccent.Core (#36264)

    * init

    * Use AotCompatibility instead

    * Replace typeof(Lanaguge) with GetValues<Language>

    * Create new folder to place source generation context file.

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [WinUI3]Fix Windows 10 title bar borders (#36429)

    * Fix borders for windows in the Settings UI

    * Fix HOSTS window

    * Fix Advanced Paste

    * Fix Environment Variables

    * Fix File Locksmith

    * Fix Peek, with a caveat

    * Fix Registry Preview

    * Remove unused imports

    * Clean up imports in OobeShellPage

    * Move OSVersionHelper from Common.UI up into ManagedCommon

    * [QuickAccent]Fix unstable language loading (#36721)

    * [Peek]Bring into foreground if previously minimized (#36506)

    Added Activate() to bring Peek.UI window into focus upon Toggle. This allows the UI to be presented even if it was previously minimized.

    * Update Run docs README (#36857)

    * Update Run docs README

    * Remove System dupe

    * [Monaco]Make minimap toggleable (#33742)

    * [Monaco]Fix Json format preview setting (#36867)

    * [KBM]Added option for exact match shortcut (#36000)

    * Added option for exact match shortcut

    * Fix spell-check

    * [Deps][Security]Update .NET Packages from 9.0.0 to 9.0.1  (#36879)

    * [Deps] Update NuGet packages to version 9.0.1

    Updated several NuGet packages from version 9.0.0 to 9.0.1, including:
    - Microsoft.Data.Sqlite
    - Microsoft.Bcl.AsyncInterfaces
    - Microsoft.Extensions.DependencyInjection
    - Microsoft.Extensions.Logging
    - Microsoft.Extensions.Logging.Abstractions
    - Microsoft.Extensions.Hosting
    - Microsoft.Extensions.Hosting.WindowsServices
    - Microsoft.Win32.SystemEvents
    - Microsoft.Windows.Compatibility
    - System.CodeDom
    - System.ComponentModel.Composition
    - System.Configuration.ConfigurationManager
    - System.Data.OleDb
    - System.Diagnostics.EventLog
    - System.Diagnostics.PerformanceCounter
    - System.Drawing.Common
    - System.Management
    - System.Runtime.Caching
    - System.ServiceProcess.ServiceController
    - System.Text.Encoding.CodePages
    - System.Text.Json

    * [Deps] Update NOTICE.md

    * [Peek]Fix using the correct Monaco assets at runtime (#36890)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area (#36769)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area

    * Update src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    ---------

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    * [Workspaces] Saving app properties on launch and recapture (#36751)

    * [Workspaces] Implementing set and get GUID to/from HWND to distinguish windows moved by the Workspaces tool

    * After launch and capture copy the CLI args from the "original" project

    * Fix getting GUID

    * spell check

    * modification to be able to handle different data sizes on different systems

    * code optimisation

    * Replacing string parameter by InvokePoint

    * renaming variable

    * [AdvancedPaste]Use background thread for interactions between runner and Advanced Paste (#36858)

    * [Advanced Paste] Use background thread for runner-Advanced Paste interaction

    * Fixed typo

    * [VCM]Deprecate the Video Conference Mute utility (#36772)

    * Remove all VideoConferenceMute related code and files

    * Clean up vcm driver registry keys

    * Also remove the Webcam report tool

    * Also clean out video conference on the installer

    * Fix spellcheck

    * Remove comment about video conf

    * Update gpo files revision

    * Revert removing the VCM policies

    * Deprecate VCM GPO policy

    * Change deprecation message to show first supported version

    * Tweak supported strings in the adml

    * Goodbye friends, you are forever part of the team (#36905)

    * Goodbye friends

    Forever part of the team 😢

    * Update COMMUNITY.md

    * Fix formatting issues in COMMUNITY.md

    * [New utility]Sysinternals ZoomIt (#35880)

    * ZoomIt initial code dump

    * Change vcxproj to normalize dependency versions

    * Fix code quality to build

    * Add to PowerToys solution

    * Clean out C-style casts

    * Fix some more analyzer errors

    * Constexpr a function

    * Disable some warnings locally that it seemed better not to touch

    * Add ZoomIt module interface

    * Add GPO

    * Add Settings page with Enable button

    * Output as PowerToys.ZoomIt.exe

    * Extract ZoomIt Settings definition to its own header

    * Make ZoomItModuleInterface build with ZoomItSettings too

    * WinRT C++ interop for ZoomItSettings

    * From Registry To PowerToys Json

    * Properly fix const_cast analyzer error

    * Initial Settings page loading from registry

    * Zoom mode settings

    * Save settings

    * Add file picker and DemoType file support

    * Remaining DemoType settings

    * Have ZoomIt properly reloading Settings and exiting

    * Remove context menu entries for Options and Exit

    * ZoomIt simple Break Options

    * Break advanced options

    * Simple Record settings

    * Record Microphone setting

    * Fix break background file picker title

    * Font setting

    * Fix build issues after merge

    * Add ZoomIt conflict warning to Settings

    * Exclude Eula from spell checking

    * Fix spellcheck errors

    * Fix spell check for accelerated menu items

    * Remove cursor files from spellcheck. They're binary

    * Fix forbidden patterns

    * Fix XAML style

    * Fix C# analyzers

    * Fix signing

    * Also sign module interface dll

    * Use actual ZoomIt icon

    * Add OOBE page for ZoomIt

    * ZoomIt image for Settings

    * Flyout and Dashboard entries

    * Fix type speed slider labels

    * Correctly load default Font

    * Correctly register shortcuts on ZoomIt startup first run

    * Fix modifier keys not changing until restart

    * Show MsgBox on taken shortcut

    * Start PowerToys Settings

    * Normalize ZoomIt file properties with rest of PowerToys

    * Add attribution

    * Add ZoomIt team to Community.md

    * More copyright adjustments

    * Fix spellcheck

    * Fix MsgBox simultaneous instance to the front

    * Add mention of capturevideosample code use

    * Add ZoomIt to process lists

    * Add telemetry

    * Add logging

    * React to gpo

    * Normalize code to space identation

    * Fix installer build

    * Localize percent setting

    * Fix XAML styling

    * Update src/settings-ui/Settings.UI/Strings/en-us/Resources.resw

    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * Fix spellcheck

    * One more spellcheck fix

    * Integrate LiveDraw feature changes from upstream

    * Fix name reuse in same scope

    * Fix c-style casts

    * Also register LIVEDRAW_HOTKEY

    * Fix newLiveZoomToggleKey

    * Update LiveZoom description in Settings to take LiveDraw into account

    * Fix spellcheck

    * Fix more spellcheck

    * Fix Sysinternals capitalization

    * Fix ARM64 Debug build

    * Support Sysinternals build (#36873)

    * Remove unneeded files

    * Make build compatible with Sysinternals

    * Separate PowerToys ZoomIt product name (#36887)

    * Separate PowerToys ZoomIt product name

    To help maintain the Sysinternals branding in the standalone version.

    * Clarify branding-related includes

    * Remove ZoomIt.sln

    * Add foxmsft to spell-check names

    * Add ZoomIt to README

    * Add ZoomIt to GH templates

    * Add ZoomIt events to DATA_AND_PRIVACY.md

    * Remove publish_config.json

    * Remove publish_config.json from vcxproj too

    ---------

    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * [PTRun]Add hotkey to the show telemetry event (#36869)

    * [PTRun]Update the code for .NET 9.0.1 - remove workarounds (#36909)

    * Revove some unneeded changes after pdating to .net9.1

    * [RegistryPreview]Copy context menu, data tooltip, MULTI_SZ fix (#36631)

    * add context menus

    * string resources for contextmenu

    * fix line break parsing for MULTI_SZ

    * better presentation of multiline values and value tooltip

    * cleanup

    * [MWB] - refactoring "Common" classes - Common.Log.cs, Common.Receiver.cs (#35726)

    * [PTRun]Add setting for different trigonometric units in Calculator (#36717)

    * Added angle units to PowerToys Run Calculator plugin.

    * Update Resources.resx

    * Added GitHub SpellCheck rule for 'gradians'.

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [ci]Remove steps to build abstracted utilities packages (#36934)

    * [Settings]Update GPO infobar icon, improve some pages and fix bugs (#33703)

    * changes part 1

    * fix xaml code

    * changes part 2

    * fix cmdNotFound page

    * Update PowerOcrPage

    * More Pages changed

    * More Pages changed

    * revert temporary change

    * fix spelling

    * add resw comment

    * add resw comment

    * Update MouseWihtoutBorderPage.xaml

    * PowerPreview page

    * workspaces page

    * fix awake page gpo handling

    * NewPlus page

    * update new+ page!

    * AdvancedPaste.xaml: Move Info bar.

    * Update MouseJumpPanel.xaml

    * Update GeneralPage.xaml

    * fix position of info bar and some ui quirks

    * fix xaml style

    * fix string resources

    * string changes

    * prepare megre main

    * update new+ page

    * zoomit page

    * various fixes

    * [Common]NotificationUtil helper class with FileWatcher (#36720)

    * add NotificationUtil helper with file watcher and cache

    * fix spellcheck

    * indentation

    * [PTRun][Docs]Add YubicoOauthOTP to Third-Party plugins (#36761)

    * [PTRun]Fixed typo in Value Generator messages (#36951)

    * [AOT] Clean up some AOT issues in Advanced Paste module (#36297)

    * Clean up the aot build issue.

    * Merge main and clean up new AOT build issue

    * Update LogEvent define.

    * Update src/modules/AdvancedPaste/AdvancedPaste/Helpers/LogEvent.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * update typo bug

    * Remove unused allow list item

    * Create a new folder to place source generation context

    * Merge main and rename LogEvent to AIServiceFormatEvent

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * [ZoomIt]React to gpo setting when run as standalone (#36975)

    * [Settings]ImageResizer settings accessibility updates, fixes and refactor (#36903)

    * Fix issue with missing Image Resizer unit and fit information in settings description.

    * Fix accessibility issues on Edit and Remove buttons. Fix various issues and refactor view model and ImageSize. New resources for accessibility text formats.

    * Fix unit test because of change to new preset width and height. Fix 2 unit tests having incorrect expected/actual orderings.

    * Post-review update: accessibility strings now formatted within the converter, instead of via format strings; simplified encoder GUID collection declaration and retrieval.

    * Minor example text fix.

    * [Settings]Update "Back up" mentions when it should be used as a verb (#36965)

    * Update Back up name

    * Rename Backup to Back up

    * [New+]Update last modified date to now for all templates created (#36133)

    * Update last modified date to now for all templates created

    * Now also set last update for directories. Thank you htcfreek!

    * [ImageResizer][ci]Fix XAML style errors (#37009)

    * [Settings] Add "new" labels to navigation for new utilities (#36939)

    * initial implementation

    * move new label to zoomit

    * cleanup

    * more cleanup

    * fix XAML formatting

    * update padding to 4px

    * add badge to dashboard item

    * fix XAML formatting

    * Tweaking UX

    ---------

    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [MWB]Fix helper process termination issue in service mode (#36892)

    * [MWB] Changed to suppress the flow of the execution context

    * Fix build after merge

    * [MWB] Fix helper process termination issue in service mode

    * Add some comments

    * [runner]Fix crashes caused by wrong setting AllowDataDiagnostics registry value (#37015)

    * Fix setting registry value

    * Prevent future similar crashes

    * [PTRun][Calculator]Error check when loading trigonometry mode (#37033)

    * [ZoomIt]Fix transparent draw after changing another setting (#37042)

    * [Settings]Fix ZoomIt page changing current directory (#37052)

    * [ci]Remove vc tools version workaround (#37098)

    * 0.88 changelog (#37056)

    * 0.88 changelog

    * Update README.md

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * Add installer hashes

    * Fix aka.ms link for ZoomIt

    * Add mention to the PTRun plugin's dll file version

    * Update README.md

    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>

    * Update README.md - update What's Planned to 0.89 (#37157)

    Update README.md

    Just a tiny update, as reference to 0.88 was missed.

    * [ci]Proper workaround for the vc tools version check (#37130)

    * Revert "[ci]Remove vc tools version workaround (#37098)"

    This reverts commit 2c069ce708.

    * Adopt the same workaround as in Terminal

    * Fix AOT introduced error

    * [check-spelling] Update metadata

    Update for https://github.com/zadjii-msft/PowerToys/actions/runs/13139253022/attempts/1
    Accepted in https://github.com/zadjii-msft/PowerToys/pull/402#issuecomment-2634374795

    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>

    * more

    * Skip cmdpal in deps json check

    * notice.md

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    Co-authored-by: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com>
    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>
    Co-authored-by: Ionuț Manța <ionut@janeasystems.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>
    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>
    Co-authored-by: PesBandi <127593627+PesBandi@users.noreply.github.com>
    Co-authored-by: Wenjian Chern <55335597+Sophanatprime@users.noreply.github.com>
    Co-authored-by: Youssef Victor <youssefvictor00@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
    Co-authored-by: leileizhang <leilzh@microsoft.com>
    Co-authored-by: Den Delimarsky 🔐 <sign@den.dev>
    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>
    Co-authored-by: Shuai Yuan <128874481+shuaiyuanxx@users.noreply.github.com>
    Co-authored-by: moooyo <42196638+moooyo@users.noreply.github.com>
    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jerry Xu <n.xu@outlook.com>
    Co-authored-by: Demitrius Nelon <denelon@microsoft.com>
    Co-authored-by: Kai Tao <69313318+vanzue@users.noreply.github.com>
    Co-authored-by: Connor Plante <150482134+plante-msft@users.noreply.github.com>
    Co-authored-by: Connor Plante <connor.plante@gmail.com>
    Co-authored-by: Domen Soklič <soklicd@gmail.com>
    Co-authored-by: Hao Liu <liuhaobupt@163.com>
    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: immi <iafullprogrammer@gmail.com>
    Co-authored-by: Asif Islam <77113884+asif4318@users.noreply.github.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>
    Co-authored-by: Dave Rayment <dave.rayment@gmail.com>
    Co-authored-by: Neil McAlister <pingzing@users.noreply.github.com>
    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Michael Clayton <mike@kingslandconsulting.co.uk>
    Co-authored-by: Nathan Gill <nathan.j.gill@outlook.com>
    Co-authored-by: Daniel Nilsson <daniel.nilsson1989@gmail.com>
    Co-authored-by: JackStuart <jack@jstuart.io>
    Co-authored-by: Christian Gaarden Gaardmark <cgaarden@hotmail.com>
    Co-authored-by: YDKK <YDKK@users.noreply.github.com>
    Co-authored-by: Stefan Markovic <stefansjfw@users.noreply.github.com>

commit 6856f4ef3e
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Feb 5 06:50:54 2025 -0600

    Change namespace to Microsoft.CommandPalette.Extensions (#403)

    * The package ID changed! Now we're `Microsoft.CommandPalette`. The old app will need to be uninstalled seperately.
    * interfaces moved from `Microsoft.CmdPal.Extensions` ->  `Microsoft.CommandPalette.Extensions`
    * The C# reference implementation? `Microsoft.CmdPal.Extensions.Helpers` ->  `Microsoft.CommandPalette.Extensions.Toolkit`
    * I also replaced the `IconData`, `IconInfo`, `PropChangedEventArgs`, `ItemsChangedEventArgs` `runtimeclass`es with just `interface`s. That's gonna be mildly breaking for existing code migrating.
    * I lastly changed the `<AppExtension>` tag in the Package.appxmanifest to `com.microsoft.commandpalette` (from `com.microsoft.windows.commandpalette`)

commit ce40df9665
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Feb 4 08:40:38 2025 -0600

    Remove any straggling references to "Action"s (#401)

    An earlier draft of the CmdPal codebase called the fundamental unit of doing an `Action`. We've moved away from that for a long time now.

    This just fixes all the cases I could still find.

    Closes #350

commit 06aeb227a1
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Feb 4 06:02:37 2025 -0600

    Remove the prototype (#400)

    Goodnight sweet prince

commit c9c45691a7
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Feb 4 05:44:39 2025 -0600

    Attempt to correlate apps to winget packages (#387)

    This is a first best effort at #367.

    If an app is installed, we'll try to lookup if there's one and only app with that name in our big list of apps. If there is, then we'll set the command on the winget list to the "run" command.

    The uninstall command moves into the context menu, always. Even if we don't find it. This will make it harder to accidentally uninstall things.

    This also has another drive-by fix for #357. Problem wasn't just being on the UI thread, it's that we were trying to get the `.Kind` out of the activation args, after the spawning process had already died.

commit 4b67711b70
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Feb 3 16:52:31 2025 -0600

    Add AOT support for the SDK and extensions (#394)

    Big thanks to Mano for getting this prototyped with me

    This enables the SDK helpers and extensions to be compiled as AOT code. Gotta go fast guys.

    Big changes were:
    * Adding `partial` to all the helper classes that implemented WinRT interfaces
    * Redoing a lot of JSON serialization to be AOT compatible
    * re-working the COM calls in ExtensionServer and ExtensionInstanceManager to be AOT ready

    Related to #197

commit edb61457f4
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Feb 3 16:30:46 2025 -0600

    BREAKING: Add ContentPages and Invoke(sender) (#395)

    ## BREAKING API CHANGES APPROACHING

    Closes #307
    Closes #238
    Removes `Command` from `ITag`
    Adds `IDetailsCommand` (to achieve the same goal as the above originally had)
    Adds `ITreeContent`, based on a hunch
    Adds `ShowToast` and `Confirm` to `CommandResult` too, but without UX yet

    Extensions from before this change will need to be updated.
    * The `InvokableCommand` change should be trivial - the helpers should abstract that delta away for you.
    * The `ContentPage` change should be pretty easy to make.
      * Both `MarkdownPage` and `FormPage` are now just `ContentPage`
      * `FormPage.Forms()` -> `ContentPage.GetContent()`
      * `MarkdownPage.Bodies()` -> `ContentPage.GetContent()`
      * `IForm`s become `IFormContent`. Methods become properties (not that bad)
    * I'm only deprecating the old Markdown and Form pages - I'll fully remove them before we OSS, but I'll give everyone a couple weeks to port them.
    * No one was using `Tag.Command` and it always seemed iffy at best - better not.

commit 1a623ce136
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Feb 3 13:39:42 2025 -0600

    get rid of dependency on Wox (#383)

    Closes #363

    The WebSearch plugin pulled in all of Wox.Infrastructure, which resulted in us pulling in _all of WPF_ as a dependency, which we obviously don't need.

commit e8bab4f5b2
Author: Niels Laute <niels.laute@live.nl>
Date:   Mon Feb 3 20:39:13 2025 +0100

    Various UX tweaks (#393)

    This PR introduces a couple of design tweaks:

    - Details pane padding and fontsizes/colors
    - Extension icons using Segoe Fluent Icons are not the same color as the text, helping with eye scanning
    - Updating the WinGet icon so it's now the same size as other extensions
    - The extension icon is now shown in the searchbox to help improve context switching

commit d86d318a9a
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Jan 29 19:43:44 2025 +0100

    Fix icon path (#382)

commit 41dc94aa06
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Jan 29 17:57:50 2025 +0100

    Fix bad merge (#381)

commit b7aba2661a
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Jan 29 15:54:27 2025 +0100

    Merge PT upstream #9 (#379)

    * [Workspaces] implement the move feature (#35480)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * fix Move attribute after launch and snapshot

    * Extend WindowArranger with PWA functionality to detect different PWA apps. PwaHelper moved to the common library

    * fix repeat counter in the editor

    * Code optimization

    * code cleanup, optimization

    * fix double-processing window

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * [KeyboardManager]Fix mapping shift to numpad (#35890)

    * Keyboard Manger fix numpad as shift

    Fixed shift not being released if a numpad key as shift.

    * Added comments

    * Fix typo

    * Fix the numpad unlocked key not working if the locked version is overridden by shift

    * Fix spelling check.

    * Revert the VK_CLEAR change.

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [Analyzers] Update .editorconfig with rules to relax IDE errors (#36095)

    * [Analyzers] Remove duplicate pascal case style from .editorconfig

    * [Analyzers] Configured severity for individual IDE and CA rules showing as errors in VS

    Set severity for IDE0005, IDE0008, IDE0016, IDE0018, IDE0019, IDE0021, IDE0022, IDE0023, IDE0025, IDE0027, IDE0028, IDE0029, IDE0031, IDE0032, IDE0034, IDE0036, IDE0039, IDE0042, IDE0044, IDE0045, IDE0046, IDE0047, IDE0057, IDE0051, IDE0052, IDE0054, IDE0055, IDE0056, IDE0057, IDE0059, IDE0060, IDE0061, IDE0063, IDE0071, IDE0073, IDE0074, IDE0075, IDE0077, IDE0078, IDE0083, IDE0090, IDE0100, IDE0130, IDE160, IDE180, IDE0200, IDE0240, IDE0250, IDE0251, IDE0260, IDE0270, IDE0290, IDE0300, IDE0301, IDE0305, IDE1005, IDE1006, CA1859, CA2022, CA2263

    * [Analyzers] Fix mismatched analyzer descriptions

    * [Analyzers] Fix misspelling

    * Update .editorconfig

    Made the following style rules `silent` instead of `suggestion`:
    - Use explicit type instead of 'var'
    - Use expression body for ...
    - Use block-scoped namespace

    * [Analyzers] Set IDE0290 to silent

    * [Analyzers] Remove IDE1006 configuration from .editorconfig in favor of making exclusions for the few entries

    * [Analyzers][Indexer] Add IDE1006 suppressions

    * [Analyzers][Peek] Add IDE1006 suppression

    * [Analyzers][MWB] Add IDE1006 suppression.

    * [Analyzers][Plugins] Add IDE1006 suppression

    * [Analyzers][ImageResizer] Suppress IDE0073 to retain original copyright

    * [Analyzers] Remove IDE0073 severity change in .editorconfig

    ---------

    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>

    * [Workspaces] PWA follow-up (#36217)

    * [PTRun][Calculator]Allow scientific notation with lowercase 'e' (#36187)

    * [Workspaces] Add encoder parameter to bitmap.save() (#36228)

    * [Workspaces] Add encoder parameter to bitmap.save()

    * 1 more call fixed

    * Move repeated code to the csharp library

    * [Workspaces] Implement store of app window's size and position (#36086)

    * [Workspaces] Implement store of app window's size and position

    * Modifying the default values to -1. The program will use the original default values for the first run.

    * [ScreenRuler]Add setting to show the measurement in an extra unit (#35887)

    * display ruler: supporting millimeter and other units

    * Measurement Tool: UI Setting for an extra unit

    * Update images

    * spelling

    * spelling

    * suit code style

    * Fix for code review

    * remove weird file

    * rename field

    * [Deps]Update MSTest from 3.5.0 to 3.6.3 (#36115)

    * Update MSTest from 3.5.0 to 3.6.3

    * Use STA attributes that are now part of MSTest

    * Adding Jerry to community.md (#36232)

    Update COMMUNITY.md

    * [Workspaces] Arranger: smart timer (#36096)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] Arranger: Reset wait timer after each successful arrange action

    * fix merge error

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Upgrade to check-spelling v0.0.24 (#36235)

    This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24).

    A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur.

    There's a new accessibility forbidden pattern:

    > Do not use `(click) here` links
    > For more information, see:
    > * https://www.w3.org/QA/Tips/noClickHere
    > * https://webaim.org/techniques/hypertext/link_text
    > * https://granicus.com/blog/why-click-here-links-are-bad/
    > * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
    ```pl
    (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\()
    ```

    There are some minor bugs that I'm aware of and which I've fixed since this release, but I don't expect to make another release this month.

    I've added a pair of patterns for includes and pragmas. My argument is that the **compiler** will _generally_ tell you if you've misspelled an include and the **linker** will _generally_ tell you if you misspell a lib.

    - There's a caveat here: If your include case-insensitively matches the referenced file (but doesn't properly match it), then unless you either use a case-sensitive file system (as opposed to case-preserving) or beg clang to warn, you won't notice when you make this specific mistake -- this matters in that a couple of Windows headers (e.g. Unknwn.h) have particular case and repositories don't tend to consistently/properly write them.

    * Adjust to community.md, shifting jerry's github user name (#36242)

    Update COMMUNITY.md

    * [AOT compatible] Resolve AOT Build Error in Peek.UI (#36194)

    * add partial for aot support

    * add Microsoft.NET.ILLink.Tasks to packages.props

    * format

    * Revert "format"

    This reverts commit 742d5e2214.

    * add Microsoft.NET.ILLink.Tasks to notice.md

    * add auto reference

    * update script to remove the 'Auto-reference line'

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Awake Updates - `TILLSON_11272024` (#36049)

    * Update with bug fixes for tray icon and support for parent process

    * Process information enum

    * Update the docs

    * Fix spelling

    * Make sure that PID is used in PT config flow

    * Logic for checks based on #34148

    * Update with link to PR

    * Fixes #34717

    * Small cleanup

    * Proper task segmentation in a function

    * Cleanup the code

    * Fix synchronization context issue

    * Update planning doc

    * Test disabling caching to see if that manages to pass CI

    * Cleanup to make sure that we're logging things properly.

    * Update ci.yml

    * Disable cache to pass CI

    * Retry logic

    * Cleanup

    * Code cleanup

    * Fixes #35848

    * Update notes and codename

    * After third attempt, log error instead of throwing exception

    * More cleanup to avoid double execution

    * Add expected word

    * Safeguards for bad values for timed keep-awake

    * More updates to make sure I am using uint

    * Update error message

    * Update packages

    * Fix notice and revert CsWinRT upgrade

    * Codename update

    * Update expect.txt

    * Update the struct

    * Ensuring we're properly awaiting tray initialization

    * Update to make sure tray reflects the bound process

    * Cleanup, proper JSON serialization for logs.

    * Not needed.

    * Add command validation logic

    * Moving the initialization logic earlier

    * Make sure we show the display state in the tooltip

    * Update tray string

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update logic for icon resets

    * Update doc

    * Simplify function for setting mode shell icon

    * Issues should be properly linked

    * Minor cleanup

    * Update timed behavior

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Workspaces] detecting right app version (#36100)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] fix detection of specific version of apps

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Move the XamlStyler config to src/ (#36202)

    my never ending goal to minimize files in the root dir

    * [AdvancedPaste]Add Semantic Kernel opt-in to allow chaining of paste actions (#35902)

    * [AdvancedPaste] Semantic Kernel support

    * Changed log-line with potentially sensitive info

    * Spellcheck issues

    * Various improvements for Semantic Kernel

    * Spellcheck issue

    * Refactored Clipboard routines

    * Added integration tests for KernelService

    * Extra telemetry for AdvancedPaste

    * Added 'Hotkey' suffix to AdvancedPaste_Settings telemetry event

    * Added IsSavedQuery

    * Added KernelQueryCache

    * Refactoring

    * Added KernelQueryCache to BugReportTool delete list

    * Added opt-n for Semantic Kernel

    * Fixed bug with KernelQueryCache

    * Ability to view last AI chat message on error

    * Improved kernel query cache

    * Used System.IO.Abstractions and improved tests

    * Fixed under-count of token usage

    * Used Semantic Kernel icon

    * Cleanup

    * Add missing EndProject line

    * Fix dependency version conflicts

    * Fix NOTICE.md

    * Correct place of SemanticKernel in NOTICE.md

    * Unlinked CustomPreview toggle from AI

    * Added Microsoft.Bcl.AsyncInterfaces dependency to AdvancedPaste

    * Fixed NOTICE.md order

    * Moved Custom Preview to behaviour section

    * Made Image to Text raise error on empty output

    * Added AIServiceBatchIntegrationTests

    * Updated AIServiceBatchIntegrationTests

    * Added prompt moderation

    * Moved GPO Infobar to better location

    * [Launcher]Port from WPF-UI to .NET 9 WPF (#36215)

    * Initial implementation

    * Fix fluent style

    * Fix no endline

    * Update expect.txt

    * Fix formatting

    * Fix light theme looking bad on Windows 10

    * fix formatting

    * test change

    * Now really fixed W10

    * Add a comment

    * Fix typos

    * Fix spellcheck errors

    * Fix spellcheck pattern for websites

    * Change patterns for spellcheck in the right file

    * Fix XAML styling

    * Fix contrast colors on W11

    * Fix formatting

    * Removed emty line

    * Fix formatting

    * Added comment to fluentHC file

    * fix comment

    * Fix Windows10 again.
    Adress feedback.

    * W11 fix chaning from high contrast to normal not having correct background

    * W10 Fix high contrast not working after switching from light/dark moed

    * Address feedback

    * Fix formatting

    * Second W11 fix chaning from high contrast to normal not having correct background

    * [UX]Updating New+ and Settings icons (#36290)

    * Updated icons

    * Updating more icons and icos

    * [Settings][Dashboard] Accessibility fixes (#36280)

    * make narrator announce buttons/toggles

    * add toggles module name

    * [ci]Sign OpenAI dll that's not signed (#36299)

    * Update CODEOWNERS to include gordon, jerry and kayla (#36308)

    * Update CODEOWNERS

    * Update names.txt

    * Making the powertoys-code-owners team code owners (#36310)

    * Update CODEOWNERS

    * Update names.txt

    * Update CODEOWNERS

    * [FZEditor]Fix Create new layout dialog radio buttons IsChecked values  (#36320)

    * 0.87 changelog (#36335)

    * 0.87 changelog

    * Fix spellcheck

    * Update README.md

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [PTRun]Fix WPF transparent border issue on Windows 10 (#36392)

    * Added border on W10

    * Added a comment

    ---------
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>

    * [PTRun]Fix .NET 9 crash in OneNote (#36417)

    * Fix crash in OneNote Run

    * added better comment

    * [AdvancedPaste]Fix NullReferenceException on Dispose (#36428)

    [AdvancedPaste] Fixed NullReferenceException on Dispose

    * [Fuzz] Add fuzz testing for AdvancedPaste and new pipeline for onboarding OneFuzz (#36329)

    * add fuzz

    * install .net8

    * add spelling check

    * refine the pipeline

    * add readme and update the test code

    * fix spelling error

    * change to weekly run

    * Add New CI Pipeline for Latest WindowsAppSDK (#36282)

    This PR introduces the following changes to the CI pipeline and version management:

    Pipeline Enhancements:
    1. Added a new script UpdateVersions.ps1 to automate the update of Microsoft.WindowsAppSDK versions across various project files.
    2. Introduced a new pipeline configuration ci-using-the-latest-winappsdk.yml to build using the latest Microsoft.WindowsAppSDK.
    3. Updated existing pipeline configurations to support the new useLatestWinAppSDK parameter.

    Pipeline Configuration Updates:
    1. Updated job-build-project.yml to handle the useLatestWinAppSDK parameter and adjust the RestoreAdditionalProjectSourcesArg accordingly.
    2. Added a new template steps-update-winappsdk-and-restore-nuget.yml for updating and restoring NuGet packages with the latest Microsoft.WindowsAppSDK.
    3. Added WinAPPSDK version selection, the pipeline can be manually triggered to use the specified version.

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [AOT compatible] Make HostsUILib become AOT compatible (#36136)

    * Remove AOT configuration

    * Refer to AOT compatibility props

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [AOT compatible] Clean up some AOT build issue in FilePreviewCommon and MarkdownPreviewHandler (#36207)

    * Use AppContext.BaseDirectory to replace assembly.GetExeAseembly.Location.
    Fix json serilizer aot issue.

    * clean up some AOT build issue

    * Update src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandlerControl.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Update src/common/FilePreviewCommon/Formatters/JsonFormatter.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Add new pipeline using the latest webview2 from Edge Canary (#36317)

    * using the latest webview2 for testing

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Bug fix] Making the OpenAI key configuration page scrollable. (#36359)

    * Fixed #34470

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>

    * [Bug fix] Add a format validation step before format conversion. (#36404)

    This PR aims to fix the bug #35225 by introducing a new method IsJson to determine if a given text is in JSON format.
    The IsJson method is then utilized in the ToJsonFromXmlOrCsvAsync method to optimize the processing logic.
    If the text is already in JSON format, it is returned directly without further conversion from XML or CSV.

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * Add more STCA team members (#36438)

    * Add more STCA team members

    * Include more spelling check errors

    * Remove non-alpha in dictionary

    * Add Zhaopeng Wang

    * Fix spell checking error

    * Remove "prerelease: true" (#36484)

    * Remove "prerelease: true"

    The Microsoft.WinGet.DSC module is GA so prerelease: true is no longer needed.

    * Update expect.txt

    fixing spellcheck warning

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Docs]Update README for 0.87.1 release (#36534)

    * [CI] Enhance build Pipeline Reliability with Retry Logic and Improved Error Messaging (#36529)

    * update pipeline with retry

    * remove tests

    * Add team member (#36590)

    * [New+]Don't override New actions from Explorer on Windows 10 (#36467)

    * [New+]Don't override New actions from Explorer

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Add pattern for learn.microsoft links

    * Also only Query for context menu

    * [PTRun][Calculator]Handle hexadecimal numbers to not return divide by 0 error (#36390)

    * add '0x' handling for divide by 0 scenarios

    * fix comment on division by 0 check

    ---------

    Co-authored-by: Connor Plante <connor.plante@gmail.com>

    * [TextExtractor]Minor UI/Accessibility fixes in the overlay UI (#36356)

    minor UI and accessibility fixes

    * [PTRun][Calculator]Update mages to v3.0.0 and support for `randi(n)` (#36560)

    * update to mages 3.0.0

    * allow randi() in calculator plugin

    * fix tests and input validation

    * fix spell check

    * [QuickAccent]Added ć for Slovenian (#36336) (#36338)

    * Fix snapping Workspaces Editor to Fancy Zones (#36463)

    * Remove Workspaces Editor from Fancy Zone's excluded app list

    * removed unused string

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>

    * [PTRun]Fix drag on .NET 9 WPF (#36635)

    * [CQ]Continued to move stuff out of root - Solution.props (#36244)

    * [QuickAccent]Add Proto-Indo-European (#36408)

    * Add ḱ to PowerAccent for Proto-Indo-European

    * Fix Spelling Check

    * Add more letters to PIE

    * Order PIE after PI

    ---------

    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [PTRun]Add context buttons for VSCodeWorkspaces plugin (#36517)

    * [Settings][QuickAccent]Change 'character set' to plural form (#36565)

    * [PTRun][Calculator]Fix unit tests on non-english systems (#36569)

    * fix tests

    * update comment

    * [PTRun][Calc]Improve handling of non-base 10 numbers (#36700)

    * [Settings][PTRun]Show plugin version and website (#36580)

    * [Monaco]Add support for .resx and .resw preview support. (#36499)

    Added support for .resx and .resw preview support. These files are XML based files so I added the file extensions as part of the registerAdditionalLanguage("xmlExt"...) function.

    * [Settings] Add Workspaces' workspaces.json file to backup/restore list (#36714)

    * [Localization] Fix loc pipeline to send downloaded localized files to TDBuild upon retry after failure (#36766)

    * [AdvancedPaste]Fixed issues with Screen Reader integration (#36778)

    * Remove Advent calendar from README (#36777)

    * Remove Advent calendar from README

    * Update hero image

    * Delete doc/images/overview/PT_holiday_hero_image.png

    * [AdvancedPaste]Add all BitmapDecoder supported image filetypes to ImageToText (#35600)

    Adds support to ImageToText for all image filetypes supported by BitmapDecoder.

    * [AOT]Clean up some AOT build issues in PowerAccent.Core (#36264)

    * init

    * Use AotCompatibility instead

    * Replace typeof(Lanaguge) with GetValues<Language>

    * Create new folder to place source generation context file.

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [WinUI3]Fix Windows 10 title bar borders (#36429)

    * Fix borders for windows in the Settings UI

    * Fix HOSTS window

    * Fix Advanced Paste

    * Fix Environment Variables

    * Fix File Locksmith

    * Fix Peek, with a caveat

    * Fix Registry Preview

    * Remove unused imports

    * Clean up imports in OobeShellPage

    * Move OSVersionHelper from Common.UI up into ManagedCommon

    * [QuickAccent]Fix unstable language loading (#36721)

    * [Peek]Bring into foreground if previously minimized (#36506)

    Added Activate() to bring Peek.UI window into focus upon Toggle. This allows the UI to be presented even if it was previously minimized.

    * Update Run docs README (#36857)

    * Update Run docs README

    * Remove System dupe

    * [Monaco]Make minimap toggleable (#33742)

    * [Monaco]Fix Json format preview setting (#36867)

    * [KBM]Added option for exact match shortcut (#36000)

    * Added option for exact match shortcut

    * Fix spell-check

    * [Deps][Security]Update .NET Packages from 9.0.0 to 9.0.1  (#36879)

    * [Deps] Update NuGet packages to version 9.0.1

    Updated several NuGet packages from version 9.0.0 to 9.0.1, including:
    - Microsoft.Data.Sqlite
    - Microsoft.Bcl.AsyncInterfaces
    - Microsoft.Extensions.DependencyInjection
    - Microsoft.Extensions.Logging
    - Microsoft.Extensions.Logging.Abstractions
    - Microsoft.Extensions.Hosting
    - Microsoft.Extensions.Hosting.WindowsServices
    - Microsoft.Win32.SystemEvents
    - Microsoft.Windows.Compatibility
    - System.CodeDom
    - System.ComponentModel.Composition
    - System.Configuration.ConfigurationManager
    - System.Data.OleDb
    - System.Diagnostics.EventLog
    - System.Diagnostics.PerformanceCounter
    - System.Drawing.Common
    - System.Management
    - System.Runtime.Caching
    - System.ServiceProcess.ServiceController
    - System.Text.Encoding.CodePages
    - System.Text.Json

    * [Deps] Update NOTICE.md

    * [Peek]Fix using the correct Monaco assets at runtime (#36890)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area (#36769)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area

    * Update src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    ---------

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    * [Workspaces] Saving app properties on launch and recapture (#36751)

    * [Workspaces] Implementing set and get GUID to/from HWND to distinguish windows moved by the Workspaces tool

    * After launch and capture copy the CLI args from the "original" project

    * Fix getting GUID

    * spell check

    * modification to be able to handle different data sizes on different systems

    * code optimisation

    * Replacing string parameter by InvokePoint

    * renaming variable

    * [AdvancedPaste]Use background thread for interactions between runner and Advanced Paste (#36858)

    * [Advanced Paste] Use background thread for runner-Advanced Paste interaction

    * Fixed typo

    * [VCM]Deprecate the Video Conference Mute utility (#36772)

    * Remove all VideoConferenceMute related code and files

    * Clean up vcm driver registry keys

    * Also remove the Webcam report tool

    * Also clean out video conference on the installer

    * Fix spellcheck

    * Remove comment about video conf

    * Update gpo files revision

    * Revert removing the VCM policies

    * Deprecate VCM GPO policy

    * Change deprecation message to show first supported version

    * Tweak supported strings in the adml

    * Goodbye friends, you are forever part of the team (#36905)

    * Goodbye friends

    Forever part of the team 😢

    * Update COMMUNITY.md

    * Fix formatting issues in COMMUNITY.md

    * [New utility]Sysinternals ZoomIt (#35880)

    * ZoomIt initial code dump

    * Change vcxproj to normalize dependency versions

    * Fix code quality to build

    * Add to PowerToys solution

    * Clean out C-style casts

    * Fix some more analyzer errors

    * Constexpr a function

    * Disable some warnings locally that it seemed better not to touch

    * Add ZoomIt module interface

    * Add GPO

    * Add Settings page with Enable button

    * Output as PowerToys.ZoomIt.exe

    * Extract ZoomIt Settings definition to its own header

    * Make ZoomItModuleInterface build with ZoomItSettings too

    * WinRT C++ interop for ZoomItSettings

    * From Registry To PowerToys Json

    * Properly fix const_cast analyzer error

    * Initial Settings page loading from registry

    * Zoom mode settings

    * Save settings

    * Add file picker and DemoType file support

    * Remaining DemoType settings

    * Have ZoomIt properly reloading Settings and exiting

    * Remove context menu entries for Options and Exit

    * ZoomIt simple Break Options

    * Break advanced options

    * Simple Record settings

    * Record Microphone setting

    * Fix break background file picker title

    * Font setting

    * Fix build issues after merge

    * Add ZoomIt conflict warning to Settings

    * Exclude Eula from spell checking

    * Fix spellcheck errors

    * Fix spell check for accelerated menu items

    * Remove cursor files from spellcheck. They're binary

    * Fix forbidden patterns

    * Fix XAML style

    * Fix C# analyzers

    * Fix signing

    * Also sign module interface dll

    * Use actual ZoomIt icon

    * Add OOBE page for ZoomIt

    * ZoomIt image for Settings

    * Flyout and Dashboard entries

    * Fix type speed slider labels

    * Correctly load default Font

    * Correctly register shortcuts on ZoomIt startup first run

    * Fix modifier keys not changing until restart

    * Show MsgBox on taken shortcut

    * Start PowerToys Settings

    * Normalize ZoomIt file properties with rest of PowerToys

    * Add attribution

    * Add ZoomIt team to Community.md

    * More copyright adjustments

    * Fix spellcheck

    * Fix MsgBox simultaneous instance to the front

    * Add mention of capturevideosample code use

    * Add ZoomIt to process lists

    * Add telemetry

    * Add logging

    * React to gpo

    * Normalize code to space identation

    * Fix installer build

    * Localize percent setting

    * Fix XAML styling

    * Update src/settings-ui/Settings.UI/Strings/en-us/Resources.resw

    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * Fix spellcheck

    * One more spellcheck fix

    * Integrate LiveDraw feature changes from upstream

    * Fix name reuse in same scope

    * Fix c-style casts

    * Also register LIVEDRAW_HOTKEY

    * Fix newLiveZoomToggleKey

    * Update LiveZoom description in Settings to take LiveDraw into account

    * Fix spellcheck

    * Fix more spellcheck

    * Fix Sysinternals capitalization

    * Fix ARM64 Debug build

    * Support Sysinternals build (#36873)

    * Remove unneeded files

    * Make build compatible with Sysinternals

    * Separate PowerToys ZoomIt product name (#36887)

    * Separate PowerToys ZoomIt product name

    To help maintain the Sysinternals branding in the standalone version.

    * Clarify branding-related includes

    * Remove ZoomIt.sln

    * Add foxmsft to spell-check names

    * Add ZoomIt to README

    * Add ZoomIt to GH templates

    * Add ZoomIt events to DATA_AND_PRIVACY.md

    * Remove publish_config.json

    * Remove publish_config.json from vcxproj too

    ---------

    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * [PTRun]Add hotkey to the show telemetry event (#36869)

    * [PTRun]Update the code for .NET 9.0.1 - remove workarounds (#36909)

    * Revove some unneeded changes after pdating to .net9.1

    * [RegistryPreview]Copy context menu, data tooltip, MULTI_SZ fix (#36631)

    * add context menus

    * string resources for contextmenu

    * fix line break parsing for MULTI_SZ

    * better presentation of multiline values and value tooltip

    * cleanup

    * [MWB] - refactoring "Common" classes - Common.Log.cs, Common.Receiver.cs (#35726)

    * [PTRun]Add setting for different trigonometric units in Calculator (#36717)

    * Added angle units to PowerToys Run Calculator plugin.

    * Update Resources.resx

    * Added GitHub SpellCheck rule for 'gradians'.

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [ci]Remove steps to build abstracted utilities packages (#36934)

    * [Settings]Update GPO infobar icon, improve some pages and fix bugs (#33703)

    * changes part 1

    * fix xaml code

    * changes part 2

    * fix cmdNotFound page

    * Update PowerOcrPage

    * More Pages changed

    * More Pages changed

    * revert temporary change

    * fix spelling

    * add resw comment

    * add resw comment

    * Update MouseWihtoutBorderPage.xaml

    * PowerPreview page

    * workspaces page

    * fix awake page gpo handling

    * NewPlus page

    * update new+ page!

    * AdvancedPaste.xaml: Move Info bar.

    * Update MouseJumpPanel.xaml

    * Update GeneralPage.xaml

    * fix position of info bar and some ui quirks

    * fix xaml style

    * fix string resources

    * string changes

    * prepare megre main

    * update new+ page

    * zoomit page

    * various fixes

    * [Common]NotificationUtil helper class with FileWatcher (#36720)

    * add NotificationUtil helper with file watcher and cache

    * fix spellcheck

    * indentation

    * [PTRun][Docs]Add YubicoOauthOTP to Third-Party plugins (#36761)

    * [PTRun]Fixed typo in Value Generator messages (#36951)

    * [AOT] Clean up some AOT issues in Advanced Paste module (#36297)

    * Clean up the aot build issue.

    * Merge main and clean up new AOT build issue

    * Update LogEvent define.

    * Update src/modules/AdvancedPaste/AdvancedPaste/Helpers/LogEvent.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * update typo bug

    * Remove unused allow list item

    * Create a new folder to place source generation context

    * Merge main and rename LogEvent to AIServiceFormatEvent

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * [ZoomIt]React to gpo setting when run as standalone (#36975)

    * [Settings]ImageResizer settings accessibility updates, fixes and refactor (#36903)

    * Fix issue with missing Image Resizer unit and fit information in settings description.

    * Fix accessibility issues on Edit and Remove buttons. Fix various issues and refactor view model and ImageSize. New resources for accessibility text formats.

    * Fix unit test because of change to new preset width and height. Fix 2 unit tests having incorrect expected/actual orderings.

    * Post-review update: accessibility strings now formatted within the converter, instead of via format strings; simplified encoder GUID collection declaration and retrieval.

    * Minor example text fix.

    * [Settings]Update "Back up" mentions when it should be used as a verb (#36965)

    * Update Back up name

    * Rename Backup to Back up

    * [New+]Update last modified date to now for all templates created (#36133)

    * Update last modified date to now for all templates created

    * Now also set last update for directories. Thank you htcfreek!

    * [ImageResizer][ci]Fix XAML style errors (#37009)

    * [Settings] Add "new" labels to navigation for new utilities (#36939)

    * initial implementation

    * move new label to zoomit

    * cleanup

    * more cleanup

    * fix XAML formatting

    * update padding to 4px

    * add badge to dashboard item

    * fix XAML formatting

    * Tweaking UX

    ---------

    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [MWB]Fix helper process termination issue in service mode (#36892)

    * [MWB] Changed to suppress the flow of the execution context

    * Fix build after merge

    * [MWB] Fix helper process termination issue in service mode

    * Add some comments

    * [runner]Fix crashes caused by wrong setting AllowDataDiagnostics registry value (#37015)

    * Fix setting registry value

    * Prevent future similar crashes

    * [PTRun][Calculator]Error check when loading trigonometry mode (#37033)

    * [ZoomIt]Fix transparent draw after changing another setting (#37042)

    * [Settings]Fix ZoomIt page changing current directory (#37052)

    * [ci]Remove vc tools version workaround (#37098)

    * 0.88 changelog (#37056)

    * 0.88 changelog

    * Update README.md

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * Add installer hashes

    * Fix aka.ms link for ZoomIt

    * Add mention to the PTRun plugin's dll file version

    * Update README.md

    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>

    * [check-spelling] Update metadata

    Update for https://github.com/zadjii-msft/PowerToys/actions/runs/13033425108/attempts/1
    Accepted in https://github.com/zadjii-msft/PowerToys/pull/379#issuecomment-2621811953

    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    Co-authored-by: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com>
    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>
    Co-authored-by: Ionuț Manța <ionut@janeasystems.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>
    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>
    Co-authored-by: PesBandi <127593627+PesBandi@users.noreply.github.com>
    Co-authored-by: Wenjian Chern <55335597+Sophanatprime@users.noreply.github.com>
    Co-authored-by: Youssef Victor <youssefvictor00@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
    Co-authored-by: leileizhang <leilzh@microsoft.com>
    Co-authored-by: Den Delimarsky 🔐 <sign@den.dev>
    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>
    Co-authored-by: Shuai Yuan <128874481+shuaiyuanxx@users.noreply.github.com>
    Co-authored-by: moooyo <42196638+moooyo@users.noreply.github.com>
    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jerry Xu <n.xu@outlook.com>
    Co-authored-by: Demitrius Nelon <denelon@microsoft.com>
    Co-authored-by: Kai Tao <69313318+vanzue@users.noreply.github.com>
    Co-authored-by: Connor Plante <150482134+plante-msft@users.noreply.github.com>
    Co-authored-by: Connor Plante <connor.plante@gmail.com>
    Co-authored-by: Domen Soklič <soklicd@gmail.com>
    Co-authored-by: Hao Liu <liuhaobupt@163.com>
    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: immi <iafullprogrammer@gmail.com>
    Co-authored-by: Asif Islam <77113884+asif4318@users.noreply.github.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>
    Co-authored-by: Dave Rayment <dave.rayment@gmail.com>
    Co-authored-by: Neil McAlister <pingzing@users.noreply.github.com>
    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Michael Clayton <mike@kingslandconsulting.co.uk>
    Co-authored-by: Nathan Gill <nathan.j.gill@outlook.com>
    Co-authored-by: Daniel Nilsson <daniel.nilsson1989@gmail.com>
    Co-authored-by: JackStuart <jack@jstuart.io>
    Co-authored-by: Christian Gaarden Gaardmark <cgaarden@hotmail.com>
    Co-authored-by: YDKK <YDKK@users.noreply.github.com>
    Co-authored-by: Stefan Markovic <stefansjfw@users.noreply.github.com>

commit 0931597d53
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Jan 29 15:47:51 2025 +0100

    Fix build until POC is removed (#380)

commit c39141b143
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Jan 29 06:56:10 2025 -0600

    Tiny nits for winget (#378)

    I guess I only subconsciously knew that the progress value in WinUI was in percent, not [0,1].
    Also actually do the description fallback I wanted.

commit 4ce5515ced
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Jan 29 06:32:23 2025 -0600

    Remove all the PT Run v1 icons we no longer need (#377)

    Removes icons we weren't using anymore.
    Replaces the Windows Services icon from the dll, with "Processing", which is also two gears.
    Fixes the FastUpToDate check, for tighter inner loop

    Closes #125

commit cce68789df
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Jan 28 14:21:49 2025 -0600

    Remove straggling empty fallbacks (#376)

    Updating the search text for a fallback command is fully async. However, we just fire off all those updates, then immediately update the list of filtered items. That of course is dumb, because most of them haven't yet processed the update before we determine if we show it or not.

    So, we've added an `UpdateFallbackItemsMessage` that we emit from a fallback command to let the main page know it may need to remove an item from its list.

commit 0fba556782
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Jan 28 13:45:46 2025 -0600

    Hot (un)load extensions on (un)install (#375)

    Closes #370

    The DevHome code was great for "I need something that can lookup extensions and enumerate all of them".

    However, the DevHome code is a very blunt hammer when it comes to extensions. The only thing it tracks is "packages changed", and if it gets one of those, it just blows away all the extensions and rebuilds them. Yikes.

    This PR changes `ExtensionService` to be a scalpel. We'll keep `_installedExtensions` fresh. When we get a package install, we'll add only that package's extension to our cache, and let the `TopLevelCommandManager` know. Similarly for updates and uninstalls.

    That way, we can exactly change the top-level list as needed, rather than bluntly forcing all the extensions to reload.

    In the middle of all this, I fixed a bug where uninstalling an extension, then reloading would just fail to load extensions. This is because the old code would clear out the **whole** list of extensions when _one_ was uninstalled. That created a race where we'd be parsing the new list of all the extensions (from the reload), get an uninstall event, clear the list, then InvalidOperation as the list of extensions was modified during enumeration.

    There's a bunch more locking in here. This might drive-by #324 but hard to be sure.

    Related to #89

commit 899c233329
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Jan 27 14:06:09 2025 -0600

    Don't move the caret to the end of the input if nothing changed (#374)

    Title.

    I just noticed that if you move the caret earlier in the input, then type, we'll toss the caret to the end of the input. Ew. Don't do that.

    We should only move the caret if the text actually changed from what we already had.

commit a89375df1e
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Mon Jan 27 12:03:44 2025 -0800

    Farewell (#332)

    [Spartans never die](https://www.youtube.com/clip/UgkxrRi5-oeG7thHZ4qH-UNsw2JmyK_GmM0W)

commit f14119a3ff
Author: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>
Date:   Mon Jan 27 21:00:36 2025 +0100

    Add isMultiline and placeholder to Input.Text (#371)

    Add `isMultiline` and `placeholder` to `Input.Text`.
    Default is the current behavior: single line without placeholder.

commit e92a28917e
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Jan 27 13:56:46 2025 -0600

    Update acrylic when BG changes (#373)

    Closes #225

    Yes it absolutely was this easy.

commit 2311b35a08
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Jan 27 13:56:29 2025 -0600

    Add sample to validate null arrays (#372)

    Closes #221

    Turns out that the crash in #221 doesn't actually repro anymore, but this sample will test that case

commit 7416b3462d
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Jan 27 13:56:20 2025 -0600

    Add a tray icon (#364)

    Mostly pilfered code from `src/runner/tray_icon.cpp`

    Creates a tray icon. No menu on it - just click it to focus the CmdPal.

    Closes #what-the-I-didn't-file-something-for-this?

commit 46bc657945
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Jan 27 13:55:02 2025 -0600

    Add support for tags in Details metadata (#368)

    Adds support for rendering tags in Details metadata.

    As an example, adds tags to winget packages.

    Closes #95

    Also adds separators, and a sample

commit 621044f3c5
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Jan 27 13:53:14 2025 -0600

    Add a page for searching for extensions on winget (#369)

    Tested with the `command-line` tag, because there's no extensions in winget until https://github.com/microsoft/winget-pkgs/pull/216685 merges

    Also adds a link to search in the Store, though I think that won't be as useful.

    Lastly - also actually fixes the tag search 😅

    Builds on #356
    Closes #89
    Probably needs #370 to feel right

commit 28efaa849a
Author: Niels Laute <niels.laute@live.nl>
Date:   Mon Jan 27 20:52:47 2025 +0100

    Settings in a window (#361)

    - Settings are now in a window.
    - Moved pages into a separate pages folder

    We probably want to split up the extensions vs. general VMs, but we can do that later once we figured out what the Settings pages should look like.

    Related to #80

commit 62e99fbc70
Author: Seraphima Zykova <zykovas91@gmail.com>
Date:   Mon Jan 27 22:52:27 2025 +0300

    [Indexer] Support wildcards like PT Run (#336)

    Changed query generation to support wildcards like PT Run

commit e51d70e055
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Jan 24 08:24:22 2025 -0600

    Fix NOTICE and add version (#362)

    I didn't know this file existed, whoops, sorry

commit 8f9534121f
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Jan 24 06:49:18 2025 -0600

    Initial draft of the winget extension (#356)

    _targets #355_, which I need for improvements to messages

    * [x] The initial package load takes a long time. This is pretty much unavoidable, but we do it on cmdpal startup, so anything after about 12s should be snappy
    * [x] I cannot for the life of me get `FindPackagesAsync`, to be async. The call always ends up running synchronously, so I can't hook up the `operation.Completed` event, nor the cancellation. The action is already complete!
      - this is probably blocking, because we still end up doing a search on most keystrokes, so we only get the final results after all the intermediate ones are done.
      - Just pasting a search though? Just as snappy as you'd hope.
      - Ahahahaha it wasn't me: [microsoft/winget-cli#5151](https://github.com/microsoft/winget-cli/pull/5151)
      -  manually wrapping this in a BG thread made it better
    * [ ] We probably shouldn't make the default action for an installed package "Uninstall".
      - Probably want to shunt over to the Settings app for the package
      - We probably want to do the thing where the second command doesn't show up if it's a separator
      - Punt? punt
    * [x] We need to add more metadata in the details for packages. We have it, if only we could show it: #95
      - This will be a follow-up
    * [ ] This needs localization too
    * I'm using the `1.10-preview` of the winget com interfaces. On my framework laptop at least, the `RefreshPackageCatalogAsync` API isn't yet implemented, so I need to test that
    * [x] I don't think we implemented `MoreCommands` being observable in the host yet. We should.
      - Punted, #360
    * [ ] I probably also need to check if other APIs we're using exist or not
    * [x] I haven't tested situations that like, need you to accept a license? Installing `nano` and the NanoLeaf app both _just work_.
      - Punted?

commit 4d464bc801
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 23 16:06:55 2025 -0600

    Add support for hiding messages too (#355)

    Bits of status messages that were omitted from #281.

    This lets extensions hide messages (and exposes the helper in the helper lib).

    It also adds support for displaying progress as a progress bar underneath the text of the status message. I'll need An Adult to help with the XAML, to re-template the InfoBar to allow a progress wheel in the icon instead, but for now? good enough.

    I'm doing this to unblock the next PR, which should add some rudimentary winget support.

commit 2d4bead312
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Jan 23 16:06:06 2025 -0600

    Fix taskbar summons (#357)

    Whoops. Activating the app from the taskbar comes in off the UI thread

    This may have been an additional cause of #327

commit 5ed505ac92
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 23 15:48:57 2025 -0600

    Add 3 settings for Clint (#347)

    * Add 3 settings for Clint

    Is your name Clint? Do you like settings? Did you hate that backspace on the
    main page could dismiss the palette? If you said yes to any of that, you're in
    luck! This PR is for you!

    This PR adds three new settings:

    * `BackspaceGoesBack`: Controls if backspace with an empty search takes you back
      a level
    * `SingleClickActivates`: Allows users to toggle between the "single click
      selects, double activates" vs "single click activates" behavior
    * `HighlightSearchOnActivate`: When `true` (**default**), this will select the
      text in the search bar when the window is summoned

    This drive-by fixes a bug where clicking to select an item stole focus from the
    search box.

    closes #306

    * spel

commit 83e13e814b
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Tue Jan 21 14:28:51 2025 +0100

    Mere PT upstream #8 (#346)

    * [Workspaces] implement the move feature (#35480)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * fix Move attribute after launch and snapshot

    * Extend WindowArranger with PWA functionality to detect different PWA apps. PwaHelper moved to the common library

    * fix repeat counter in the editor

    * Code optimization

    * code cleanup, optimization

    * fix double-processing window

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * [KeyboardManager]Fix mapping shift to numpad (#35890)

    * Keyboard Manger fix numpad as shift

    Fixed shift not being released if a numpad key as shift.

    * Added comments

    * Fix typo

    * Fix the numpad unlocked key not working if the locked version is overridden by shift

    * Fix spelling check.

    * Revert the VK_CLEAR change.

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [Analyzers] Update .editorconfig with rules to relax IDE errors (#36095)

    * [Analyzers] Remove duplicate pascal case style from .editorconfig

    * [Analyzers] Configured severity for individual IDE and CA rules showing as errors in VS

    Set severity for IDE0005, IDE0008, IDE0016, IDE0018, IDE0019, IDE0021, IDE0022, IDE0023, IDE0025, IDE0027, IDE0028, IDE0029, IDE0031, IDE0032, IDE0034, IDE0036, IDE0039, IDE0042, IDE0044, IDE0045, IDE0046, IDE0047, IDE0057, IDE0051, IDE0052, IDE0054, IDE0055, IDE0056, IDE0057, IDE0059, IDE0060, IDE0061, IDE0063, IDE0071, IDE0073, IDE0074, IDE0075, IDE0077, IDE0078, IDE0083, IDE0090, IDE0100, IDE0130, IDE160, IDE180, IDE0200, IDE0240, IDE0250, IDE0251, IDE0260, IDE0270, IDE0290, IDE0300, IDE0301, IDE0305, IDE1005, IDE1006, CA1859, CA2022, CA2263

    * [Analyzers] Fix mismatched analyzer descriptions

    * [Analyzers] Fix misspelling

    * Update .editorconfig

    Made the following style rules `silent` instead of `suggestion`:
    - Use explicit type instead of 'var'
    - Use expression body for ...
    - Use block-scoped namespace

    * [Analyzers] Set IDE0290 to silent

    * [Analyzers] Remove IDE1006 configuration from .editorconfig in favor of making exclusions for the few entries

    * [Analyzers][Indexer] Add IDE1006 suppressions

    * [Analyzers][Peek] Add IDE1006 suppression

    * [Analyzers][MWB] Add IDE1006 suppression.

    * [Analyzers][Plugins] Add IDE1006 suppression

    * [Analyzers][ImageResizer] Suppress IDE0073 to retain original copyright

    * [Analyzers] Remove IDE0073 severity change in .editorconfig

    ---------

    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>

    * [Workspaces] PWA follow-up (#36217)

    * [PTRun][Calculator]Allow scientific notation with lowercase 'e' (#36187)

    * [Workspaces] Add encoder parameter to bitmap.save() (#36228)

    * [Workspaces] Add encoder parameter to bitmap.save()

    * 1 more call fixed

    * Move repeated code to the csharp library

    * [Workspaces] Implement store of app window's size and position (#36086)

    * [Workspaces] Implement store of app window's size and position

    * Modifying the default values to -1. The program will use the original default values for the first run.

    * [ScreenRuler]Add setting to show the measurement in an extra unit (#35887)

    * display ruler: supporting millimeter and other units

    * Measurement Tool: UI Setting for an extra unit

    * Update images

    * spelling

    * spelling

    * suit code style

    * Fix for code review

    * remove weird file

    * rename field

    * [Deps]Update MSTest from 3.5.0 to 3.6.3 (#36115)

    * Update MSTest from 3.5.0 to 3.6.3

    * Use STA attributes that are now part of MSTest

    * Adding Jerry to community.md (#36232)

    Update COMMUNITY.md

    * [Workspaces] Arranger: smart timer (#36096)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] Arranger: Reset wait timer after each successful arrange action

    * fix merge error

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Upgrade to check-spelling v0.0.24 (#36235)

    This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24).

    A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur.

    There's a new accessibility forbidden pattern:

    > Do not use `(click) here` links
    > For more information, see:
    > * https://www.w3.org/QA/Tips/noClickHere
    > * https://webaim.org/techniques/hypertext/link_text
    > * https://granicus.com/blog/why-click-here-links-are-bad/
    > * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
    ```pl
    (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\()
    ```

    There are some minor bugs that I'm aware of and which I've fixed since this release, but I don't expect to make another release this month.

    I've added a pair of patterns for includes and pragmas. My argument is that the **compiler** will _generally_ tell you if you've misspelled an include and the **linker** will _generally_ tell you if you misspell a lib.

    - There's a caveat here: If your include case-insensitively matches the referenced file (but doesn't properly match it), then unless you either use a case-sensitive file system (as opposed to case-preserving) or beg clang to warn, you won't notice when you make this specific mistake -- this matters in that a couple of Windows headers (e.g. Unknwn.h) have particular case and repositories don't tend to consistently/properly write them.

    * Adjust to community.md, shifting jerry's github user name (#36242)

    Update COMMUNITY.md

    * [AOT compatible] Resolve AOT Build Error in Peek.UI (#36194)

    * add partial for aot support

    * add Microsoft.NET.ILLink.Tasks to packages.props

    * format

    * Revert "format"

    This reverts commit 742d5e2214.

    * add Microsoft.NET.ILLink.Tasks to notice.md

    * add auto reference

    * update script to remove the 'Auto-reference line'

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Awake Updates - `TILLSON_11272024` (#36049)

    * Update with bug fixes for tray icon and support for parent process

    * Process information enum

    * Update the docs

    * Fix spelling

    * Make sure that PID is used in PT config flow

    * Logic for checks based on #34148

    * Update with link to PR

    * Fixes #34717

    * Small cleanup

    * Proper task segmentation in a function

    * Cleanup the code

    * Fix synchronization context issue

    * Update planning doc

    * Test disabling caching to see if that manages to pass CI

    * Cleanup to make sure that we're logging things properly.

    * Update ci.yml

    * Disable cache to pass CI

    * Retry logic

    * Cleanup

    * Code cleanup

    * Fixes #35848

    * Update notes and codename

    * After third attempt, log error instead of throwing exception

    * More cleanup to avoid double execution

    * Add expected word

    * Safeguards for bad values for timed keep-awake

    * More updates to make sure I am using uint

    * Update error message

    * Update packages

    * Fix notice and revert CsWinRT upgrade

    * Codename update

    * Update expect.txt

    * Update the struct

    * Ensuring we're properly awaiting tray initialization

    * Update to make sure tray reflects the bound process

    * Cleanup, proper JSON serialization for logs.

    * Not needed.

    * Add command validation logic

    * Moving the initialization logic earlier

    * Make sure we show the display state in the tooltip

    * Update tray string

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update logic for icon resets

    * Update doc

    * Simplify function for setting mode shell icon

    * Issues should be properly linked

    * Minor cleanup

    * Update timed behavior

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Workspaces] detecting right app version (#36100)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] fix detection of specific version of apps

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Move the XamlStyler config to src/ (#36202)

    my never ending goal to minimize files in the root dir

    * [AdvancedPaste]Add Semantic Kernel opt-in to allow chaining of paste actions (#35902)

    * [AdvancedPaste] Semantic Kernel support

    * Changed log-line with potentially sensitive info

    * Spellcheck issues

    * Various improvements for Semantic Kernel

    * Spellcheck issue

    * Refactored Clipboard routines

    * Added integration tests for KernelService

    * Extra telemetry for AdvancedPaste

    * Added 'Hotkey' suffix to AdvancedPaste_Settings telemetry event

    * Added IsSavedQuery

    * Added KernelQueryCache

    * Refactoring

    * Added KernelQueryCache to BugReportTool delete list

    * Added opt-n for Semantic Kernel

    * Fixed bug with KernelQueryCache

    * Ability to view last AI chat message on error

    * Improved kernel query cache

    * Used System.IO.Abstractions and improved tests

    * Fixed under-count of token usage

    * Used Semantic Kernel icon

    * Cleanup

    * Add missing EndProject line

    * Fix dependency version conflicts

    * Fix NOTICE.md

    * Correct place of SemanticKernel in NOTICE.md

    * Unlinked CustomPreview toggle from AI

    * Added Microsoft.Bcl.AsyncInterfaces dependency to AdvancedPaste

    * Fixed NOTICE.md order

    * Moved Custom Preview to behaviour section

    * Made Image to Text raise error on empty output

    * Added AIServiceBatchIntegrationTests

    * Updated AIServiceBatchIntegrationTests

    * Added prompt moderation

    * Moved GPO Infobar to better location

    * [Launcher]Port from WPF-UI to .NET 9 WPF (#36215)

    * Initial implementation

    * Fix fluent style

    * Fix no endline

    * Update expect.txt

    * Fix formatting

    * Fix light theme looking bad on Windows 10

    * fix formatting

    * test change

    * Now really fixed W10

    * Add a comment

    * Fix typos

    * Fix spellcheck errors

    * Fix spellcheck pattern for websites

    * Change patterns for spellcheck in the right file

    * Fix XAML styling

    * Fix contrast colors on W11

    * Fix formatting

    * Removed emty line

    * Fix formatting

    * Added comment to fluentHC file

    * fix comment

    * Fix Windows10 again.
    Adress feedback.

    * W11 fix chaning from high contrast to normal not having correct background

    * W10 Fix high contrast not working after switching from light/dark moed

    * Address feedback

    * Fix formatting

    * Second W11 fix chaning from high contrast to normal not having correct background

    * [UX]Updating New+ and Settings icons (#36290)

    * Updated icons

    * Updating more icons and icos

    * [Settings][Dashboard] Accessibility fixes (#36280)

    * make narrator announce buttons/toggles

    * add toggles module name

    * [ci]Sign OpenAI dll that's not signed (#36299)

    * Update CODEOWNERS to include gordon, jerry and kayla (#36308)

    * Update CODEOWNERS

    * Update names.txt

    * Making the powertoys-code-owners team code owners (#36310)

    * Update CODEOWNERS

    * Update names.txt

    * Update CODEOWNERS

    * [FZEditor]Fix Create new layout dialog radio buttons IsChecked values  (#36320)

    * 0.87 changelog (#36335)

    * 0.87 changelog

    * Fix spellcheck

    * Update README.md

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [PTRun]Fix WPF transparent border issue on Windows 10 (#36392)

    * Added border on W10

    * Added a comment

    ---------
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>

    * [PTRun]Fix .NET 9 crash in OneNote (#36417)

    * Fix crash in OneNote Run

    * added better comment

    * [AdvancedPaste]Fix NullReferenceException on Dispose (#36428)

    [AdvancedPaste] Fixed NullReferenceException on Dispose

    * [Fuzz] Add fuzz testing for AdvancedPaste and new pipeline for onboarding OneFuzz (#36329)

    * add fuzz

    * install .net8

    * add spelling check

    * refine the pipeline

    * add readme and update the test code

    * fix spelling error

    * change to weekly run

    * Add New CI Pipeline for Latest WindowsAppSDK (#36282)

    This PR introduces the following changes to the CI pipeline and version management:

    Pipeline Enhancements:
    1. Added a new script UpdateVersions.ps1 to automate the update of Microsoft.WindowsAppSDK versions across various project files.
    2. Introduced a new pipeline configuration ci-using-the-latest-winappsdk.yml to build using the latest Microsoft.WindowsAppSDK.
    3. Updated existing pipeline configurations to support the new useLatestWinAppSDK parameter.

    Pipeline Configuration Updates:
    1. Updated job-build-project.yml to handle the useLatestWinAppSDK parameter and adjust the RestoreAdditionalProjectSourcesArg accordingly.
    2. Added a new template steps-update-winappsdk-and-restore-nuget.yml for updating and restoring NuGet packages with the latest Microsoft.WindowsAppSDK.
    3. Added WinAPPSDK version selection, the pipeline can be manually triggered to use the specified version.

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [AOT compatible] Make HostsUILib become AOT compatible (#36136)

    * Remove AOT configuration

    * Refer to AOT compatibility props

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [AOT compatible] Clean up some AOT build issue in FilePreviewCommon and MarkdownPreviewHandler (#36207)

    * Use AppContext.BaseDirectory to replace assembly.GetExeAseembly.Location.
    Fix json serilizer aot issue.

    * clean up some AOT build issue

    * Update src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandlerControl.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Update src/common/FilePreviewCommon/Formatters/JsonFormatter.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Add new pipeline using the latest webview2 from Edge Canary (#36317)

    * using the latest webview2 for testing

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Bug fix] Making the OpenAI key configuration page scrollable. (#36359)

    * Fixed #34470

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>

    * [Bug fix] Add a format validation step before format conversion. (#36404)

    This PR aims to fix the bug #35225 by introducing a new method IsJson to determine if a given text is in JSON format.
    The IsJson method is then utilized in the ToJsonFromXmlOrCsvAsync method to optimize the processing logic.
    If the text is already in JSON format, it is returned directly without further conversion from XML or CSV.

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * Add more STCA team members (#36438)

    * Add more STCA team members

    * Include more spelling check errors

    * Remove non-alpha in dictionary

    * Add Zhaopeng Wang

    * Fix spell checking error

    * Remove "prerelease: true" (#36484)

    * Remove "prerelease: true"

    The Microsoft.WinGet.DSC module is GA so prerelease: true is no longer needed.

    * Update expect.txt

    fixing spellcheck warning

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Docs]Update README for 0.87.1 release (#36534)

    * [CI] Enhance build Pipeline Reliability with Retry Logic and Improved Error Messaging (#36529)

    * update pipeline with retry

    * remove tests

    * Add team member (#36590)

    * [New+]Don't override New actions from Explorer on Windows 10 (#36467)

    * [New+]Don't override New actions from Explorer

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Add pattern for learn.microsoft links

    * Also only Query for context menu

    * [PTRun][Calculator]Handle hexadecimal numbers to not return divide by 0 error (#36390)

    * add '0x' handling for divide by 0 scenarios

    * fix comment on division by 0 check

    ---------

    Co-authored-by: Connor Plante <connor.plante@gmail.com>

    * [TextExtractor]Minor UI/Accessibility fixes in the overlay UI (#36356)

    minor UI and accessibility fixes

    * [PTRun][Calculator]Update mages to v3.0.0 and support for `randi(n)` (#36560)

    * update to mages 3.0.0

    * allow randi() in calculator plugin

    * fix tests and input validation

    * fix spell check

    * [QuickAccent]Added ć for Slovenian (#36336) (#36338)

    * Fix snapping Workspaces Editor to Fancy Zones (#36463)

    * Remove Workspaces Editor from Fancy Zone's excluded app list

    * removed unused string

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>

    * [PTRun]Fix drag on .NET 9 WPF (#36635)

    * [CQ]Continued to move stuff out of root - Solution.props (#36244)

    * [QuickAccent]Add Proto-Indo-European (#36408)

    * Add ḱ to PowerAccent for Proto-Indo-European

    * Fix Spelling Check

    * Add more letters to PIE

    * Order PIE after PI

    ---------

    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [PTRun]Add context buttons for VSCodeWorkspaces plugin (#36517)

    * [Settings][QuickAccent]Change 'character set' to plural form (#36565)

    * [PTRun][Calculator]Fix unit tests on non-english systems (#36569)

    * fix tests

    * update comment

    * [PTRun][Calc]Improve handling of non-base 10 numbers (#36700)

    * [Settings][PTRun]Show plugin version and website (#36580)

    * [Monaco]Add support for .resx and .resw preview support. (#36499)

    Added support for .resx and .resw preview support. These files are XML based files so I added the file extensions as part of the registerAdditionalLanguage("xmlExt"...) function.

    * [Settings] Add Workspaces' workspaces.json file to backup/restore list (#36714)

    * [Localization] Fix loc pipeline to send downloaded localized files to TDBuild upon retry after failure (#36766)

    * [AdvancedPaste]Fixed issues with Screen Reader integration (#36778)

    * Remove Advent calendar from README (#36777)

    * Remove Advent calendar from README

    * Update hero image

    * Delete doc/images/overview/PT_holiday_hero_image.png

    * [AdvancedPaste]Add all BitmapDecoder supported image filetypes to ImageToText (#35600)

    Adds support to ImageToText for all image filetypes supported by BitmapDecoder.

    * [AOT]Clean up some AOT build issues in PowerAccent.Core (#36264)

    * init

    * Use AotCompatibility instead

    * Replace typeof(Lanaguge) with GetValues<Language>

    * Create new folder to place source generation context file.

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [WinUI3]Fix Windows 10 title bar borders (#36429)

    * Fix borders for windows in the Settings UI

    * Fix HOSTS window

    * Fix Advanced Paste

    * Fix Environment Variables

    * Fix File Locksmith

    * Fix Peek, with a caveat

    * Fix Registry Preview

    * Remove unused imports

    * Clean up imports in OobeShellPage

    * Move OSVersionHelper from Common.UI up into ManagedCommon

    * [QuickAccent]Fix unstable language loading (#36721)

    * [Peek]Bring into foreground if previously minimized (#36506)

    Added Activate() to bring Peek.UI window into focus upon Toggle. This allows the UI to be presented even if it was previously minimized.

    * Update Run docs README (#36857)

    * Update Run docs README

    * Remove System dupe

    * [Monaco]Make minimap toggleable (#33742)

    * [Monaco]Fix Json format preview setting (#36867)

    * [KBM]Added option for exact match shortcut (#36000)

    * Added option for exact match shortcut

    * Fix spell-check

    * [Deps][Security]Update .NET Packages from 9.0.0 to 9.0.1  (#36879)

    * [Deps] Update NuGet packages to version 9.0.1

    Updated several NuGet packages from version 9.0.0 to 9.0.1, including:
    - Microsoft.Data.Sqlite
    - Microsoft.Bcl.AsyncInterfaces
    - Microsoft.Extensions.DependencyInjection
    - Microsoft.Extensions.Logging
    - Microsoft.Extensions.Logging.Abstractions
    - Microsoft.Extensions.Hosting
    - Microsoft.Extensions.Hosting.WindowsServices
    - Microsoft.Win32.SystemEvents
    - Microsoft.Windows.Compatibility
    - System.CodeDom
    - System.ComponentModel.Composition
    - System.Configuration.ConfigurationManager
    - System.Data.OleDb
    - System.Diagnostics.EventLog
    - System.Diagnostics.PerformanceCounter
    - System.Drawing.Common
    - System.Management
    - System.Runtime.Caching
    - System.ServiceProcess.ServiceController
    - System.Text.Encoding.CodePages
    - System.Text.Json

    * [Deps] Update NOTICE.md

    * [Peek]Fix using the correct Monaco assets at runtime (#36890)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area (#36769)

    * [Workspaces] fixing bug: editor starts outside of visible desktop area

    * Update src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    ---------

    Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>

    * [Workspaces] Saving app properties on launch and recapture (#36751)

    * [Workspaces] Implementing set and get GUID to/from HWND to distinguish windows moved by the Workspaces tool

    * After launch and capture copy the CLI args from the "original" project

    * Fix getting GUID

    * spell check

    * modification to be able to handle different data sizes on different systems

    * code optimisation

    * Replacing string parameter by InvokePoint

    * renaming variable

    * [AdvancedPaste]Use background thread for interactions between runner and Advanced Paste (#36858)

    * [Advanced Paste] Use background thread for runner-Advanced Paste interaction

    * Fixed typo

    * [VCM]Deprecate the Video Conference Mute utility (#36772)

    * Remove all VideoConferenceMute related code and files

    * Clean up vcm driver registry keys

    * Also remove the Webcam report tool

    * Also clean out video conference on the installer

    * Fix spellcheck

    * Remove comment about video conf

    * Update gpo files revision

    * Revert removing the VCM policies

    * Deprecate VCM GPO policy

    * Change deprecation message to show first supported version

    * Tweak supported strings in the adml

    * Goodbye friends, you are forever part of the team (#36905)

    * Goodbye friends

    Forever part of the team 😢

    * Update COMMUNITY.md

    * Fix formatting issues in COMMUNITY.md

    * [New utility]Sysinternals ZoomIt (#35880)

    * ZoomIt initial code dump

    * Change vcxproj to normalize dependency versions

    * Fix code quality to build

    * Add to PowerToys solution

    * Clean out C-style casts

    * Fix some more analyzer errors

    * Constexpr a function

    * Disable some warnings locally that it seemed better not to touch

    * Add ZoomIt module interface

    * Add GPO

    * Add Settings page with Enable button

    * Output as PowerToys.ZoomIt.exe

    * Extract ZoomIt Settings definition to its own header

    * Make ZoomItModuleInterface build with ZoomItSettings too

    * WinRT C++ interop for ZoomItSettings

    * From Registry To PowerToys Json

    * Properly fix const_cast analyzer error

    * Initial Settings page loading from registry

    * Zoom mode settings

    * Save settings

    * Add file picker and DemoType file support

    * Remaining DemoType settings

    * Have ZoomIt properly reloading Settings and exiting

    * Remove context menu entries for Options and Exit

    * ZoomIt simple Break Options

    * Break advanced options

    * Simple Record settings

    * Record Microphone setting

    * Fix break background file picker title

    * Font setting

    * Fix build issues after merge

    * Add ZoomIt conflict warning to Settings

    * Exclude Eula from spell checking

    * Fix spellcheck errors

    * Fix spell check for accelerated menu items

    * Remove cursor files from spellcheck. They're binary

    * Fix forbidden patterns

    * Fix XAML style

    * Fix C# analyzers

    * Fix signing

    * Also sign module interface dll

    * Use actual ZoomIt icon

    * Add OOBE page for ZoomIt

    * ZoomIt image for Settings

    * Flyout and Dashboard entries

    * Fix type speed slider labels

    * Correctly load default Font

    * Correctly register shortcuts on ZoomIt startup first run

    * Fix modifier keys not changing until restart

    * Show MsgBox on taken shortcut

    * Start PowerToys Settings

    * Normalize ZoomIt file properties with rest of PowerToys

    * Add attribution

    * Add ZoomIt team to Community.md

    * More copyright adjustments

    * Fix spellcheck

    * Fix MsgBox simultaneous instance to the front

    * Add mention of capturevideosample code use

    * Add ZoomIt to process lists

    * Add telemetry

    * Add logging

    * React to gpo

    * Normalize code to space identation

    * Fix installer build

    * Localize percent setting

    * Fix XAML styling

    * Update src/settings-ui/Settings.UI/Strings/en-us/Resources.resw

    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * Fix spellcheck

    * One more spellcheck fix

    * Integrate LiveDraw feature changes from upstream

    * Fix name reuse in same scope

    * Fix c-style casts

    * Also register LIVEDRAW_HOTKEY

    * Fix newLiveZoomToggleKey

    * Update LiveZoom description in Settings to take LiveDraw into account

    * Fix spellcheck

    * Fix more spellcheck

    * Fix Sysinternals capitalization

    * Fix ARM64 Debug build

    * Support Sysinternals build (#36873)

    * Remove unneeded files

    * Make build compatible with Sysinternals

    * Separate PowerToys ZoomIt product name (#36887)

    * Separate PowerToys ZoomIt product name

    To help maintain the Sysinternals branding in the standalone version.

    * Clarify branding-related includes

    * Remove ZoomIt.sln

    * Add foxmsft to spell-check names

    * Add ZoomIt to README

    * Add ZoomIt to GH templates

    * Add ZoomIt events to DATA_AND_PRIVACY.md

    * Remove publish_config.json

    * Remove publish_config.json from vcxproj too

    ---------

    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

    * [PTRun]Add hotkey to the show telemetry event (#36869)

    * [PTRun]Update the code for .NET 9.0.1 - remove workarounds (#36909)

    * Revove some unneeded changes after pdating to .net9.1

    * [RegistryPreview]Copy context menu, data tooltip, MULTI_SZ fix (#36631)

    * add context menus

    * string resources for contextmenu

    * fix line break parsing for MULTI_SZ

    * better presentation of multiline values and value tooltip

    * cleanup

    * [MWB] - refactoring "Common" classes - Common.Log.cs, Common.Receiver.cs (#35726)

    * [PTRun]Add setting for different trigonometric units in Calculator (#36717)

    * Added angle units to PowerToys Run Calculator plugin.

    * Update Resources.resx

    * Added GitHub SpellCheck rule for 'gradians'.

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [ci]Remove steps to build abstracted utilities packages (#36934)

    * [Settings]Update GPO infobar icon, improve some pages and fix bugs (#33703)

    * changes part 1

    * fix xaml code

    * changes part 2

    * fix cmdNotFound page

    * Update PowerOcrPage

    * More Pages changed

    * More Pages changed

    * revert temporary change

    * fix spelling

    * add resw comment

    * add resw comment

    * Update MouseWihtoutBorderPage.xaml

    * PowerPreview page

    * workspaces page

    * fix awake page gpo handling

    * NewPlus page

    * update new+ page!

    * AdvancedPaste.xaml: Move Info bar.

    * Update MouseJumpPanel.xaml

    * Update GeneralPage.xaml

    * fix position of info bar and some ui quirks

    * fix xaml style

    * fix string resources

    * string changes

    * prepare megre main

    * update new+ page

    * zoomit page

    * various fixes

    * [Common]NotificationUtil helper class with FileWatcher (#36720)

    * add NotificationUtil helper with file watcher and cache

    * fix spellcheck

    * indentation

    * [PTRun][Docs]Add YubicoOauthOTP to Third-Party plugins (#36761)

    * [PTRun]Fixed typo in Value Generator messages (#36951)

    * [AOT] Clean up some AOT issues in Advanced Paste module (#36297)

    * Clean up the aot build issue.

    * Merge main and clean up new AOT build issue

    * Update LogEvent define.

    * Update src/modules/AdvancedPaste/AdvancedPaste/Helpers/LogEvent.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * update typo bug

    * Remove unused allow list item

    * Create a new folder to place source generation context

    * Merge main and rename LogEvent to AIServiceFormatEvent

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * xaml format

    * [check-spelling] Update metadata

    Update for https://github.com/zadjii-msft/PowerToys/actions/runs/12884838755/attempts/1
    Accepted in https://github.com/zadjii-msft/PowerToys/pull/346#issuecomment-2604315393

    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    Co-authored-by: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com>
    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>
    Co-authored-by: Ionuț Manța <ionut@janeasystems.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>
    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>
    Co-authored-by: PesBandi <127593627+PesBandi@users.noreply.github.com>
    Co-authored-by: Wenjian Chern <55335597+Sophanatprime@users.noreply.github.com>
    Co-authored-by: Youssef Victor <youssefvictor00@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
    Co-authored-by: leileizhang <leilzh@microsoft.com>
    Co-authored-by: Den Delimarsky 🔐 <sign@den.dev>
    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>
    Co-authored-by: Shuai Yuan <128874481+shuaiyuanxx@users.noreply.github.com>
    Co-authored-by: moooyo <42196638+moooyo@users.noreply.github.com>
    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jerry Xu <n.xu@outlook.com>
    Co-authored-by: Demitrius Nelon <denelon@microsoft.com>
    Co-authored-by: Kai Tao <69313318+vanzue@users.noreply.github.com>
    Co-authored-by: Connor Plante <150482134+plante-msft@users.noreply.github.com>
    Co-authored-by: Connor Plante <connor.plante@gmail.com>
    Co-authored-by: Domen Soklič <soklicd@gmail.com>
    Co-authored-by: Hao Liu <liuhaobupt@163.com>
    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: immi <iafullprogrammer@gmail.com>
    Co-authored-by: Asif Islam <77113884+asif4318@users.noreply.github.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>
    Co-authored-by: Dave Rayment <dave.rayment@gmail.com>
    Co-authored-by: Neil McAlister <pingzing@users.noreply.github.com>
    Co-authored-by: Mark Russinovich <markruss@microsoft.com>
    Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com>
    Co-authored-by: John Stephens <johnstep@microsoft.com>
    Co-authored-by: Michael Clayton <mike@kingslandconsulting.co.uk>
    Co-authored-by: Nathan Gill <nathan.j.gill@outlook.com>
    Co-authored-by: Daniel Nilsson <daniel.nilsson1989@gmail.com>
    Co-authored-by: Stefan Markovic <stefansjfw@users.noreply.github.com>

commit 0b60644c57
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Fri Jan 17 14:02:21 2025 +0100

    Xaml format (#341)

commit 21c6f9674e
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Jan 17 06:42:06 2025 -0600

    Restore a minimized window, before we summon it (#340)

    Closes #327

    Pretty straightforward this. Just restore the window if we're minimized.

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 9b97db9cd8
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Fri Jan 17 07:05:37 2025 -0500

    Fix the Web Search Fallback Command (#325)

    The fallback command was still showing up on empty query because we weren't explicitly setting the underlying command name to the empty string when it is empty. This is what it looked like in the root view:

    ![image](https://github.com/user-attachments/assets/eff8249f-8acb-47ef-9529-86ebb7011811)

    This is a really small PR that just fixes that issue.

commit d53979bb5d
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Jan 17 06:04:46 2025 -0600

    Add a setting that controls if we go back home when summoned or not (#326)

    Adds a setting which controls what happens when you press the global hotkey.

    When enabled, the hotkey will bring you home when you activate the hotkey, rather than just leave the palette on the current page.

    Closes #271

commit a06750b18d
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Jan 17 06:04:25 2025 -0600

    Add tags to show which commands have aliases (#334)

    _targets #281_

    Adds tags onto top-level items that have an alias assigned to them

    ![image](https://github.com/user-attachments/assets/de2932ca-49f2-41d4-8e86-a96d3b85f42a)

    Closes #312

commit b86dfab994
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Jan 17 05:57:21 2025 -0600

    Use the SearchText from the extension (#319)

    And the placeholder text too.

    This one's mildly confusing, because we don't want the View and the Model fighting over the same exact property. Basically I just have the view be able to call the SearchText setter, and the model's PropChanged is listened to by the View. They shouldn't fight too much then.

    Closes #163
    Closes #112

commit 5873cacabe
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Jan 17 05:43:17 2025 -0600

    Add support for showing status messages in the host (#281)

    This PR is a ton of _plumbing_. UX-wise, this is very rough. What's more important in this PR is the broad wiring this does, to connect individual pages with the `IExtension` that's hosting them.

    `CommandPaletteHost` is the important new class that we're introducing. This is the class that implements the `IExtensionHost` interface, and is the one by which extensions can use to log messages back to the host.

    There's both:
    * A singleton instance of the `CommandPaletteHost`, which represents all global state,
    * per-extension instances of the `CommandPaletteHost`, which allows us to know which extension a message came from.

    When we fetch a command provider, we'll create a new `CommandPaletteHost` for that extension, and connect the extension to that instance.
    * Log messages from an extension go to the global list of messages, so those go to the global instance's list of `LogMessageViewModel`s
    * When an extension writes status messages, we'll add the messages to _that extension's_ `CommandPaletteHost`.
    * The `PageContext` is aware of the `CommandPaletteHost`, so it can now retrieve information about the hosting extension for that page. Since all pages for an extension share a single `CommandPaletteHost`, status messages can be shown across all the pages in that extension's context, then hidden when the user leaves that context.

    This also does part of #253, because now we have a `TopLevelCommandWrapper` AND a `TopLevelCommandItemWrapper`, separately. That lets us store the `CommandPaletteHost` in the `TopLevelCommandWrapper`, which we need so that when we activate a top-level command, we can fetch the extension host out of it and give it to the pages that follow.

    Also included is the "single builtin command provider" which is also in #264, because it's kinda insane to have things like "Quit", "Reload extension", "View log", things which are all _core pieces of the palette itself_, each need a separate provider. That's insane.

    I didn't add support for:
    * Extensions to hide messages once they're shown
    * I dunno if `PropChanged`'ing a status message works
    * I didn't add support for progress bars yet, because it's NOT TRIVIAL to replace the icon of an InfoBar with a progress wheel. What the heck WinUI 😠
    * Again, this is Programmer Xaml - we'll need real designers to come around and clean this up

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 7da291e398
Author: Mike Griese <zadjii@gmail.com>
Date:   Fri Jan 17 04:00:51 2025 -0600

    Add a ctor for Tag to initialize the text (#335)

    This is like, the 99% ues case, so it would be nice if this was easy.
    I'm also experimenting with making fewer instances of Tag objects, to
    see if that helps things. Not yet, but we'll see

commit 67eadef5bf
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Jan 17 04:00:09 2025 -0600

    Fix the tag crash (#339)

    Most of my notes are in #322. This one was a journey.

    The app was doing something re-entrant when we changed the selected item. It had nothing to do with `ScrollIntoView` (though, not calling that would stop the crash).

    Seems like that `ItemsList_SelectionChanged` -> `UpdateSelectedItemCommand` -> `WeakReferenceMessenger.Default.Send<ShowDetailsMessage>`, all on the UI thread, seemed to really make XAML mad. And a combination of hopping to the background thread, and debouncing the `ShowDetails` call, seemed to fix it.

    Tags made it worse - presumbaly it made the XAML layout pass take longer, which widened the window for the app to think it was re-entrant

    Closes #322

commit 8ed322cce3
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Jan 17 03:58:16 2025 -0600

    Use localappdata to store settings, instead of in WindowsApps (#304)

    I'm smarter than that, really.

    As described in #302. You can't write into `WindowsApps`, where actual packages are installed. Instead, you need to use the local app data path.

    This replicates logic that we've got in the Terminal, for getting the right LocalAppData path, without using Windows.Storage. Original code looks like:

    ```c++
    _TIL_INLINEPREFIX bool IsPackaged()
    {
        static const auto isPackaged = []() {
            UINT32 bufferLength = 0;
            const auto hr = GetCurrentPackageId(&bufferLength, nullptr);
            return hr != APPMODEL_ERROR_NO_PACKAGE;
        }();
        return isPackaged;
    }

    std::filesystem::path GetBaseSettingsPath()
    {
        static auto baseSettingsPath = []() {
            /* some portable mode code we don't need */

            wil::unique_cotaskmem_string localAppDataFolder;
            // KF_FLAG_FORCE_APP_DATA_REDIRECTION, when engaged, causes SHGet... to return
            // the new AppModel paths (Packages/xxx/RoamingState, etc.) for standard path requests.
            // Using this flag allows us to avoid Windows.Storage.ApplicationData completely.
            THROW_IF_FAILED(SHGetKnownFolderPath(FOLDERID_LocalAppData, KF_FLAG_FORCE_APP_DATA_REDIRECTION, nullptr, &localAppDataFolder));

            std::filesystem::path parentDirectoryForSettingsFile{ localAppDataFolder.get() };

            if (!IsPackaged())
            {
                parentDirectoryForSettingsFile /= UnpackagedSettingsFolderName;
            }

            // Create the directory if it doesn't exist
            std::filesystem::create_directories(parentDirectoryForSettingsFile);

            return parentDirectoryForSettingsFile;
        }();
        return baseSettingsPath;
    }
    ```

    I stuck this in a `Helpers.Utilities` class, because we will not be the only ones hitting this.

    Closes #302

commit b7c6c9c2df
Author: Niels Laute <niels.laute@live.nl>
Date:   Fri Jan 17 10:51:23 2025 +0100

    Refactoring and making Tag control actually work (#280)

    This PR:
    - moves the tag logic from the ListDetailsPage to the Tag control, so it can be re-used at other places as well.
    - provides a default style (that can be easily be extended / overriden) that is theme aware.
    - adds a BorderBrush property to the Tag viewmodel so that can be set as well

    Default dark:
    ![image](https://github.com/user-attachments/assets/a6dca711-a750-4ed5-89fe-03686f49b104)

    Default light:
    ![image](https://github.com/user-attachments/assets/56e0620b-b7d2-446b-b2c9-8ab9045e408f)

    Pokedex:
    ![image](https://github.com/user-attachments/assets/fe845496-a838-4e74-8b5a-139ed38720cc)

commit e0e13f5046
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 16 23:18:53 2025 -0600

    Fix FontIcon padding, again (#308)

    When we changed icons to be a pair of IconData in an IconInfo, I forgot this type check.
    Oops. Now it works again.

    Originally in #265
    Regressed in #286

    (targets #308, which targets #299)

    `IconData` and `IconInfo` are unfortunately, not trivially marshallable into the host process. This creates a collection of cases where an app can crash and take the host down, because we'll try to inquire something about the icon.

    It broke reloading when an extension crashed.
    It broke backing out of a crashed extension.

    Previously: #218
    Closes #235

commit 8744c79b96
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Jan 15 16:17:20 2025 +0100

    Fix bad merge (#331)

commit 1b1d65ef8d
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Jan 15 16:15:09 2025 +0100

    Merge upstream PT #7 (#330)

    * [Workspaces] implement the move feature (#35480)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * fix Move attribute after launch and snapshot

    * Extend WindowArranger with PWA functionality to detect different PWA apps. PwaHelper moved to the common library

    * fix repeat counter in the editor

    * Code optimization

    * code cleanup, optimization

    * fix double-processing window

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * [KeyboardManager]Fix mapping shift to numpad (#35890)

    * Keyboard Manger fix numpad as shift

    Fixed shift not being released if a numpad key as shift.

    * Added comments

    * Fix typo

    * Fix the numpad unlocked key not working if the locked version is overridden by shift

    * Fix spelling check.

    * Revert the VK_CLEAR change.

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [Analyzers] Update .editorconfig with rules to relax IDE errors (#36095)

    * [Analyzers] Remove duplicate pascal case style from .editorconfig

    * [Analyzers] Configured severity for individual IDE and CA rules showing as errors in VS

    Set severity for IDE0005, IDE0008, IDE0016, IDE0018, IDE0019, IDE0021, IDE0022, IDE0023, IDE0025, IDE0027, IDE0028, IDE0029, IDE0031, IDE0032, IDE0034, IDE0036, IDE0039, IDE0042, IDE0044, IDE0045, IDE0046, IDE0047, IDE0057, IDE0051, IDE0052, IDE0054, IDE0055, IDE0056, IDE0057, IDE0059, IDE0060, IDE0061, IDE0063, IDE0071, IDE0073, IDE0074, IDE0075, IDE0077, IDE0078, IDE0083, IDE0090, IDE0100, IDE0130, IDE160, IDE180, IDE0200, IDE0240, IDE0250, IDE0251, IDE0260, IDE0270, IDE0290, IDE0300, IDE0301, IDE0305, IDE1005, IDE1006, CA1859, CA2022, CA2263

    * [Analyzers] Fix mismatched analyzer descriptions

    * [Analyzers] Fix misspelling

    * Update .editorconfig

    Made the following style rules `silent` instead of `suggestion`:
    - Use explicit type instead of 'var'
    - Use expression body for ...
    - Use block-scoped namespace

    * [Analyzers] Set IDE0290 to silent

    * [Analyzers] Remove IDE1006 configuration from .editorconfig in favor of making exclusions for the few entries

    * [Analyzers][Indexer] Add IDE1006 suppressions

    * [Analyzers][Peek] Add IDE1006 suppression

    * [Analyzers][MWB] Add IDE1006 suppression.

    * [Analyzers][Plugins] Add IDE1006 suppression

    * [Analyzers][ImageResizer] Suppress IDE0073 to retain original copyright

    * [Analyzers] Remove IDE0073 severity change in .editorconfig

    ---------

    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>

    * [Workspaces] PWA follow-up (#36217)

    * [PTRun][Calculator]Allow scientific notation with lowercase 'e' (#36187)

    * [Workspaces] Add encoder parameter to bitmap.save() (#36228)

    * [Workspaces] Add encoder parameter to bitmap.save()

    * 1 more call fixed

    * Move repeated code to the csharp library

    * [Workspaces] Implement store of app window's size and position (#36086)

    * [Workspaces] Implement store of app window's size and position

    * Modifying the default values to -1. The program will use the original default values for the first run.

    * [ScreenRuler]Add setting to show the measurement in an extra unit (#35887)

    * display ruler: supporting millimeter and other units

    * Measurement Tool: UI Setting for an extra unit

    * Update images

    * spelling

    * spelling

    * suit code style

    * Fix for code review

    * remove weird file

    * rename field

    * [Deps]Update MSTest from 3.5.0 to 3.6.3 (#36115)

    * Update MSTest from 3.5.0 to 3.6.3

    * Use STA attributes that are now part of MSTest

    * Adding Jerry to community.md (#36232)

    Update COMMUNITY.md

    * [Workspaces] Arranger: smart timer (#36096)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] Arranger: Reset wait timer after each successful arrange action

    * fix merge error

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Upgrade to check-spelling v0.0.24 (#36235)

    This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24).

    A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur.

    There's a new accessibility forbidden pattern:

    > Do not use `(click) here` links
    > For more information, see:
    > * https://www.w3.org/QA/Tips/noClickHere
    > * https://webaim.org/techniques/hypertext/link_text
    > * https://granicus.com/blog/why-click-here-links-are-bad/
    > * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
    ```pl
    (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\()
    ```

    There are some minor bugs that I'm aware of and which I've fixed since this release, but I don't expect to make another release this month.

    I've added a pair of patterns for includes and pragmas. My argument is that the **compiler** will _generally_ tell you if you've misspelled an include and the **linker** will _generally_ tell you if you misspell a lib.

    - There's a caveat here: If your include case-insensitively matches the referenced file (but doesn't properly match it), then unless you either use a case-sensitive file system (as opposed to case-preserving) or beg clang to warn, you won't notice when you make this specific mistake -- this matters in that a couple of Windows headers (e.g. Unknwn.h) have particular case and repositories don't tend to consistently/properly write them.

    * Adjust to community.md, shifting jerry's github user name (#36242)

    Update COMMUNITY.md

    * [AOT compatible] Resolve AOT Build Error in Peek.UI (#36194)

    * add partial for aot support

    * add Microsoft.NET.ILLink.Tasks to packages.props

    * format

    * Revert "format"

    This reverts commit 742d5e2214.

    * add Microsoft.NET.ILLink.Tasks to notice.md

    * add auto reference

    * update script to remove the 'Auto-reference line'

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Awake Updates - `TILLSON_11272024` (#36049)

    * Update with bug fixes for tray icon and support for parent process

    * Process information enum

    * Update the docs

    * Fix spelling

    * Make sure that PID is used in PT config flow

    * Logic for checks based on #34148

    * Update with link to PR

    * Fixes #34717

    * Small cleanup

    * Proper task segmentation in a function

    * Cleanup the code

    * Fix synchronization context issue

    * Update planning doc

    * Test disabling caching to see if that manages to pass CI

    * Cleanup to make sure that we're logging things properly.

    * Update ci.yml

    * Disable cache to pass CI

    * Retry logic

    * Cleanup

    * Code cleanup

    * Fixes #35848

    * Update notes and codename

    * After third attempt, log error instead of throwing exception

    * More cleanup to avoid double execution

    * Add expected word

    * Safeguards for bad values for timed keep-awake

    * More updates to make sure I am using uint

    * Update error message

    * Update packages

    * Fix notice and revert CsWinRT upgrade

    * Codename update

    * Update expect.txt

    * Update the struct

    * Ensuring we're properly awaiting tray initialization

    * Update to make sure tray reflects the bound process

    * Cleanup, proper JSON serialization for logs.

    * Not needed.

    * Add command validation logic

    * Moving the initialization logic earlier

    * Make sure we show the display state in the tooltip

    * Update tray string

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update logic for icon resets

    * Update doc

    * Simplify function for setting mode shell icon

    * Issues should be properly linked

    * Minor cleanup

    * Update timed behavior

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Workspaces] detecting right app version (#36100)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] fix detection of specific version of apps

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Move the XamlStyler config to src/ (#36202)

    my never ending goal to minimize files in the root dir

    * [AdvancedPaste]Add Semantic Kernel opt-in to allow chaining of paste actions (#35902)

    * [AdvancedPaste] Semantic Kernel support

    * Changed log-line with potentially sensitive info

    * Spellcheck issues

    * Various improvements for Semantic Kernel

    * Spellcheck issue

    * Refactored Clipboard routines

    * Added integration tests for KernelService

    * Extra telemetry for AdvancedPaste

    * Added 'Hotkey' suffix to AdvancedPaste_Settings telemetry event

    * Added IsSavedQuery

    * Added KernelQueryCache

    * Refactoring

    * Added KernelQueryCache to BugReportTool delete list

    * Added opt-n for Semantic Kernel

    * Fixed bug with KernelQueryCache

    * Ability to view last AI chat message on error

    * Improved kernel query cache

    * Used System.IO.Abstractions and improved tests

    * Fixed under-count of token usage

    * Used Semantic Kernel icon

    * Cleanup

    * Add missing EndProject line

    * Fix dependency version conflicts

    * Fix NOTICE.md

    * Correct place of SemanticKernel in NOTICE.md

    * Unlinked CustomPreview toggle from AI

    * Added Microsoft.Bcl.AsyncInterfaces dependency to AdvancedPaste

    * Fixed NOTICE.md order

    * Moved Custom Preview to behaviour section

    * Made Image to Text raise error on empty output

    * Added AIServiceBatchIntegrationTests

    * Updated AIServiceBatchIntegrationTests

    * Added prompt moderation

    * Moved GPO Infobar to better location

    * [Launcher]Port from WPF-UI to .NET 9 WPF (#36215)

    * Initial implementation

    * Fix fluent style

    * Fix no endline

    * Update expect.txt

    * Fix formatting

    * Fix light theme looking bad on Windows 10

    * fix formatting

    * test change

    * Now really fixed W10

    * Add a comment

    * Fix typos

    * Fix spellcheck errors

    * Fix spellcheck pattern for websites

    * Change patterns for spellcheck in the right file

    * Fix XAML styling

    * Fix contrast colors on W11

    * Fix formatting

    * Removed emty line

    * Fix formatting

    * Added comment to fluentHC file

    * fix comment

    * Fix Windows10 again.
    Adress feedback.

    * W11 fix chaning from high contrast to normal not having correct background

    * W10 Fix high contrast not working after switching from light/dark moed

    * Address feedback

    * Fix formatting

    * Second W11 fix chaning from high contrast to normal not having correct background

    * [UX]Updating New+ and Settings icons (#36290)

    * Updated icons

    * Updating more icons and icos

    * [Settings][Dashboard] Accessibility fixes (#36280)

    * make narrator announce buttons/toggles

    * add toggles module name

    * [ci]Sign OpenAI dll that's not signed (#36299)

    * Update CODEOWNERS to include gordon, jerry and kayla (#36308)

    * Update CODEOWNERS

    * Update names.txt

    * Making the powertoys-code-owners team code owners (#36310)

    * Update CODEOWNERS

    * Update names.txt

    * Update CODEOWNERS

    * [FZEditor]Fix Create new layout dialog radio buttons IsChecked values  (#36320)

    * 0.87 changelog (#36335)

    * 0.87 changelog

    * Fix spellcheck

    * Update README.md

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * [PTRun]Fix WPF transparent border issue on Windows 10 (#36392)

    * Added border on W10

    * Added a comment

    ---------
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>

    * [PTRun]Fix .NET 9 crash in OneNote (#36417)

    * Fix crash in OneNote Run

    * added better comment

    * [AdvancedPaste]Fix NullReferenceException on Dispose (#36428)

    [AdvancedPaste] Fixed NullReferenceException on Dispose

    * [Fuzz] Add fuzz testing for AdvancedPaste and new pipeline for onboarding OneFuzz (#36329)

    * add fuzz

    * install .net8

    * add spelling check

    * refine the pipeline

    * add readme and update the test code

    * fix spelling error

    * change to weekly run

    * Add New CI Pipeline for Latest WindowsAppSDK (#36282)

    This PR introduces the following changes to the CI pipeline and version management:

    Pipeline Enhancements:
    1. Added a new script UpdateVersions.ps1 to automate the update of Microsoft.WindowsAppSDK versions across various project files.
    2. Introduced a new pipeline configuration ci-using-the-latest-winappsdk.yml to build using the latest Microsoft.WindowsAppSDK.
    3. Updated existing pipeline configurations to support the new useLatestWinAppSDK parameter.

    Pipeline Configuration Updates:
    1. Updated job-build-project.yml to handle the useLatestWinAppSDK parameter and adjust the RestoreAdditionalProjectSourcesArg accordingly.
    2. Added a new template steps-update-winappsdk-and-restore-nuget.yml for updating and restoring NuGet packages with the latest Microsoft.WindowsAppSDK.
    3. Added WinAPPSDK version selection, the pipeline can be manually triggered to use the specified version.

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [AOT compatible] Make HostsUILib become AOT compatible (#36136)

    * Remove AOT configuration

    * Refer to AOT compatibility props

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [AOT compatible] Clean up some AOT build issue in FilePreviewCommon and MarkdownPreviewHandler (#36207)

    * Use AppContext.BaseDirectory to replace assembly.GetExeAseembly.Location.
    Fix json serilizer aot issue.

    * clean up some AOT build issue

    * Update src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandlerControl.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Update src/common/FilePreviewCommon/Formatters/JsonFormatter.cs

    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>

    * Add new pipeline using the latest webview2 from Edge Canary (#36317)

    * using the latest webview2 for testing

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Bug fix] Making the OpenAI key configuration page scrollable. (#36359)

    * Fixed #34470

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>

    * [Bug fix] Add a format validation step before format conversion. (#36404)

    This PR aims to fix the bug #35225 by introducing a new method IsJson to determine if a given text is in JSON format.
    The IsJson method is then utilized in the ToJsonFromXmlOrCsvAsync method to optimize the processing logic.
    If the text is already in JSON format, it is returned directly without further conversion from XML or CSV.

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    * Add more STCA team members (#36438)

    * Add more STCA team members

    * Include more spelling check errors

    * Remove non-alpha in dictionary

    * Add Zhaopeng Wang

    * Fix spell checking error

    * Remove "prerelease: true" (#36484)

    * Remove "prerelease: true"

    The Microsoft.WinGet.DSC module is GA so prerelease: true is no longer needed.

    * Update expect.txt

    fixing spellcheck warning

    ---------

    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Docs]Update README for 0.87.1 release (#36534)

    * [CI] Enhance build Pipeline Reliability with Retry Logic and Improved Error Messaging (#36529)

    * update pipeline with retry

    * remove tests

    * Add team member (#36590)

    * [New+]Don't override New actions from Explorer on Windows 10 (#36467)

    * [New+]Don't override New actions from Explorer

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp

    * Add pattern for learn.microsoft links

    * Also only Query for context menu

    * [PTRun][Calculator]Handle hexadecimal numbers to not return divide by 0 error (#36390)

    * add '0x' handling for divide by 0 scenarios

    * fix comment on division by 0 check

    ---------

    Co-authored-by: Connor Plante <connor.plante@gmail.com>

    * [TextExtractor]Minor UI/Accessibility fixes in the overlay UI (#36356)

    minor UI and accessibility fixes

    * [PTRun][Calculator]Update mages to v3.0.0 and support for `randi(n)` (#36560)

    * update to mages 3.0.0

    * allow randi() in calculator plugin

    * fix tests and input validation

    * fix spell check

    * [QuickAccent]Added ć for Slovenian (#36336) (#36338)

    * Fix snapping Workspaces Editor to Fancy Zones (#36463)

    * Remove Workspaces Editor from Fancy Zone's excluded app list

    * removed unused string

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>

    * [PTRun]Fix drag on .NET 9 WPF (#36635)

    * [CQ]Continued to move stuff out of root - Solution.props (#36244)

    * [QuickAccent]Add Proto-Indo-European (#36408)

    * Add ḱ to PowerAccent for Proto-Indo-European

    * Fix Spelling Check

    * Add more letters to PIE

    * Order PIE after PI

    ---------

    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [PTRun]Add context buttons for VSCodeWorkspaces plugin (#36517)

    * [Settings][QuickAccent]Change 'character set' to plural form (#36565)

    * [PTRun][Calculator]Fix unit tests on non-english systems (#36569)

    * fix tests

    * update comment

    * [PTRun][Calc]Improve handling of non-base 10 numbers (#36700)

    * [Settings][PTRun]Show plugin version and website (#36580)

    * [Monaco]Add support for .resx and .resw preview support. (#36499)

    Added support for .resx and .resw preview support. These files are XML based files so I added the file extensions as part of the registerAdditionalLanguage("xmlExt"...) function.

    * [Settings] Add Workspaces' workspaces.json file to backup/restore list (#36714)

    * [Localization] Fix loc pipeline to send downloaded localized files to TDBuild upon retry after failure (#36766)

    * [AdvancedPaste]Fixed issues with Screen Reader integration (#36778)

    * Remove Advent calendar from README (#36777)

    * Remove Advent calendar from README

    * Update hero image

    * Delete doc/images/overview/PT_holiday_hero_image.png

    * [AdvancedPaste]Add all BitmapDecoder supported image filetypes to ImageToText (#35600)

    Adds support to ImageToText for all image filetypes supported by BitmapDecoder.

    * [AOT]Clean up some AOT build issues in PowerAccent.Core (#36264)

    * init

    * Use AotCompatibility instead

    * Replace typeof(Lanaguge) with GetValues<Language>

    * Create new folder to place source generation context file.

    ---------

    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>

    * [WinUI3]Fix Windows 10 title bar borders (#36429)

    * Fix borders for windows in the Settings UI

    * Fix HOSTS window

    * Fix Advanced Paste

    * Fix Environment Variables

    * Fix File Locksmith

    * Fix Peek, with a caveat

    * Fix Registry Preview

    * Remove unused imports

    * Clean up imports in OobeShellPage

    * Move OSVersionHelper from Common.UI up into ManagedCommon

    * [QuickAccent]Fix unstable language loading (#36721)

    * [Peek]Bring into foreground if previously minimized (#36506)

    Added Activate() to bring Peek.UI window into focus upon Toggle. This allows the UI to be presented even if it was previously minimized.

    * Update Run docs README (#36857)

    * Update Run docs README

    * Remove System dupe

    * [Monaco]Make minimap toggleable (#33742)

    * [Monaco]Fix Json format preview setting (#36867)

    * [KBM]Added option for exact match shortcut (#36000)

    * Added option for exact match shortcut

    * Fix spell-check

    * [Deps][Security]Update .NET Packages from 9.0.0 to 9.0.1  (#36879)

    * [Deps] Update NuGet packages to version 9.0.1

    Updated several NuGet packages from version 9.0.0 to 9.0.1, including:
    - Microsoft.Data.Sqlite
    - Microsoft.Bcl.AsyncInterfaces
    - Microsoft.Extensions.DependencyInjection
    - Microsoft.Extensions.Logging
    - Microsoft.Extensions.Logging.Abstractions
    - Microsoft.Extensions.Hosting
    - Microsoft.Extensions.Hosting.WindowsServices
    - Microsoft.Win32.SystemEvents
    - Microsoft.Windows.Compatibility
    - System.CodeDom
    - System.ComponentModel.Composition
    - System.Configuration.ConfigurationManager
    - System.Data.OleDb
    - System.Diagnostics.EventLog
    - System.Diagnostics.PerformanceCounter
    - System.Drawing.Common
    - System.Management
    - System.Runtime.Caching
    - System.ServiceProcess.ServiceController
    - System.Text.Encoding.CodePages
    - System.Text.Json

    * [Deps] Update NOTICE.md

    * Fix bad merge

    * [check-spelling] Update metadata

    Update for https://github.com/zadjii-msft/PowerToys/actions/runs/12790673218/attempts/1
    Accepted in https://github.com/zadjii-msft/PowerToys/pull/330#issuecomment-2593053640

    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>

    ---------

    Signed-off-by: Shawn Yuan <shuai.yuan.zju@gmail.com>
    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    Co-authored-by: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com>
    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>
    Co-authored-by: Ionuț Manța <ionut@janeasystems.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>
    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>
    Co-authored-by: PesBandi <127593627+PesBandi@users.noreply.github.com>
    Co-authored-by: Wenjian Chern <55335597+Sophanatprime@users.noreply.github.com>
    Co-authored-by: Youssef Victor <youssefvictor00@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
    Co-authored-by: leileizhang <leilzh@microsoft.com>
    Co-authored-by: Den Delimarsky 🔐 <sign@den.dev>
    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>
    Co-authored-by: Shuai Yuan <128874481+shuaiyuanxx@users.noreply.github.com>
    Co-authored-by: moooyo <42196638+moooyo@users.noreply.github.com>
    Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
    Co-authored-by: Jerry Xu <n.xu@outlook.com>
    Co-authored-by: Demitrius Nelon <denelon@microsoft.com>
    Co-authored-by: Kai Tao <69313318+vanzue@users.noreply.github.com>
    Co-authored-by: Connor Plante <150482134+plante-msft@users.noreply.github.com>
    Co-authored-by: Connor Plante <connor.plante@gmail.com>
    Co-authored-by: Domen Soklič <soklicd@gmail.com>
    Co-authored-by: Hao Liu <liuhaobupt@163.com>
    Co-authored-by: Hao Liu (from Dev Box) <haoliu3@microsoft.com>
    Co-authored-by: immi <iafullprogrammer@gmail.com>
    Co-authored-by: Asif Islam <77113884+asif4318@users.noreply.github.com>
    Co-authored-by: Kayla Cinnamon <cinnamon@microsoft.com>
    Co-authored-by: Dave Rayment <dave.rayment@gmail.com>
    Co-authored-by: Neil McAlister <pingzing@users.noreply.github.com>
    Co-authored-by: Stefan Markovic <stefansjfw@users.noreply.github.com>

commit d970a686ee
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Jan 15 11:02:16 2025 +0100

    Generate msix package for local build (#329)

commit 9448d0fb56
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Tue Jan 14 12:17:01 2025 +0100

    Xaml format (#328)

commit 30fe5e8d76
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Jan 13 14:54:29 2025 -0600

    Fix clicks not working on the top half of the back button (#301)

    Hey guess what, 24px is too tall! If you reserver 24 for the titlebar
    "drag area", it'll steal input from the top half of the back button,
    making it un-clickable. fun!

commit 664218af82
Author: Seraphima Zykova <zykovas91@gmail.com>
Date:   Mon Jan 13 23:49:57 2025 +0300

    [Indexer] Results ordering (#298)

    Changed results ordering to achieve the same relevance as in the current PT Run Indexer.

    Also adds fuzzy match support

commit df7878342b
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Jan 13 14:48:32 2025 -0600

    Add a setting to control if details are shown for apps (#300)

    Adds a setting to control if the `Details` pane is shown for apps on the main page or not. I'm defaulting this to off, because that pane doesn't add any value currently.

commit 72f2907485
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Jan 13 10:48:11 2025 -0600

    Fix the icons on Window Walker (#310)

    The ListItems were having their icons manually initialized to `icon`, which was always passed as `string.Empty`.

    I suspect this is vestigial from PT Run - where the icon would be paseed in based on the theme. This prevented us from being able to fall back to the icon from the command, which is where we stuck the actual icon

commit 36635379ce
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Jan 13 08:56:30 2025 -0600

    Add support for different "branding" for CmdPal (#299)

    The meat of this PR is in `Microsoft.CmdPal.UI\CmdPal.Branding.props`.

    **TL;DR**: You can build cmdpal locally and have it not conflict with the selfhost build, allowing you to use the selfhost CmdPal while _also_ building and testing new features in a _separate_ package.

    This PR allows us to have different packages deployed by the build, depending on the "branding" of cmdpal which you're building. It's highly cribbed from the Terminal's concept of branding.

    This is all keyed off the `CommandPaletteBranding` property. This accepts different values:
    * `Release` / `Preview` / `Canary`: These are all the same currently. This is the "release" / "stable" branded version
    * `Dev` (or omitted, which is the default for local builds): Build the "dev" version of the package

    closes #297

    Co-authored-by: Stefan Markovic <stefan@janeasystems.com>

commit f5aff80b88
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Fri Jan 10 09:08:00 2025 +0100

    Install msix on PT install (#296)

    * Refactor package.h

    * Install on install

    * Fix install, remove package on uninstall and some auto-format

    * Start on enable() and close on PT close

    * Fix build

    * Change settings to toggle. If not installed, install on enable

    * Fix disable

    * Add infobar to PT Run page

    * Remove trailing sln project

    * remove reference

    * Remove comment

commit d1c7b3e2da
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 9 17:23:56 2025 -0600

    Fix the reload extensions command item (#241)

    This never got hooked up in TRA. Now it is.

    And it actually does things smartly - it'll dismiss all the old extension instances, then re-populate all of them. Really helpful for testing extensions. You don't need to keep re-launching the palette, you can just reload and presto - we'll release the old package, let the new one deploy, then load the new one.

    It also revealed that we were updating the `.SearchText` from #234 on the UI thread. Oh no! Can't do that - that might be a x-proc call. Very bad. So that fixes this.

commit 9292658981
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Thu Jan 9 15:02:39 2025 -0800

    Add `??` alias to TRA for web search plugin (#295)

commit 2efdbb6cbd
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 9 16:30:25 2025 -0600

    Allow both light and dark icons (#286)

    This adds one _last_ change to the API to allow apps to specify different icons for light and dark mode.

    If it's important to an app to specify different icons for light vs dark mode, then `IconInfo` is exactly what you want to use. It contains _two_ `IconDataType`s, for two different icons. Simple as that.

    And to keep things even easier, I slapped on a `IconInfo(string)` constructor, so that you can easily build a `IconInfo` with both icons set to the same string. Especially useful for font icons, which we're using everywhere already. That allows almost all the extensions to have _no code change_ here, so that's super!

    Some of the places where we were evaluating if an icon existed or not - that needs to move into the view. `ShellPage.xaml.cs` does one variant of that already for `IDetails.HeroImage`. The view is the only part of the app that knows what the theme is.

    Closes #78

commit f679c88a16
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 9 16:05:02 2025 -0600

    Implement Allowing CommandProviders to ItemsChanged themselves (#289)

    This is the implementation of what was spec'd in #282.

    When we get an `ItemsChanged`, we'll look through the top level commands, slice out all the old ones, then fetch the new ones and stitch them in the same place in the list.

    I've only implemented it for the Bookmarks provider so far.

    Closes #277

commit 9eafc8346e
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 9 16:04:29 2025 -0600

    Spec `GoToPageArgs.NavigationMode` (#294)

    As discussed in #273.

    This will allow extensions that want to navigate around the page stack
    more control.

    For example, the Obsidian Notes extension will want to start with a form
    for "Set up vault path". When they submit, instead of just going
    home, they'll want to GoToPage('com.obsidian.notes', mode=GoHome), so
    that submitting the form takes them to the notes list, rather than just
    _home_.

    Doesn't actually implement this, of course. Just gets the API ready for
    it.

commit 4b9b15f493
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 9 13:16:09 2025 -0600

    Fix `Loading` on pages (#290)

    This subtly regressed in #244, so subtly that I didn't really notice it till I fixed it.

    In that PR, we replaced the `visibility` binding of the `ProgressBar` with a binding to `IsInitialized`. For most pages, this actually just works fine - they're only initialized once they return some results. And most pages are only loading until they first return something.

    But the trick is with pages that do some `Loading` _after_ they're initialized. For them, the progress bar never shows up, because `Initialized` is already true.

    I actually only stumbled upon this because of a totally different bug (which this also fixes).

    In rare cases we'd load a little out of order, and the ShellPage would try to determine if it should hide the `ErrorMessage` or not. About 25% of the time, it would evaluate `{x:Bind ViewModel.CurrentPage.ErrorMessage, Converter={StaticResource StringNotEmptyToVisibilityConverter}, Mode=OneWay}` _before_ the `CurrentPage` got set, so it would show it initially. That looked real janky.

commit 0bd356c11c
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 9 12:44:47 2025 -0600

    When an extension item fails to load, replace it with an error item (#293)

    Right now, the main page really explodes if an extension dies. It really does not like it.

    Instead, this PR changes it so that if we fail to load the properties from an ICommandItem, we won't kill the whole page, we'll just replace that _single_ item with an error item. The item _would_ look like:

    ![image](https://github.com/user-attachments/assets/c5e74af1-5d79-47db-81f9-ab6ea1448881)

    however, we ended up just silently ignoring the item entirely.

commit d7c2037955
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Jan 9 12:22:27 2025 -0600

    Add some padding for font icons (#265)

    Random nits, part the first.

    Emoji render just a little too big currently, and they get clipped.

    This PR fixes that, by making emoji icons have just a bit of negative padding, to give them space to not get clipped.

    Is also replaces the icons on the Services page, because the icon on the list items was the icon of the thing to do to the service (i.e. running services would have a "stop" icon, which is insane). Of course, this made the emoji problem much more apparent.

commit 8e66d8ec5b
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 9 10:10:53 2025 -0600

    Fix the KB control build, part the second (#292)

    Okay I made everything worse in #291, this should actually fix it.

    I have no idea why it passed before. Must have been branched from before the upstream change

commit e0654bc88a
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 9 09:09:05 2025 -0600

    Fix the namespaces for the pilfered KB control (#291)

    When I pilfered the ShortcutControl, I didn't change the namespaces at
    all. I also didn't build the whole PT sln.

    After the latest merge with upstream, either I built more or new rules
    got added, and now there are conflicts, since the same exact type is
    being built in two places.

    Easy enough to fix that

commit fe2927b683
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Thu Jan 9 07:08:31 2025 -0800

    Add WebSearch Plugin from PT Run (#209)

    This PR Adds the equivalent functionality as the web search plugin from PT Run:

    ![image](https://github.com/user-attachments/assets/d82d449c-e36c-46a4-9a8d-308d610f1dd4)

    ![image](https://github.com/user-attachments/assets/f9c97988-4c2a-4bba-b652-75c493bad1c4)

    I also took a spin at adding history items (new concept for plugin) so that users in theory can quickly launch previous queries. You can configure the number of items to show up in your history in the settings of course!

    ![image](https://github.com/user-attachments/assets/102dadad-651b-4d25-9d62-82277cdb0cfe)

    ![image](https://github.com/user-attachments/assets/50ca0847-fbc5-4309-806a-f10839473f70)

    And we got the fallback handler working naturally:

    ![image](https://github.com/user-attachments/assets/eaca73dc-c880-4b00-87e3-c849c1a7ee45)

commit d9ce0e8eae
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Thu Jan 9 15:42:39 2025 +0100

    Merge upstream PT #6 (#288)

commit 750408629a
Author: Seraphima Zykova <zykovas91@gmail.com>
Date:   Thu Jan 9 17:40:36 2025 +0300

    Indexer pagination (#287)

    Added pagination and updated fetching results to improve performance.

commit 6149981428
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Jan 9 07:00:38 2025 -0600

    Add a settings page (#264)

    I just wanted to make loading JSON settings a little easier.

    * "Well, these `SettingsManager` classes all do the same thing, what if they shared a base class?"
    * "You know, I bet I could put all the built-in settings into one file if we 'namespaced' the individual settings"
    * "Hey what about those bodgy core settings pages, those need to be not just an adaptive card"
    * "Woah, the `SettingsCard` in the toolkit is really cool"
    * "Dang look I bet I can stick all the extensions into that page pretty trivially"
    * "Okay it wasn't that trivial but hey it works, and it's awesome"
    * "You know, PT already has this awesome keybinding editor. How hard could that be to stick in there"
    * "Once again, pretty hard, but that mostly works"
    * "Yes, yes, resources, we need localization, that's not too hard"
    * "Yea saving to a file isn't too hard"
    * "I should probably use that hotkey setting when we actually bind the key"

    and then accidentally the whole thing
    ![image](https://github.com/user-attachments/assets/fabfc09f-b155-482d-9805-7ec79369d043)

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 55f4632ad8
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Jan 8 15:36:50 2025 -0600

    Fix form submits, once and for all (#284)

    if you don't hang onto a reference to the RenderedAdaptiveCard, then the GC might clean it up sometime, even while the card is in the UI tree. If this gets GC'd, then it'll revoke our Action handler, and the form will do seemingly nothing.

commit a56916fc33
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Jan 7 14:44:35 2025 -0600

    Format will complain about trailing whitespace (#285)

    oops

commit dcb15db3c8
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Tue Jan 7 12:23:04 2025 -0800

    Change single/double click behavior on list items (#259)

    This PR adjusts the UX for single-clicking / double-clicking on list items. With this change:

    - A single-click on a list item will navigate the user to that list item. It will not automatically invoke the associated command.
    - A double-click on a list item will invoke the command for the list item.

    It is a really small code change, _but_ I have a suspicion that there are cleaner ways to handle what I'm doing. Since it is so small, I figured just creating the PR and getting quick @zadjii-msft feedback would do the trick.

commit 77cdd2bc9f
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Tue Jan 7 11:24:55 2025 -0800

    Change the default debounce timer from 100ms to 50ms (#283)

    PowerToys Run has 50ms as the default input smoothing:

    ![image](https://github.com/user-attachments/assets/69a8b823-b6ed-46b6-afbf-08209e10b97a)

    This PR simply changes the current value from 100ms to 50ms. This causes a noticeable improvement for fast typers.

commit c275f07f64
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Jan 7 13:19:01 2025 -0600

    Fix all the broken form pages (#266)

    Random nits, part the second

    TRA is particular about form pages. It'll actually break itself if an extension throws an exception (which it should do). The POC was more forgiving (but technically incorrect)

    Well, turns out, all the form pages we had did not give an F and just threw exceptions. They shouldn't! That's bad!

commit bbff0fe7ab
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Tue Jan 7 04:48:39 2025 -0800

    Backspace on empty query in FilterBox navigates back (#260)

    This is a feature request @plante-msft has had for a while, but I don't see an open issue for it.

    Does what title says, navigates backwards when a user types `Backspace` and the filterbox is already empty.

    The functionality works as follows:

    1. If a user presses down on the backspace key with an empty query and holds the backspace key, cmdpal will not navigate back until the key is released

    2. If a user presses down on the backspace key with a non-empty query and holds the backspace key, cmdpal will not navigate back even after the key is released. This is to ensure that folks can hold backspace and delete the entire text field without inadvertently getting sent backwards in the flow. In this case, they would have to explicitly hit backspace again.

    TLDR - hitting backspace will only ever navigate back on release AND if backspace was originally hit with an empty query.

commit 0a22219080
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Jan 7 06:40:52 2025 -0600

    Allow CommandProviders to ItemsChanged themselves (#282)

    Specs out #277

    Extensions might want to change their list of top-level commands. Classic example is the bookmarks provider, or the spongebot.

    The API needs to allow this. This wasn't a problem in the prototype, because the prototype literally fetched the commands every time it went home.

commit 182d2b2546
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Jan 7 06:35:33 2025 -0600

    Support CommandResult.GoBack in the host (#279)

    I think I added this to the spec while there was like, 80 branches flying around and never actually merged support for it in the host app. Oops.

commit 9c416a01db
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Jan 7 06:33:31 2025 -0600

    Update observable content on the UI thread (#278)

    Both these methods are operating on a BG thread, not the UI thread. They can't touch the ObservableCollection, otherwise they'll just throw exceptions.

commit 6a505cd773
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Jan 7 06:24:26 2025 -0600

    Tags should be Mode=OneWay in the XAML (#275)

    Yea, this one's stupid. I spent too long debugging why changing the list
    of tags in an extension didn't do anything. Turns out, we just never had
    XAML listen for the PropertyChanged. That hurts.

commit b40874a7ad
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Jan 7 06:23:35 2025 -0600

    Spec out empty content (#272)

    Specs #261

    ##### Empty content

    Developers can specify an `EmptyState` to customize the way the list page looks
    when there are no search results. This will control what's displayed to the user
    when both:
    * `IsLoading = false`
    * `GetItems()` returns null or an empty list

    This property is observable like anything else, which allows developers to
    change the empty state contextually. For example, consider a "search winget"
    extension:

    * If the user hasn't typed anything yet -> `Title="Start typing to search winget"`
    * If the user has typed and no results were found -> `Title="No results found"`,
      `Subtitle="Your search '...' returned no packages on winget"`

commit de7fc855f8
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Jan 7 06:20:16 2025 -0600

    Introduce an `Id` property for command providers (#269)

    Originally a part of #264

    I need command providers to have an ID, so that we can differentiate between multiple providers in the same package.

    It's really only relevant for _us_, but I don't know what the future has in store for us.

    Also includes a minor refactoring that combines a couple of the built-ins into a single provider. Reload and quit aren't really separate from _the app itself_.

commit 86c614dc59
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Jan 7 06:17:38 2025 -0600

    Actually add all the commands to the context menu (#267)

    Whoops. Looks like the context menu was pretty specifically _not_
    getting initialized with the default command. It definitely should.

commit 3a1f88cfdf
Author: Michael Hawker MSFT (XAML Llama) <24302614+michael-hawker@users.noreply.github.com>
Date:   Tue Dec 31 10:13:57 2024 -0800

    Centralize Loading code for Shell/Pages (#244)

    ## Summary of the Pull Request

    This PR is ready to review with a bunch of code clean-up around shell and page initialization/navigation, progress, errors, and the back button.

    There's still some future items to think about, but that's beyond the scope of this work right now. See more notes in comments below on changes:

    > Alright, I cleaned up all the Page Initialization and Navigation code for Shell, it's all centralized there now (which makes sense) and removes 3x duplicated code we had in the ExtPage templates. They're just basic XAML controls now which don't really need to worry about how they get loaded, and just get their VMs.
    >
    > I also tidied up the massive if statement we had in ShellPage.xaml.cs for each page type so we have a singular logical flow that just branches in two statements with an inline switch for the VM constructor and the page type.
    >
    > In the future, we may want to cache some page VMs there, so if you navigate back/forth we don't reload everything...
    >
    > This also let us remove a message which was effectively just internal communication. Should be a bit cleaner now, certainly easier to add new page types now too.

    These are some of the last remnants of things from the original MVVM setup when we were still testing patterns and then just copied.

    This uses `IsInitialized` for tracking the progress bar and bubbles up errors better without blocking the app (and provides better context for errors).

    This also fixes the issue with the Back Button stealing focus instead of the search box (by moving it to the Shell page to leave the SearchBox control as just responsible for the searchbox/keyboard input).

    -------

    Future Open questions/TODO:
    - [ ] How do we better track the parent extension/owner of pages/commands/etc... for error reporting?
    - [x] Need to clean-up backend logic of VMs for the loading state for the new Shell page centralization
      - [x] For instance, progress only happens like once now...
      - [x] May be able to centralize some of the loading bits logic?
    - [x] Finalize some brushes for error items
    - [ ] Still need to potentially track individual issues loading specific items, but maybe this is a good enough start for a single PR once the above are addressed?
    - [ ] Cache page VMs?
    - [ ] Clean-up async loading of pages and their content

    Helps with #220.
    This will make #238 easier as then we don't need as much XAML/Loading glue for those

    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 86ec28d9e3
Author: Seraphima Zykova <zykovas91@gmail.com>
Date:   Tue Dec 31 04:20:59 2024 +0300

    File search extension (#183)

    Adds support for a basic Indexer-based file search extension.

    Co-authored-by: Mike Griese <migrie@microsoft.com>

commit dc0693e0de
Author: Mike Griese <zadjii@gmail.com>
Date:   Fri Dec 27 07:12:31 2024 -0600

    Don't kill the mainpage when typing a space (#255)

    I think this is what @joadoumie  was seeing when he thought the main page crashed a lot.

    Some weird bug where the main page gcrashes with some frequency if the first thing you type is a space. Weird. `FuzzySearch` just can't handle the space

commit ada7ca8b96
Author: Mike Griese <zadjii@gmail.com>
Date:   Fri Dec 27 07:12:18 2024 -0600

    Down-weight fallback handlers (#256)

    As it stands, since the shell/run handler always exactly matches the `SearchText`, it _always_ shows up first in the results.

    That's annoying. Make it a little less popular. Sometimes, you just have to be mean to the kid that's really, really popular.

commit fa2ed4b114
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Dec 25 15:35:07 2024 +0100

    Auto install msix deps packages (#252)

    * Install msix dependencies automatically

    * xaml format

commit 95887afbad
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Dec 19 09:19:32 2024 -0600

    Swap the POC for TRA in PowerToys (#246)

    I think this swaps the POC for TRA in PowerToys.

    I don't think I have enough disk space left on this machine currently to actually _build_ PowerToys all up (🙃) so I'm gonna see what CI comes up with.

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>
    Co-authored-by: Stefan Markovic <stefan@janeasystems.com>

commit 769f9dadae
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Dec 19 06:29:03 2024 -0600

    Let mike use cmdpal to launch steam games (#249)

    The app enumeration was very poorly stolen from PowerToys, and I clearly just skipped the most important category of thing to get right: games

    ![image](https://github.com/user-attachments/assets/30a60c5a-bd2e-4e61-8b2b-4ee953f25dbe)

    happy holidays everyone

commit 93558d1cde
Author: Niels Laute <niels.laute@live.nl>
Date:   Wed Dec 18 23:30:46 2024 +0100

    UX tweaks (#248)

    - @ zadjii-msft added back button support
    - Font tweaks
    - Back button animation
    - Cleaner shortcut UI
    - Created a `Tag` control, but not ready yet. will continue in a separate PR

    Before vs after

    ![image](https://github.com/user-attachments/assets/7f5f8e2f-d83c-4df4-bf1a-48d8527f275c)

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 3795bdd767
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Dec 18 15:03:38 2024 -0600

    Fix TRA launching (#247)

    This broke in #215

commit 467989bf52
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Dec 18 12:17:14 2024 -0600

    Add support for aliases (#236)

    Honestly, code is pretty simple.

    * Add an `AliasManager` to track the alias strings bound to which commands.
      * Only a couple aliases are built-in currently. The ones from PT Run.
    * When the text is updated on the MainPage, if it matches an alias, we'll immediately just _do that command_.
    * When we do fire off an alias, we need to clear the search text on the main page, because we _don't_ want to come back with that text populated (as opposed to something like `masto↲` which we would want to leave in the search box

    Closes #143

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 291838a28a
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Dec 18 18:59:55 2024 +0100

    Integrate into PowerToys (#215)

    - Integrated into PowerToys - add module iface project
    - Added settings page
    - Added to installer
    - CI updates to sign msix and it's content and to check if msix content is signed

    TODO:
    - see how to install msix dependencies automatically
    - Start app automatically after installing from settings?
    - Installed by default?

commit 44d574027f
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Dec 18 16:08:06 2024 +0100

    Spellcheck additions (#243)

    * REVERT THIS: just to trigger spellcheck

    * [check-spelling] Update metadata

    Update for https://github.com/zadjii-msft/PowerToys/actions/runs/12390783207/attempts/1
    Accepted in https://github.com/zadjii-msft/PowerToys/pull/243#issuecomment-2551005106

    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>

    * Revert "REVERT THIS: just to trigger spellcheck"

    This reverts commit f1e87cdb4c.

    * manual check and fixes

    * [check-spelling] Update metadata

    Update for https://github.com/zadjii-msft/PowerToys/actions/runs/12392635493/attempts/1
    Accepted in https://github.com/zadjii-msft/PowerToys/pull/243#issuecomment-2551170253

    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>

    * manual check and fixes 2

    * Add patterns

    * No jokes here says spellcheck

    * merge and again

    * one more

    * forbidden patterns fix

    * More forbidden patterns fixes

    * now?

    * now??

    ---------

    Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
    Co-authored-by: Stefan Markovic <stefansjfw@users.noreply.github.com>

commit 9cd56217a0
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Dec 18 06:20:07 2024 -0600

    Hook up the buttons, and othe UX nits (#229)

    _targets #224_

    A big collection of UX nits.
    * The command buttons at the bottom work now.
    * The context menu works with `enter` now
    * `ctrl+enter` will do the secondary command now
    * `ctrl+k` will open the context menu now
    * Lists will do a better job of starting with a selected item, so that you can immediately start arrowing through the list
    * Lists will also do a better job of keeping at least one item selected as the list changes.
    * I manually dispatch a `CurrentPageViewModel.Filter = FilterBox.Text` when the filterbox backspaces to a single character. IIRC there's a bug in the debouncer upstream, but I had no patience for that
    * I reworded some things and changed some icons.
      * "Execute shell commands" felt _so_ "I am a 1337 haxor", when "sir, this is a run dialog"
      * "Switch between open windows" is tooooooooo lllllllllllooooooooooooonnnnnnngggggggggg

    Co-authored-by: Michael Hawker MSFT (XAML Llama) <24302614+michael-hawker@users.noreply.github.com>
    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 2dccda7400
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Dec 18 08:57:45 2024 +0100

    Merge PT upstream no.5 (#237)

    * [Workspaces] implement the move feature (#35480)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * fix Move attribute after launch and snapshot

    * Extend WindowArranger with PWA functionality to detect different PWA apps. PwaHelper moved to the common library

    * fix repeat counter in the editor

    * Code optimization

    * code cleanup, optimization

    * fix double-processing window

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * [KeyboardManager]Fix mapping shift to numpad (#35890)

    * Keyboard Manger fix numpad as shift

    Fixed shift not being released if a numpad key as shift.

    * Added comments

    * Fix typo

    * Fix the numpad unlocked key not working if the locked version is overridden by shift

    * Fix spelling check.

    * Revert the VK_CLEAR change.

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * [Analyzers] Update .editorconfig with rules to relax IDE errors (#36095)

    * [Analyzers] Remove duplicate pascal case style from .editorconfig

    * [Analyzers] Configured severity for individual IDE and CA rules showing as errors in VS

    Set severity for IDE0005, IDE0008, IDE0016, IDE0018, IDE0019, IDE0021, IDE0022, IDE0023, IDE0025, IDE0027, IDE0028, IDE0029, IDE0031, IDE0032, IDE0034, IDE0036, IDE0039, IDE0042, IDE0044, IDE0045, IDE0046, IDE0047, IDE0057, IDE0051, IDE0052, IDE0054, IDE0055, IDE0056, IDE0057, IDE0059, IDE0060, IDE0061, IDE0063, IDE0071, IDE0073, IDE0074, IDE0075, IDE0077, IDE0078, IDE0083, IDE0090, IDE0100, IDE0130, IDE160, IDE180, IDE0200, IDE0240, IDE0250, IDE0251, IDE0260, IDE0270, IDE0290, IDE0300, IDE0301, IDE0305, IDE1005, IDE1006, CA1859, CA2022, CA2263

    * [Analyzers] Fix mismatched analyzer descriptions

    * [Analyzers] Fix misspelling

    * Update .editorconfig

    Made the following style rules `silent` instead of `suggestion`:
    - Use explicit type instead of 'var'
    - Use expression body for ...
    - Use block-scoped namespace

    * [Analyzers] Set IDE0290 to silent

    * [Analyzers] Remove IDE1006 configuration from .editorconfig in favor of making exclusions for the few entries

    * [Analyzers][Indexer] Add IDE1006 suppressions

    * [Analyzers][Peek] Add IDE1006 suppression

    * [Analyzers][MWB] Add IDE1006 suppression.

    * [Analyzers][Plugins] Add IDE1006 suppression

    * [Analyzers][ImageResizer] Suppress IDE0073 to retain original copyright

    * [Analyzers] Remove IDE0073 severity change in .editorconfig

    ---------

    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>

    * [Workspaces] PWA follow-up (#36217)

    * [PTRun][Calculator]Allow scientific notation with lowercase 'e' (#36187)

    * [Workspaces] Add encoder parameter to bitmap.save() (#36228)

    * [Workspaces] Add encoder parameter to bitmap.save()

    * 1 more call fixed

    * Move repeated code to the csharp library

    * [Workspaces] Implement store of app window's size and position (#36086)

    * [Workspaces] Implement store of app window's size and position

    * Modifying the default values to -1. The program will use the original default values for the first run.

    * [ScreenRuler]Add setting to show the measurement in an extra unit (#35887)

    * display ruler: supporting millimeter and other units

    * Measurement Tool: UI Setting for an extra unit

    * Update images

    * spelling

    * spelling

    * suit code style

    * Fix for code review

    * remove weird file

    * rename field

    * [Deps]Update MSTest from 3.5.0 to 3.6.3 (#36115)

    * Update MSTest from 3.5.0 to 3.6.3

    * Use STA attributes that are now part of MSTest

    * Adding Jerry to community.md (#36232)

    Update COMMUNITY.md

    * [Workspaces] Arranger: smart timer (#36096)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] Arranger: Reset wait timer after each successful arrange action

    * fix merge error

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Upgrade to check-spelling v0.0.24 (#36235)

    This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24).

    A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur.

    There's a new accessibility forbidden pattern:

    > Do not use `(click) here` links
    > For more information, see:
    > * https://www.w3.org/QA/Tips/noClickHere
    > * https://webaim.org/techniques/hypertext/link_text
    > * https://granicus.com/blog/why-click-here-links-are-bad/
    > * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
    ```pl
    (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\()
    ```

    There are some minor bugs that I'm aware of and which I've fixed since this release, but I don't expect to make another release this month.

    I've added a pair of patterns for includes and pragmas. My argument is that the **compiler** will _generally_ tell you if you've misspelled an include and the **linker** will _generally_ tell you if you misspell a lib.

    - There's a caveat here: If your include case-insensitively matches the referenced file (but doesn't properly match it), then unless you either use a case-sensitive file system (as opposed to case-preserving) or beg clang to warn, you won't notice when you make this specific mistake -- this matters in that a couple of Windows headers (e.g. Unknwn.h) have particular case and repositories don't tend to consistently/properly write them.

    * Adjust to community.md, shifting jerry's github user name (#36242)

    Update COMMUNITY.md

    * [AOT compatible] Resolve AOT Build Error in Peek.UI (#36194)

    * add partial for aot support

    * add Microsoft.NET.ILLink.Tasks to packages.props

    * format

    * Revert "format"

    This reverts commit 742d5e2214.

    * add Microsoft.NET.ILLink.Tasks to notice.md

    * add auto reference

    * update script to remove the 'Auto-reference line'

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Awake Updates - `TILLSON_11272024` (#36049)

    * Update with bug fixes for tray icon and support for parent process

    * Process information enum

    * Update the docs

    * Fix spelling

    * Make sure that PID is used in PT config flow

    * Logic for checks based on #34148

    * Update with link to PR

    * Fixes #34717

    * Small cleanup

    * Proper task segmentation in a function

    * Cleanup the code

    * Fix synchronization context issue

    * Update planning doc

    * Test disabling caching to see if that manages to pass CI

    * Cleanup to make sure that we're logging things properly.

    * Update ci.yml

    * Disable cache to pass CI

    * Retry logic

    * Cleanup

    * Code cleanup

    * Fixes #35848

    * Update notes and codename

    * After third attempt, log error instead of throwing exception

    * More cleanup to avoid double execution

    * Add expected word

    * Safeguards for bad values for timed keep-awake

    * More updates to make sure I am using uint

    * Update error message

    * Update packages

    * Fix notice and revert CsWinRT upgrade

    * Codename update

    * Update expect.txt

    * Update the struct

    * Ensuring we're properly awaiting tray initialization

    * Update to make sure tray reflects the bound process

    * Cleanup, proper JSON serialization for logs.

    * Not needed.

    * Add command validation logic

    * Moving the initialization logic earlier

    * Make sure we show the display state in the tooltip

    * Update tray string

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update src/modules/awake/Awake/Core/Manager.cs

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>

    * Update logic for icon resets

    * Update doc

    * Simplify function for setting mode shell icon

    * Issues should be properly linked

    * Minor cleanup

    * Update timed behavior

    ---------

    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>

    * [Workspaces] detecting right app version (#36100)

    * [Workspaces] Add move functionality

    * spell checker

    * [Workspaces] Modify Arranger to move apps without launch

    * moved ipc helper

    * removed callback

    * use LauncherStatus in WindowArranger

    * wait for launching next app

    * launch in a separate thread and protect by mutexes

    * update app version in advance

    * changed canceling launch

    * increased waiting time

    * Fix optional parameter load from json

    * changed arranger waiting time

    * additional waiting time for Outlook

    * added app id

    * ensure ids before launch

    * set id in editor

    * minor updates

    * [Workspaces] Move: Get the nearest window when moving a window

    * [Workspaces] convert optional boolean to enum to avoid json problems

    * Handle case when the new Application Property "moveIfExists" does not exist

    * Re-implementing app-window pairing for moving feature.

    * spell checker

    * XAML formatting

    * Fixing bug: IPC message not arriving

    * spell checker

    * Removing app-level-setting for move app. Also fixed compiler errors due styling.

    * Updating editor window layout

    * Re-implementing window positioning UI elements

    * XAML formatting

    * Code review findings

    * Code cleanup

    * Code cleanup

    * Code cleanup

    * code cleanup

    * Code cleanup

    * Code cleanup

    * [Workspaces] fix detection of specific version of apps

    ---------

    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>

    * Move the XamlStyler config to src/ (#36202)

    my never ending goal to minimize files in the root dir

    * [AdvancedPaste]Add Semantic Kernel opt-in to allow chaining of paste actions (#35902)

    * [AdvancedPaste] Semantic Kernel support

    * Changed log-line with potentially sensitive info

    * Spellcheck issues

    * Various improvements for Semantic Kernel

    * Spellcheck issue

    * Refactored Clipboard routines

    * Added integration tests for KernelService

    * Extra telemetry for AdvancedPaste

    * Added 'Hotkey' suffix to AdvancedPaste_Settings telemetry event

    * Added IsSavedQuery

    * Added KernelQueryCache

    * Refactoring

    * Added KernelQueryCache to BugReportTool delete list

    * Added opt-n for Semantic Kernel

    * Fixed bug with KernelQueryCache

    * Ability to view last AI chat message on error

    * Improved kernel query cache

    * Used System.IO.Abstractions and improved tests

    * Fixed under-count of token usage

    * Used Semantic Kernel icon

    * Cleanup

    * Add missing EndProject line

    * Fix dependency version conflicts

    * Fix NOTICE.md

    * Correct place of SemanticKernel in NOTICE.md

    * Unlinked CustomPreview toggle from AI

    * Added Microsoft.Bcl.AsyncInterfaces dependency to AdvancedPaste

    * Fixed NOTICE.md order

    * Moved Custom Preview to behaviour section

    * Made Image to Text raise error on empty output

    * Added AIServiceBatchIntegrationTests

    * Updated AIServiceBatchIntegrationTests

    * Added prompt moderation

    * Moved GPO Infobar to better location

    * [Launcher]Port from WPF-UI to .NET 9 WPF (#36215)

    * Initial implementation

    * Fix fluent style

    * Fix no endline

    * Update expect.txt

    * Fix formatting

    * Fix light theme looking bad on Windows 10

    * fix formatting

    * test change

    * Now really fixed W10

    * Add a comment

    * Fix typos

    * Fix spellcheck errors

    * Fix spellcheck pattern for websites

    * Change patterns for spellcheck in the right file

    * Fix XAML styling

    * Fix contrast colors on W11

    * Fix formatting

    * Removed emty line

    * Fix formatting

    * Added comment to fluentHC file

    * fix comment

    * Fix Windows10 again.
    Adress feedback.

    * W11 fix chaning from high contrast to normal not having correct background

    * W10 Fix high contrast not working after switching from light/dark moed

    * Address feedback

    * Fix formatting

    * Second W11 fix chaning from high contrast to normal not having correct background

    * [UX]Updating New+ and Settings icons (#36290)

    * Updated icons

    * Updating more icons and icos

    * [Settings][Dashboard] Accessibility fixes (#36280)

    * make narrator announce buttons/toggles

    * add toggles module name

    * [ci]Sign OpenAI dll that's not signed (#36299)

    * Update CODEOWNERS to include gordon, jerry and kayla (#36308)

    * Update CODEOWNERS

    * Update names.txt

    * Making the powertoys-code-owners team code owners (#36310)

    * Update CODEOWNERS

    * Update names.txt

    * Update CODEOWNERS

    * [FZEditor]Fix Create new layout dialog radio buttons IsChecked values  (#36320)

    * 0.87 changelog (#36335)

    * 0.87 changelog

    * Fix spellcheck

    * Update README.md

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

    ---------

    Co-authored-by: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com>
    Co-authored-by: Seraphima <zykovas91@gmail.com>
    Co-authored-by: donlaci <donlaci@yahoo.com>
    Co-authored-by: Ionuț Manța <ionut@janeasystems.com>
    Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
    Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com>
    Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com>
    Co-authored-by: PesBandi <127593627+PesBandi@users.noreply.github.com>
    Co-authored-by: Wenjian Chern <55335597+Sophanatprime@users.noreply.github.com>
    Co-authored-by: Youssef Victor <youssefvictor00@gmail.com>
    Co-authored-by: Clint Rutkas <clint@rutkas.com>
    Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
    Co-authored-by: leileizhang <leilzh@microsoft.com>
    Co-authored-by: Den Delimarsky 🔐 <sign@den.dev>
    Co-authored-by: Niels Laute <niels.laute@live.nl>
    Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com>
    Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

commit 8214331752
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Dec 18 01:55:57 2024 -0600

    Use the non-labs markdown block, because pain and suffering (#240)

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit b0bfeec888
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Dec 16 15:49:57 2024 -0600

    Make fallback commands work again (#234)

    Add support for fallback commands again. Couple important parts:

    * Lists shouldn't contain items with blank `Title`s. That's spec'd that way, and allows fallback items to hide themselves if they don't want to be shown for a given search string
    * The CommandProviderWrapper, as well as extension infrastructure needs to know to get the fallbacks out of a commandprovider too.
    * `TopLevelCommandWrapper` needs to know when its model changes, to update itself in the list

    ------
    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 4048d76d87
Author: Mike Griese <zadjii@gmail.com>
Date:   Mon Dec 16 15:48:07 2024 -0600

    Add global hotkey again (#232)

    This was originally based off `dev/migrie/f/ux-nits`, which is #229

    * Adds support for our `win+ctrl+.` global hotkey again.
    * Makes our window a transient toolwindow. It doesn't show up in alt+tab. It can only be summoned with the hotkey
      * Unless you're debugging, because that's an absolute chore
    * Manually makes Quit visible as a command. Quit is usually a fallback command, but I implemented that _right after this commit_. However, I _believe_ the fallback commands need #224 to merge, whereas this subset of deltas didn't exactly

    Closes #136

commit 8f122b9a4b
Author: Michael Hawker MSFT (XAML Llama) <24302614+michael-hawker@users.noreply.github.com>
Date:   Mon Dec 16 13:44:10 2024 -0800

    Colorize the tags! (#227)

    Has a contrast issue with foreground text though:

    ![image](https://github.com/user-attachments/assets/ebc39efd-f796-408b-b5a1-c423ff9ea7d9)

    @  niels9001 think we should have a 'smart' thing that tries to create a contrasting brush for the text based on the background brush or would it be best to let devs config this as part of the tag?

    For some reason my pokedex sample extension isn't loading, so that'd be the real test for colors... 😆

commit a92b1e61a8
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Dec 16 12:22:07 2024 -0600

    Minor Window Walker improvements (#233)

    * Add the app's icon, if we can
    * Add a setting to display the results in-order (THE NEW DEFAULT)
    * Change a couple strings to be tighter, less "power-user"-sounding
    * Let the code formatter do its buisiness

    Originally from 0b789ad, on `dev/migrie/f/stash-forms-should-submit`, which was buried like 7 branches deep.

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit bf6b6b81b6
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Dec 16 11:38:37 2024 -0600

    Add Dynamic lists and Apps on the main page again (#224)

    Just to prove that they work.

    This adds the filtering and weighting we were using before to TRA. Lists all get updated in-place, so that the ListView won't flicker like crazy as items get added. And for lists where items get inserted in the middle, we'll update smoothly.

    * 4ad92b64ff429b6959285b6cf88d0feacb643be9...642d98d0571b5d6e03a6faa431c00ede27ce4b24 is what adds support for dynamic lists.
    * 09b63d6 I moved some files around to make more sense.
    * 09b63d6...2016bcb is where I added apps back onto the main page.

    When the `MainListPage` gets a filter string, it will filter both top-level commands and the apps from the `AllAppsPage`.

    I also made the MainListPage show us that it's loading, by setting `IsLoading = appsLoading || extensionsLoading` (more or less).

    Does NOT add support for updating fallback items quite yet. One step at a time.

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 19ddcdee5f
Merge: 3df8c87f5 28250f99d
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Dec 16 10:30:13 2024 -0600

    Add a very obvious GoBack command result

    Add a very obvious GoBack command result
    Closes #230

commit 28250f99d8
Author: Mike Griese <zadjii@gmail.com>
Date:   Sun Dec 15 10:53:56 2024 -0600

    Add a very obvious GoBack command result

commit 3df8c87f54
Merge: 4ad92b64f 7db7d7ece
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Dec 13 17:37:05 2024 -0600

    Two colors for tags

    Update the idl to allow us to specify separate FG and BG colors. I think that's better honestly.

commit 7db7d7ece7
Author: Mike Griese <zadjii@gmail.com>
Date:   Fri Dec 13 17:36:36 2024 -0600

    no yea that's better

commit 5299582d85
Author: Mike Griese <zadjii@gmail.com>
Date:   Fri Dec 13 17:24:34 2024 -0600

    two colors

commit 4ad92b64ff
Merge: 23e94f2eb c5f0881b4
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Dec 13 11:44:53 2024 -0600

    Merge pull request #219 from zadjii-msft/dev/migrie/f/TRA-forms-pr

    Get the other two types of pages back in. Form pages and Markdown pages.

    ![image](https://github.com/user-attachments/assets/27d10b91-6920-421e-912b-a64ca26baf93)

    When forms fail to parse, we'll display the exception by replacing the card with one of our one authoring
    ![image](https://github.com/user-attachments/assets/e3e74d7c-d6da-4d8a-b91b-d66aff8b3d9c)

    Markdown pages support multiple bodies, and possibly details:
    ![image](https://github.com/user-attachments/assets/8abb36e9-d3aa-4d1a-b045-d34d84fe16e6)
    ![image](https://github.com/user-attachments/assets/047d4bdd-e356-4a70-b62d-4ccd678b7285)

    Ref #73

commit 23e94f2eb9
Merge: 3388bb239 35f4416fe
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Fri Dec 13 11:27:04 2024 -0500

    Merge pull request #188 from zadjii-msft/joadoumie/window-walker

    Migrate Window Walker from PT Run

commit 35f4416fe2
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Fri Dec 13 11:23:21 2024 -0500

    make toplevelcommand a single object that lives over the lifetime of the app

commit c5f0881b43
Merge: 06a5b55ca 3388bb239
Author: Mike Griese <zadjii@gmail.com>
Date:   Fri Dec 13 08:34:20 2024 -0600

    Merge remote-tracking branch 'origin/main' into dev/migrie/f/TRA-forms-pr

commit 06a5b55caa
Author: Mike Griese <zadjii@gmail.com>
Date:   Fri Dec 13 07:59:53 2024 -0600

    good feedback from reivew

commit 3388bb2397
Merge: 719cfb346 80f63dbb9
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Dec 13 07:08:59 2024 -0600

    Merge pull request #222 from zadjii-msft/llama/icon-control

    Fixes #213
    Replaces PR #218

    FYI @Ryken100 (thanks for the info and assist in debugging the issue and discussing possible avenues of resolution)
    Thanks @zadjii-msft for validating the end path in #218

    Before:
    ```xml
                            <Border x:Name="IconBorder"
                                    Grid.Column="0"
                                    Width="16"
                                    Height="16"
                                    Margin="0,0,0,0">
                                <!-- LoadIconBehavior will magically fill this border up with an icon -->
                                <Interactivity:Interaction.Behaviors>
                                    <cmdpalUI:LoadIconBehavior Source="{x:Bind Icon, Mode=OneWay}"/>
                                </Interactivity:Interaction.Behaviors>
                            </Border>
    ```

    After:
    ```xml
                            <cpcontrols:IconBox
                                Grid.Column="0"
                                Width="16"
                                Height="16"
                                Margin="0,0,0,0"
                                SourceKey="{x:Bind Icon, Mode=OneWay}"
                                SourceRequested="{x:Bind help:IconCacheProvider.SourceRequested}" />
    ```

    The IconCacheProvider is the translation layer between having a light-weight control and our specific app's logic/desire for an icon cache, using the deferred event pattern:

    ```cs
    public static partial class IconCacheProvider
    {
        private static readonly IconCacheService IconService = new(Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread());

        public static async void SourceRequested(IconBox sender, SourceRequestedEventArgs args)
        {
            if (args.Key == null)
            {
                return;
            }

            if (args.Key is IconDataType iconData)
            {
                var deferral = args.GetDeferral();

                args.Value = await IconService.GetIconSource(iconData);

                deferral.Complete();
            }
        }
    }
    ```

    ## Details

    `IconBox` is a custom control that's a ContentControl, its generic (toolkitable) and should be able to be styled and templated (haven't tested, but no reason it shouldn't as a XAML `ContentControl`, should help @niels9001 a ton).

    It knows how to take an `IconSource` and create the underlying `IconElement` as its content.

    It can also take any general value as a `SourceKey` and via an implementation of the `SourceRequested` event, translate a bound general object into the `IconSource` required. This is how caching can be provided by an application as well, for instance (like we'll do here). This uses the deferred events pattern to await the call to the `SourceRequested` event which may need to load data asynchronously

    We create a static x:Bind helper `IconCacheProvider` to encapsulate our shared logic for our eventual Icon cache.

    Also:
    - Renamed IconCacheService.xaml.cs -> IconCacheService.cs
    - Removed old broken behavior (believe ultimate issue was due to instability in loaded/unloaded events, i.e. issue https://github.com/microsoft/microsoft-ui-xaml/issues/1900)
    - XAML Styler also did its thing... (some conflict here in config from PowerToys to resolve later, imagine this is also a consequence of us not having CI setup in fork...)

commit 80f63dbb9d
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Fri Dec 13 00:40:53 2024 -0800

    Fix #213 by implementing a light-weight IconBox control

    Replaces PR #218

    IconBox is a custom control that's a ContentControl, it's generic (toolkitable) and should be able to be styled and templated.
    It knows how to take an IconSource and create the underlying IconElement as its content.
    It can also take any general value as a `SourceKey` and via an implementation of the SourceRequested event, translate a bound general object into the `IconSource` required. This is how caching can be provided by an application as well, for instance (like we'll do here).
    This uses the deferred events pattern to await the call to the `SourceRequested` event which may need to load data asynchronously

    We create a static x:Bind helper `IconCacheProvider` to encapsulate our shared logic for our eventual Icon cache.

    Renamed IconCacheService.xaml.cs -> IconCacheService.cs
    Removed old broken behavior (believe ultimate issue was due to instability in loaded/unloaded events, i.e. issue https://github.com/microsoft/microsoft-ui-xaml/issues/1900)
    XAML Styler also did its thing...

commit fa89e1a879
Merge: afc9279c2 719cfb346
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Dec 12 17:23:49 2024 -0600

    Merge remote-tracking branch 'origin/main' into dev/migrie/f/TRA-forms-pr

commit afc9279c24
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Dec 12 13:58:21 2024 -0600

    show details

commit 7957282af2
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Dec 12 13:30:55 2024 -0600

    more samples, styling

commit caf578d0f6
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Dec 12 13:12:42 2024 -0600

    it cannot be this easy, right?

commit 0884c8c247
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Dec 12 12:29:51 2024 -0600

    Form pages are all wired up

commit 6578549f98
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Dec 12 12:13:02 2024 -0600

    plumbing

commit 03b22a545b
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Dec 11 17:10:07 2024 -0600

    scrolly posts

commit 0f6adb0b1b
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Dec 11 16:31:42 2024 -0600

    static constructors are neat

commit 9a2c0f75c8
Author: Mike Griese <zadjii@gmail.com>
Date:   Wed Dec 11 12:07:39 2024 -0600

    a binding that makes sense to me

commit 5a366b523b
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Dec 10 17:43:50 2024 -0600

    okay, so yes, if an extension implements this by crashing, we'll throw an exception, that makes sense

commit a27cd54501
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Dec 10 16:33:07 2024 -0600

    start adding views, but I have branches to merge down now

commit d293421218
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Dec 10 15:35:57 2024 -0600

    Do the AdaptiveCards workaround, but with PreserveNewest so it doesn't rebuild every launch

commit 719cfb3469
Merge: 44070f83b bae9c0cf3
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Dec 12 17:11:14 2024 -0600

    Merge pull request #217 from zadjii-msft/dev/migrie/f/error-context-pr

    This allows extension objects to write error messages specifically to the page that owns them. We don't need the `ShowExceptionMessage` anymore, because that just tossed the error at whatever page was open (even if it wasn't the page that had an error).

    I also made this a `IPageContext`, rather than `IErrorContext`, so we could pass the page's task scheduler to that object too. That lets us have one base `UpdateProperties` implementation for all extension objects.

    I think this sneakily also adds support for `Page.Title` (separate from `Page.Name`)

    Closes #203

commit bae9c0cf3b
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Dec 12 14:12:21 2024 -0600

    I guess this is how you propertychange a dependencyproperty

commit 4f8b905369
Merge: 4dca9436a 44070f83b
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Dec 12 05:48:18 2024 -0600

    Merge remote-tracking branch 'origin/main' into dev/migrie/f/error-context-pr

commit 4dca9436aa
Merge: 78e7134b9 0ffadc56a
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Dec 12 05:48:09 2024 -0600

    Merge remote-tracking branch 'origin/main' into dev/migrie/f/error-context-pr

commit 44070f83bd
Merge: 0ffadc56a f176b0d05
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Dec 12 05:45:15 2024 -0600

    Merge pull request #214 from zadjii-msft/llama/image-loading-perf

    Just some minor clean-up/perf things I was trying, doesn't actually fix anything though, unfortunately (outside of maybe making startup a bit faster)...

    Does NOT fix https://github.com/zadjii-msft/PowerToys/issues/213

    We were effectively getting called to load images twice in a few spots, and we were trying to load them everywhere at startup. This minimized that in a few places, but we can't use x:Phase in the DataTemplate for the List Items (as it needs a UIElement), so that caused some issues.

    I thought I had a fix for all the duplicate items loading on the home page, but alas no. Have to continue digging into that, but got side-tracked by the above.

commit 7e512565df
Author: joadoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Wed Dec 11 21:03:04 2024 -0500

    fixed a bunch of PR comments

commit f176b0d058
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Wed Dec 11 12:03:56 2024 -0800

    Ensure the equality checks for our ViewModels use the underlying Model object so even if we create a new wrapper we'll compare it against what it actually contains.

commit e791bcdbcd
Merge: eb9395001 0ffadc56a
Author: joadoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Wed Dec 11 12:56:24 2024 -0500

    Merge remote-tracking branch 'origin/main' into joadoumie/window-walker

commit 0ffadc56aa
Merge: 6a7a2442d c208d4b84
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Dec 11 05:19:31 2024 -0600

    Merge pull request #212 from zadjii-msft/dev/migrie/b/TRA-quits-extensions-on-close

    Ref #73.

    What it says on the tin. Terminate extensions when the main window closes.

commit 7580872e82
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Tue Dec 10 17:33:49 2024 -0800

    Attempt to fix duplicate items (doesn't work)

commit 436ae902f6
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Tue Dec 10 17:33:28 2024 -0800

    Clean-up DP patterns in Loading Behavior

commit 80c538733d
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Tue Dec 10 17:32:03 2024 -0800

    Iniital attempt at deferring loading of some images

commit 6a7a2442d9
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Dec 10 17:34:55 2024 -0600

    Load icons again (#208)

    This adds a magic helper to load icons for us. Any time you want an icon, just do this:

    ```xaml
    <Border Width="16"
            Height="16"
            Margin="4,4,4,4">
        <Interactivity:Interaction.Behaviors>
            <cmdpalUI:LoadIconBehavior Source="{x:Bind ViewModel.PrimaryAction.Icon, Mode=OneWay}"/>
        </Interactivity:Interaction.Behaviors>
    </Border>
    ```

    And that'll magically give us a border filled with the icon, and updating with the binding.

    I believe it'll also work with `IRandomAccessStreamReference`s, but I didn't actually test that with #151 yet.

    I didn't actually implement the "caching" bit of this yet. That'll involve doing some locking per-key inside the factory and I didn't want to futz with that in this initial PR to restore icons

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 78e7134b93
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Dec 10 17:14:51 2024 -0600

    remove this unneeded nonsense

commit 3aebd83847
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Dec 10 15:18:36 2024 -0600

    Just make the scheduler part of the page context, that makes more sense

commit b731fe9c14
Author: Mike Griese <zadjii@gmail.com>
Date:   Mon Dec 9 08:37:10 2024 -0600

    everyone gets an exception context

commit 1f6daecf98
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Dec 10 16:39:10 2024 -0600

    Add support for the Details pane again (#202)

    * 5ff225216cab1690ce55088a0aa2fc1af013c867 Adds the ViewModel
    * The rest of the commits work on adding it to the View.

    I had to re-add `CommunityToolkit.WinUI.UI.Controls.Markdown` to get the MD rendered again.

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>
    Co-authored-by: Michael Hawker MSFT (XAML Llama) <24302614+michael-hawker@users.noreply.github.com>

commit a6eba69e60
Merge: 42a913180 f769446ac
Author: Michael Hawker MSFT (XAML Llama) <24302614+michael-hawker@users.noreply.github.com>
Date:   Tue Dec 10 14:26:32 2024 -0800

    Merge pull request #199 from zadjii-msft/llama/page-filtering

    [WIP] Some initial clean-up for Current Page and test Filtering

commit c208d4b842
Author: Mike Griese <zadjii@gmail.com>
Date:   Tue Dec 10 11:58:54 2024 -0600

    Terminate extensions on exit (again)

commit f769446ac9
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Tue Dec 10 00:02:03 2024 -0800

    Close when we hit Esc at top-level

commit 6810d2cd8a
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Mon Dec 9 23:55:01 2024 -0800

    Add some memory to the SearchBox based on the last Filter of the VM

commit 39bb62ca1c
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Mon Dec 9 23:54:16 2024 -0800

    Fix issue with initial values not showing up (not added during load when there's no Filter)

commit 25550fb756
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Mon Dec 9 23:53:34 2024 -0800

    Uncomment Code that was due to a local stale extension

commit c4b930c6d9
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Mon Dec 9 17:24:46 2024 -0800

    Use existing StringMatcher.FuzzySearch helper for the pattern matching of search box

commit cc13026941
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Fri Dec 6 18:11:55 2024 -0800

    Some intial clean-up for Current Page and test Filtering

    Has some issues still... (in part needs to update toolkit package for debounce extension update...)

commit 42a9131800
Merge: a3ea44977 65668a07b
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Mon Dec 9 20:35:08 2024 -0500

    Merge pull request #210 from zadjii-msft/llama/fix-webview2

    Fix missed config update to WebView2 version

commit 65668a07b3
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Mon Dec 9 17:25:49 2024 -0800

    Fix missed config update to WebView2 version from https://github.com/zadjii-msft/PowerToys/pull/205

commit a3ea44977b
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Dec 9 15:05:58 2024 -0600

    Windows.UI.Color considered harmful (#196)

    _targets #192_

    Adds our own struct to the API for passing colors around. This is lifted straight out of the Terminal, which had to deal with this quite a lot.

    Since this color is a struct (so that it trivially marshals across the ABI), it can't be _null_. So we also added `OptionalColor`, which is explicitly "Maybe a color, maybe not". We were bit enough times by trying to have a special secret `INVALID_COLOR` value that it ultimately made sense just to put another bool in there.

    While I'm touching the SDK and breaking everyone, I figured I'd also do the `s/Loading/IsLoading/g` thing now too.

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit 8d8c8c6ab7
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Dec 9 11:44:25 2024 -0800

    Add a bunch more ListItem viewmodel properties, namely tags (#192)

    Doesn't use all these everywhere, but starts plumbing them into ViewModel's so that @niels9001 can start using more things in more places.

    ![image](https://github.com/user-attachments/assets/f1c7c0c4-c4b2-49a4-889f-2c2e5f595f63)

    I didn't actually colorize the tags, because that requires a Brush, and I don't think I'm supposed to put brushes in the viewmodels

    ref #73

commit 186d411382
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Dec 9 10:28:43 2024 -0800

    Bump our WebView2 version, to fix a bunch of build breaks (#205)

    WASDK including WebView2 was a mistake.

    Supersedes #200

    I also had to:

    * Manually restore the WebView2 package into `/packages`. I'm assuming this was just VS being dumb and most people won't have to?
    * `git clean -fdx -e *.user -e *.cmd -e packages/** -e Appx/** -e *.svg`
      * I did it this way because MAYBE i had a couple WIP extensions that I didn't want to nuke, and one .svg file in particular that I yanked from espn.com that I didn't want to nuke

commit b586dd611b
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Dec 9 10:10:13 2024 -0800

    Add a fallback command for she shell command extension (#207)

    Rebase of #201, onto `main`, to avoid the wacky conflicts circa #200 ~ #205

    Can you believe, for a second there, I almost forgot we were building a Run replacement.

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit b7f32e1d18
Author: Eric Johnson <ericjohnson327@gmail.com>
Date:   Mon Dec 9 09:26:24 2024 -0800

    fix pipeline build (#204)

    These copy file tasks were from before moving sdk generation to its own stage.  These are no longer needed.

commit e147abd73d
Merge: d881cf89a cb963f7ed
Author: Eric Johnson <ericjohnson327@gmail.com>
Date:   Fri Dec 6 12:49:25 2024 -0800

    Merge pull request #198 from zadjii-msft/user/ejohn/sdkFix

    Fix the sdk generation script

commit cb963f7ed1
Author: Eric Johnson <ericjohnson327@gmail.com>
Date:   Fri Dec 6 10:49:38 2024 -0800

    Fix the sdk generation script

commit d881cf89a6
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Fri Dec 6 09:51:39 2024 -0500

    Add the shell plugin from PT Run, and a ChoiceSet settings helper (#185)

    * not super happy with this approach - scratch that, not happy at all

    * that's a bit better, still gonna need a review, but it works atm

    * going home is better than not... for save action in settings

    * welp, undoing that. that did NOT work. something is going on with RaiseSettingsChanged

    * hmmm... update() doesn't work the way I want it to - on to the next one

    * working on file saving... not working yet

    * saving to/loading from file works... but needs some refactoring I'd imagine

    * we should dismiss palette on launch...

    * make settings a context menu command

    * add icon as content in .csproj

    * fix icon name

    * remove hardcoding settings file

    * move SettingsJsonPath to Settings Manager class

    * more sensical version of saved settings

    * remove settings.json from csproj

    * removing comment

    * whoops, removing unused Settings.json idea

    * no more hadcorded strings... helo Resources!

    * here you go

    * dont do anything to setting if key is not found in payload

    * ChoiceSetSetting example working with fake setting in terminal...

    * remove random extra terminal settings changes

    * working on shell plugin from PT Run

    * getting closer to a reasonable prototype

    * it kinda makes some sense now

    * maybe ChoiceSetSetting should should only take in array of Choices with the default one being just the first choice

    * I think this fixes our winmd pains, but at what cost

    * fix naming for command

    * fixing vd extension publish profiles + a few other things

    * Add choice setting example to the sample pages

    * add an additional choice in sample pages choice set example

    * add icon

    * whoops, forgot the command context menu was broken before this fix!

    * address first few PR comments

    * removed extra file + removing wox refs in .resx

    * changed for loop to for each

    * fixing some things for PR review

    ---------

    Co-authored-by: Jordi Adoumie <jordiadoumie@microsoft.com>
    Co-authored-by: Mike Griese <migrie@microsoft.com>

commit aeb39043fe
Author: Eric Johnson <ericjohnson327@gmail.com>
Date:   Fri Dec 6 06:48:19 2024 -0800

    Adding extensions SDK nuget generation (#184)

    ## Summary of the Pull Request
    Packing the SDK into a nuget package and creating the build scripts and pipeline to build it.
    Pipeline: will auto build the SDK and publish it to ADO artifacts in that build.
    Script: Devs can build nuget locally by running BuildSDKHelper.ps1.  This will build and pack the SDK nuget and place it in src\modules\cmdpal\extensionsdk\_build.  This directory has been added to the nuget.config as well.

commit b16537dd01
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Dec 5 14:07:40 2024 -0800

    Add the All Apps page to the MVVM app. (#190)

    Pretty straightforward. This never got ported, because it didn't have a CommandProvider. Now it does.

commit 2b986196d6
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Dec 5 09:43:27 2024 -0800

    Bind to Page properties, and add support for item propchange's (#186)

    A lot of this is just samples work, so skip on down to `src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/ActionBarViewModel.cs`.

    * Updates the Action Bar with the title of the currently active page when we navigate to it
    * listens for PropChanged events from `ICommandItem`s in lists and on `IPage`'s (to display a loading bar)
      * Also didn't put this on the ShellPage quite yet, because the diff was already massive, and there's complicated "are _we_ loading the page? did the `IPage` say it was loading?" plumbing that needs to be done.
    * adds rudimentary support for showing an exception, if there's an error we catch
      * I didn't add log this everywhere yet though, since we're not 100% confident on the messaging infrastructure here
      * I decided against putting this on the shell page, because I want users to be able to _go back_ from a page with an exception, and that didn't seem trivial if it was on the shellpage itself
    * Then updates a bunch of extensions to better utilize the loading state.
    * Then discovers a really weird bug with event callbacks in WinRT, so I decided to wrap those in try/catches to have extensions explode less often. (#181)
    * Then also adds a bunch of "evil" samples, to make a unified place of "things to try and break us"

    ref #73

    ---------

    Co-authored-by: Mike Griese <zadjii@gmail.com>

commit ef35a4ca32
Merge: 0ccbfd955 b082ed45e
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Wed Dec 4 18:28:31 2024 +0100

    Merge pull request #189 from zadjii-msft/stefan/merge_main_pt_4

    Merge upstream PowerToys #4

commit b082ed45e8
Author: Stefan Markovic <stefan@janeasystems.com>
Date:   Wed Dec 4 17:53:20 2024 +0100

    merge conflict fix

commit 5c45cddf86
Merge: 0ccbfd955 e0949cb4e
Author: Stefan Markovic <stefan@janeasystems.com>
Date:   Wed Dec 4 17:46:32 2024 +0100

    Merge remote-tracking branch 'mainPT/main' into stefan/merge_main_pt_4

commit eb9395001f
Merge: 79f24bc29 0ccbfd955
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Tue Dec 3 10:01:36 2024 -0800

    merging main into branch

commit 0ccbfd955d
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Dec 2 16:35:56 2024 -0800

    Load extensions into TRA (#176)

    Targets both #175 (which targets #171), and #172, so the delta is very sloppy.

    There's also some sloppy bits of delta here where I tried to see if the single-instance thing fixed the RoOriginate thing.

    I'm gonna try to tidy all this up a bit.

    Refs #73

commit 7f9608f21d
Author: Michael Hawker MSFT (XAML Llama) <24302614+michael-hawker@users.noreply.github.com>
Date:   Thu Nov 28 03:35:11 2024 -0800

    ListViewModel Loading Pattern (#180)

    On top of #175

    This applies the same loading setup between the View and the ViewModel that we had for the ShellPage/ShellViewModel to the ListPage/ListViewModel.

    We could abstract this in the View a bit to make work across different combinations of page types and viewmodels later, so they're all consistent, e.g. IInitializableViewModel interface for the `InitializeCommand`.

commit c66efdaa32
Author: Niels Laute <niels.laute@live.nl>
Date:   Wed Nov 27 19:44:14 2024 +0100

    Niels9001/ux explorations (#174)

    UX changes:

    ![image](https://github.com/user-attachments/assets/12ca13fc-835f-4ff8-8511-98ecefc486b3)

commit 858db45ece
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Nov 27 10:20:42 2024 -0800

    Add more layers of ViewModels to wrap extension objects (#175)

    _targets #171_

    This is the direction I was thinking with the comments in https://github.com/zadjii-msft/PowerToys/issues/73#issuecomment-2496004179.

    Mainly,
    * I'm making sure that ViewModels which wrap up some extension object all have a local copy of their data.
    * They all use an `async Task InitializePropertiesAsync()` to retrieve their properties from the extension itself.
    * Beyond the `ExtensionObject` they own, they only keep around _other view models_.

    I did this for `ListItem` and `CommandContextItem` currently. They both inherit from `CommandItemViewModel`, so they're really all doing the same thing.

    If this seems like the direction we want to go, I can tidy up ListPage too, and keep wrapping up more extension objects like this.

    The BODGY thing I'm doing here is

    ```cs
    viewModel.InitializePropertiesAsync().ContinueWith(t => { /*TODO this feels dirty*/ });
    ```

    in `ListViewModel.cs`. Basically just yeeting off a task to load the properties for the item (separately for each item?!). Feels DEFINITELY wrong.

commit f7a1d23358
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Nov 27 10:19:09 2024 -0800

    Populate the context menu with actual items (#171)

    * Allows `enter` to activate items again
    * populates the context menu in the `ActionBar` with real values, as the user moves the selection
    * Also adds a generic `PerformCommandMessage`, which lets us have one message for "go to a page, or invoke a command"

    ref #73

commit 1279241322
Merge: 51e2ad833 55b07c597
Author: Michael Hawker MSFT (XAML Llama) <24302614+michael-hawker@users.noreply.github.com>
Date:   Tue Nov 26 16:04:59 2024 -0800

    Merge pull request #177 from zadjii-msft/dev/migrie/single-instance

    Make the app single-instanced again

commit 51e2ad8333
Merge: 01d56665c e4b78a7c3
Author: Michael Hawker MSFT (XAML Llama) <24302614+michael-hawker@users.noreply.github.com>
Date:   Tue Nov 26 16:02:08 2024 -0800

    Merge pull request #178 from zadjii-msft/dev/migrie/silencio-debugo

    Silence nativeDebugging spew

commit e4b78a7c34
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Nov 26 14:24:21 2024 -0600

    silencio nativeDebugging

commit 55b07c597a
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Nov 26 15:16:23 2024 -0600

    The amazing duplicating copyright header

commit 8b3325bb03
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Nov 26 11:11:33 2024 -0600

    making it single instanced wasn't the source of the rooriginates

commit 01d56665c9
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Nov 26 13:08:19 2024 -0800

    I think this fixes our winmd pains, but at what cost (#172)

    1. Manually copy `Microsoft.CmdPal.Extensions.winmd` into our helper library's output directory. If we do that, then it rolls up to the packages that reference it.
       * This only started failing for me on 17.13. Before that (I think on 17.11) this just worked automatically?
       * This feels bodgy
    2. Update the helper script to be more informative

    Refs #104. I don't want to say that it fixes it till we never see it again, but I think this fixes it.

    I did not test this on 17.11. I'll need to find a machine that has it to make sure I don't explode the world

commit 79f24bc290
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Mon Nov 25 15:40:39 2024 -0800

    cleaned up command result

commit 6e3507af16
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Mon Nov 25 15:36:39 2024 -0800

    returning a new commanditem each time in toplevelcommands seems to work best?

commit 1147b9a7af
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Mon Nov 25 15:18:09 2024 -0800

    commit before I remove cancellation token (I hope)

commit 652ed91d81
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Mon Nov 25 10:35:33 2024 -0800

    it works... but is a bit buggy

commit 014a340c7a
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Mon Nov 25 12:26:23 2024 +0100

    Merge latest PowerToys upstream (#173)

    d26bf6e7bca938305e3d7f60072c9c3dbc3fb581 with the notable changes

    This is needed in order to build successfully other PT modules that use CommunityToolkit.Mvvm nuget package package. Warnings are introduced by newer version of MVVM package used for CmdPal - 8.4.0-preview2. I tried using the same MVVM used in PT but then CmdPal fails to build. I guess let's go with this here as I expect we'll bump mvvm package sometime soon on upstream so issues will be resolved on PT side.

commit 7f026592bf
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sun Nov 24 16:34:24 2024 -0800

    mid merge -- doesn't build

commit 3ce188d47a
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sun Nov 24 09:39:49 2024 -0800

    no more errors

commit 7b597c047e
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sun Nov 24 09:39:31 2024 -0800

    bug fix

commit 8de07ae5c7
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sun Nov 24 09:39:02 2024 -0800

    adding settings manager

commit 679c0a9cbe
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sun Nov 24 08:39:08 2024 -0800

    removed empty folders

commit cfc9b1c057
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sun Nov 24 08:35:39 2024 -0800

    fix properites bug

commit adce6da4ba
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sun Nov 24 08:34:54 2024 -0800

    add built in window walker command to Poc

commit 5203d716be
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sun Nov 24 08:32:51 2024 -0800

    scaffolding set up for window walker migration from og PT Run Plugin

commit e45c253fd9
Author: Michael Hawker MSFT (XAML Llama) <24302614+michael-hawker@users.noreply.github.com>
Date:   Fri Nov 22 04:47:31 2024 -0800

    Some various minor clean-up (#170)

    <!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? -->
    ## Summary of the Pull Request

    - 17a3088ea581ec0826ffa212103fe3099d085c32 Switches non-AOT safe RegisterAll call to Register with type for Messenger pattern
    - fa962a574db0bcf168f322127bc3fbae8c649e7a Use Dependency Injection for Constructor of ShellViewModel to start this pattern going (as we covered in the MVVM crash course mtg)
    - 0bdd21a837352bba13901a7fc58ff28f89551147 Re-add Quit/Reload and use Messenger, but they won't appear in UI yet as Fallback Commands and we don't have search
    - dd1b1289cb4ccf4a1dece59f5ed4bb206c5ee39a Setup initial debounce strategy for search in UI layer, though search still not implemented (think found a WCT bug too, will investigate)
    - 98041ea11043732fa449c7a99d9e64d43597fcaf Update to latest WCT packages to help us test before our release 😅

commit c0589f833a
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Nov 22 04:42:33 2024 -0800

    Hide the titlebar, again (#169)

    Does the `ExtendsContentIntoTitleBar` thing to hide the titlebar.

    Also re-adds the logic that resizes our drag rect, so that the window is movable again.

commit dcc56861b9
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Nov 21 09:55:02 2024 -0800

    A couple small MVVM changes, as a sanity check (#168)

    This is my absolute first attempt at doing anything in the MVVM project, so I want to make sure i'm not wildly off base.

    * 7afc7954b Simplest possible thing: Add the other builltins
      * Just re-includes the old builtins, save for quit and reload.
    * c203c3385 Styles from the original prototype too
      * Adds the ListItem styling from before, with the subtitles below. Leaves space for icons, but I'm leaving them out for now.
    * 56eb141bf Navigate deeper into lists
      * My first attempt at doing things The Right Way - I think I can just send messages like this, to have the ShellPage navigate us around
    * 57bb6ebe6 Navigate back too
      * Similarly - if we can go in, we should be able to go out
    * 5c87a62bf slide-y navigations
      * I like the slide transitions, so I just wanted to see them in action again. It's _good_
    * b1ef6896a Keep focus in the search box
      * When we navigate to a new list page, try to keep the focus in the search box still

commit 0a275fd7bd
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Nov 21 08:05:17 2024 -0800

    ListItems, ContextItems, and the TopLevel are `ICommandItem`s (#164)

    This PR targets #160. A lot of the ideas that led here were written down there first. Especially the "stub" command bits, which precipitated the value for an interface that matched what the top-level commands can really return.
     
    The TL;DR of this PR is found here:
    https://github.com/zadjii-msft/PowerToys/issues/153#issuecomment-2486367825

    * [x] Closes #153
    * [x] Closes #109

    Shockingly, the code change is kinda small. It's mostly just careful find/replace's.

    Fallback handlers took the biggest delta, but even they work again in the prototype.

commit b1039f74cc
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Nov 21 07:49:15 2024 -0800

    Add aliases to the protoype; improve calculator command (#167)

    One final yolo for the prototype app, just to see how it feels.

    This adds very rudimentary alias support to the prototype app. I only hardcoded a few of them - calculator, registry, windows settings, and my own virtual desktop switcher. The aliases are powered by the ICommand.Id, added in #160

    Now that we have the alias for the calculator though, it needed to be a lot better. I did that too. Now it saves your history (per launch session), and you can copy the results to the clipboard. And also use TextToSuggest to fill in the current result. And also if you select an old result, it'll plop it back into the search text.

commit 6b21ef2e5d
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Nov 21 04:49:14 2024 -0800

    Remaining spec details for the extension lifecycle (#160)

    Cleans up a huge remaining TODO section from the spec about the extension lifecycle.

    This documents affordances for extensions to be lazy-loaded, so that we don't always load every extension process. Extensions can also opt-out of this behavior.

    This one doesn't actually have code associated with it. It sounded like a lot to write, for code that would eventually just be tossed next week.

    It does, however, have a drive-by fix for the spongebot extension

    Closes #81

commit da314ce4c7
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Nov 21 06:47:25 2024 -0600

    Add a snippet for making a new PR (#165)

    What it says on the tin.

    I usually keep this in the palette, but I keep also clean building and blowing away my `state.json`

    ---------

    Co-authored-by: Mike Griese <migrie@microsoft.com>

commit cc3f1f9515
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Thu Nov 21 07:46:10 2024 -0500

    Add Settings to Terminal Profiles Extension (Core) (#162)

    ## Summary of the Pull Request

    This PR adds the equivalent settings functionality seen in PT Run Profiles Plugin out of the box.

    It leverages the Settings class helpers to create the settings form.

    Here are some screenshots of the resulting changes:

    ![image](https://github.com/user-attachments/assets/c7bb9582-93a2-41c0-9351-0bec5c27fbbf)

    ![image](https://github.com/user-attachments/assets/c932cd4c-6cfd-47be-9bf9-d18ff4dbb85c)

    ![image](https://github.com/user-attachments/assets/cee62edb-aa35-42e0-b73a-aab79514c7e1)

    ---------

    Co-authored-by: Jordi Adoumie <jordiadoumie@microsoft.com>
    Co-authored-by: Mike Griese <migrie@microsoft.com>

commit fdc483ce2c
Merge: 175a16058 f67521750
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Nov 21 06:36:57 2024 -0600

    Merge pull request #159 from zadjii-msft/dev/migrie/check-extensions-script

    To help debug #104, though, doesn't fix it

commit 175a16058d
Merge: dc8a529e8 a6eeba981
Author: Mike Griese <zadjii@gmail.com>
Date:   Thu Nov 21 06:24:47 2024 -0600

    Merge pull request #166 from zadjii-msft/dev/migrie/f/side-by-side-prototype

    What it says on the tin.

commit a6eeba9816
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Nov 21 06:23:16 2024 -0600

    Allow the prototype and TRA to run at the same time

commit dc8a529e86
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Nov 15 11:00:15 2024 -0800

    A collection of prototype fixes (#158)

    Probably the last real prototype commit.

    There was a collection of _little things_ that made the current state of the prototype a little wacky. This fixes a lot of them, so that the prototype is in a "demoable" state.

    * Updates the WinUI version - there was a bugfix in that minor version bump that's needed to help fix the `E_LAYOUTCYCLE`.
    * The list no longer flickers uncontrollably as it loads top-level commands
    * filtering the list is a lot more efficient (still not what it used to be though)
    * Forms us a `ListView` instead of an `ItemsRepeater`. `ItemsView` also had a layout cycle, go figure.
    * Fixes the namespace of the samples extension, so it doesn't conflict with the SSH one
    * Adds a bunch of icons, subtitles
    * When the list updates, we'll try to maintain the selected item (really useful for something like the mastodon extension)
    * When we update tthe filter text, we'll do _way_ better at actually updating our own `SelectedItem`,
      * so that the Details doesn't stay open on an app if you hit `esc`
      * so that the selection doesn't.... fuck off to space (closes #155)
    * Fixes the calculator command to show up originally in the list
    * Includes _some_ of the styling changes @niels9001 is working on (notably, the subtitle being on it's own line)
    * I think also fixes #113

commit 42e7566926
Author: Mike Griese <zadjii@gmail.com>
Date:   Fri Nov 15 12:54:14 2024 -0600

    Add `AccentColor`s to `Page`s (#157)

    Just for @ niels9001 to play around with.

commit f675217508
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Nov 15 08:44:29 2024 -0600

    Add a helper to sanity check extension installs

commit eb76898d2c
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Nov 15 05:31:46 2024 -0800

    Fix a layout cycle crash in the prototype (#156)

    Resurrects the Pokedex extension I was working on before Luca was born.

    This is a simple sample of a list with a _lot_ of items, and tags tags tags. It helps to repro a E_LAYOUT_CYCLE that we were seeing.

    This also fixes that layout cycle, by removing that unneeded `StackPanel`

    Fixes #WaitItLooksLikeINeverFiledThis

commit 1e7cc5cbda
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Nov 12 05:58:43 2024 -0800

    Spec, basic impl for `TextToSuggest` (#145)

    As discussed in #121.

    Adds a new `IListItem.TextToSuggest` property. If an extension populates that, and the user hits right-arrow when the item is selected, we'll set the `SearchText` to that text.

    I didn't give it a UI treatment, because
    1. I'm not good at XAML
    2. As noted in https://github.com/zadjii-msft/PowerToys/issues/121#issuecomment-2464704543, there's complicated edge cases here. You have to track what's actually been typed, and then also have a ghost suggestion for the very first item (before the user types/up/downs at all).

    I didn't think it was valuable to implement that right now before we have A Real App.

    * targets #144
      * which targets #142
        * which targets #141

    and those guys are all merged as of #150

commit a41e7e7d00
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Nov 12 05:55:40 2024 -0800

    MAIN: Update lists for better dynamic lists, pagination, async (#150)

    Originally in #142 and #144, but github didn't automatically change the base branch 😨

    -----

    As discussed in #77.

    Biggest change is that `IDynamicListPage` doesn't have `GetItems(String query)` anymore. Instead, the host will call the `SearchText` setter, and the list can raise `ItemsChanged` to let the host know to call `GetItems` again

    See src/modules/cmdpal/Exts/EverythingExtension/Pages/EverythingExtensionPage.cs for an example of how to update dynamic extensions.

    Closes #131
    Closes #77

    ----

    * I put the sample pages into a single top-level command, so deploying that extension didn't add 5 top-level commands to your palette
    * I tightened up some of the phrasing for the samples, and the builtins, to be less repetitive
    * I added a few icons
    * I made the markdown sample longer (and work more reliably)
    * and also thank you Hawker for auto-format on save, you the man

commit b96ab5e871
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Nov 12 05:37:51 2024 -0800

    Add helper classes for very simple settings (#141)

    This updates the spec to enable CmdPal to host settings for extensions. Extensions can provide us essentially, a FormPage, and we'll give that special treatment as _the settings_ for the extension. We're gonna use this in #100 in the future.

    For now, I also added a helper set of classes for quickly constructing a `Settings` object, which is basically just a dictionary. Notably though, it lets us define simple control types for each of these settings, which we can then turn into the `IFormPage` on the developer's behalf.

    See the [`SampleSettingsPage.cs`](https://github.com/zadjii-msft/PowerToys/compare/main...dev/migrie/s/settings-for-extensions#diff-ac06e39258579222e94539315ad59e0bf04f3b0f3e83a2f8a11aa5a42d569ebe) for an example.

    Closes #123

commit 4a23ba25ac
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Tue Nov 12 14:37:23 2024 +0100

    Merge upstream main (#149)

    * [Settings]Fix release cycle links in OOBE What's New page (#35801)

    * Fix release cycle link in OOBE

    Previously it would point to the 5ft last release instead.

    * Adressed feedback

    * [Deps]Upgrade System.IO.Abstractions (#35656)

    * Upgrade System.IO.Abstractions to the latest stable release

commit 8344fe77a6
Author: Mike Griese <migrie@microsoft.com>
Date:   Mon Nov 11 05:36:16 2024 -0800

    Fix the build (#146)

    Whoops.

    We were accidentally deploying all the extension packages to the _same_ directory. That meant we could only ever register one at a time - including the extension host. yikes.

commit b10325430c
Author: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Date:   Fri Nov 8 19:02:07 2024 +0100

    Integrate into PowerToys.sln (#140)

    ## Summary of the Pull Request
     - integrate all projects into PowerToys.sln
     - remove all other .sln files
     - remove unneeded files IMO (LET ME KNOW IF SOME OF THOES FILES ARE ACTUALLY NEEDED!)

commit c319a74e74
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Nov 5 10:22:15 2024 -0600

    Create an `IExtensionHost` class, to enable logging (#137)

    Allow extensions to send status messages to the host app.

    As an example, you can now:

    ```cs
    ExtensionHost.LogMessage(new LogMessage() { Message = "This is a test, from the HackerNews sample" });
    ```

    And have that appear in the host apps debug console.

    Closes #134
    Closes #118

    Should also make resolving #87 and #135 easier.

    We don't have the design of these status messages totally planned out yet. But this should at least make it possible. For those in the back, **this does not actually display these messages anywhere in the host UX currently**.

    -----

    Other information that's currently included:
    * The host app's HWND. Way too many times does the Windows API need an HWND, which extensions won't have, but the host app does.
    * The `LanguageOverride`. This is in case we ever want to support `PrimaryLanguageOverride` in the host app.

commit 6ee3ad68b0
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Nov 5 10:21:39 2024 -0600

    Implement the "explore" page from mastodon (#132)

    Actually implements the mastodon extension. Open APIs are great. My baby sleeping for four hours is even better.

    This sample has a list of posts. Each item has Details, which are the post bodies. viewing the post opens a form page with the whole thread of that post and any replies on it.

    * closes #101
    * closes #79
    * Also removes the space for the `HeroImage` if we don't need it.
    * Fixes an issue where forms straight up didn't work (they weren't loading on the main thread)
    * Adds a helper `OpenUrl` command (does what it says on the tin)

    This extension covers a lot of concepts so I think it's a valuable test. I'm hoping to do auth for allowing you to post/comment/favorite/boost/etc in the future.

    Also helped understand what we need for pagination.

    Also revealed that ItemsRepeaters are cursed.

commit 40dc46b6e1
Merge: 878692650 20914094a
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Tue Nov 5 13:29:33 2024 +0000

    Merge upstream main into zadjii-msft/stefan/merge_pt_main

    Merge PT main

commit 20914094a9
Merge: 878692650 eed39e5d1
Author: Stefan Markovic <stefan@janeasystems.com>
Date:   Tue Nov 5 14:12:01 2024 +0100

    Merge remote-tracking branch 'mainPT/main' into stefan/merge_pt_main

commit 878692650a
Author: Mike Griese <migrie@microsoft.com>
Date:   Sun Nov 3 10:38:18 2024 -0600

    Removed sections from the spec, prototype (#129)

    As discussed.

    I'm getting rid of  ``ISection[]`` and replacing that with just a `String Section { get; }`[^1] property on `ListItem`'s themselves.

    I didn't want to bother wasting engineering resurrecting the `SectionListView` thing in the prototype without `ISection`s, so I'll just leave that for us to implement The Right Way in the MVVM exe.

    This should keep the prototype running, and keep us moving forward

    [^1]: we discussed making this an object. I didn't here, but we probably can in the future.

commit 3ef20c5b23
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Sun Nov 3 09:47:15 2024 -0500

    Adding Windows Settings from PT Plugin (#128)

    * first pass for windows services core ext

    * added Windows Registry Plugin

    * updated PR to reflect wt profiles, registry, and services extensions and incorporating feedback

    * first pass for windows settings

    * Added gh issues for TODOs

    * fixed placeholder text for open command and added additional GH issue refs

    * move list page and command to ctor to avoid new allocation each time TopLevelCommands is invoked

    * change KeepOpen to Dismiss on CommandResult for OpenSettingsCommand

    ---------

    Co-authored-by: Mike Griese <migrie@microsoft.com>

commit 580fe99094
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Thu Oct 31 11:56:00 2024 -0400

    Adding Windows Services, Registry Core Ext from PT Run (#120)

    * first pass for windows services core ext

    * added Windows Registry Plugin

    * updated PR to reflect wt profiles, registry, and services extensions and incorporating feedback

    * fixing dead code

commit ae5e6ed594
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Oct 23 14:54:46 2024 -0500

    Add Connor's Everything extension (#106)

    This is his Everything extension from the Hackathon. I'm merging this in as-is, to use as a base for future testing. I don't want to have a bunch of prototypes that are totally orphaned

    It requires Everything to be running in the background.

    My changes are
    * 0e2d9edfcec65b032adc860ffb5be04bb3076f07: merge main
    * 7d1e4dfeb54e58838c75a2209bd85dc2ccf14448: don't use an absolute path to everything64.dll
    * 3f71bd5670e98d508291516db34c583a2d2d9e13: Add a `Details` to the error element that's displayed when there's an exception from an extension.
    * 67453d732f0e825913f232e04d05d934306518c7: Add actual error messages specific to Everything
    * a69f811594aa4f18756e60293e7bcd9cee16341a: Use the x86 path to the icon, if needed

    ---------

    Co-authored-by: Connor Plante <connor.plante@gmail.com>

commit 2c8e24ad65
Merge: 7b0b298f0 4db1cc8fc
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Wed Oct 23 15:03:47 2024 -0400

    Merge pull request #119 from zadjii-msft/joadoumie/windows-terminal

    Adding Windows Terminal Plugin from PT Run

commit 4db1cc8fcc
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Wed Oct 23 15:00:20 2024 -0400

    Added runas admin to Context Menu

commit 63dcead687
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Wed Oct 23 14:35:51 2024 -0400

    Added terminal icon for profiles

commit f878b42abe
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Wed Oct 23 11:36:02 2024 -0400

    launching works for profiles

commit 8e9e9f1a66
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Wed Oct 23 10:25:21 2024 -0400

    terminal profiles showing up

commit 7b0b298f00
Merge: c7fae3012 950f6afdd
Author: Clint Rutkas <clint@rutkas.com>
Date:   Mon Oct 21 20:30:56 2024 -0700

    Merge pull request #105 from microsoft/main

    sync to main

commit 950f6afdda
Merge: dc7c7ef2b c7fae3012
Author: Clint Rutkas <clint@rutkas.com>
Date:   Mon Oct 21 20:29:41 2024 -0700

    Merge branch 'main' into main

commit c7fae30123
Merge: 8ba465476 07ec7980d
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Oct 8 17:26:40 2024 -0700

    Merge branch 'microsoft:main' into main

commit 8ba465476f
Merge: 57fe0280b 474c6f732
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 27 03:43:06 2024 -0700

    Merge branch 'microsoft:main' into main

commit 57fe0280b3
Merge: e5b1594db 94931494f
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Mon Sep 23 11:56:42 2024 -0400

    Merge pull request #71 from zadjii-msft/joadoumie/sample-clean-up

    sample clean up

commit 94931494f3
Author: joadoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Mon Sep 23 11:54:38 2024 -0400

    sample clean up

commit e5b1594dba
Merge: 18f6b5b0f b99f530cc
Author: Michael Hawker MSFT (XAML Llama) <24302614+michael-hawker@users.noreply.github.com>
Date:   Fri Sep 20 15:24:16 2024 -0700

    Merge pull request #68 from zadjii-msft/llama/di+vm

    Setup DependencyInjection

commit 18f6b5b0fd
Merge: 9ab84cb3a 88e5ad1f3
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Fri Sep 20 15:53:13 2024 -0400

    Merge pull request #69 from zadjii-msft/users/ethanfang/youtube-ext

    YouTube Extension for Command Palette

commit b99f530cc5
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Fri Sep 20 10:33:16 2024 -0400

    nits

commit 88e5ad1f3d
Author: Ethan Fang <ethanfang@microsoft.com>
Date:   Fri Sep 20 00:10:21 2024 -0500

    Updated naming and taggin

commit 53b584049c
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Thu Sep 19 15:35:35 2024 -0700

    Basic keyboard handling in SearchBox demonstrating decoupled control messaging

commit e6df40eec7
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Thu Sep 19 12:37:03 2024 -0700

    Use ObservableGroupedCollection to handle grouping of sections for UI between ViewModel and View

    ObservableGroupedCollection is from MVVM Toolkit: https://learn.microsoft.com/dotnet/communitytoolkit/mvvm/observablegroupedcollections

commit 4cba257bdd
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Wed Sep 18 16:46:02 2024 -0700

    Setup DependencyInjection for the initialization of the Built-In Providers and the main view model

    Does some quick plumbing to show things in the existing UI via MVVM.
    TODO: Need to sort out how to better separate the models and viewmodels and how things behave within our special top-level 'main' page vs. extension pages, etc...

commit 9ab84cb3a5
Merge: 66411a91c 7ac0358a5
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Thu Sep 19 13:06:04 2024 -0400

    Merge pull request #70 from zadjii-msft/krschau/size-acrylic

commit 7ac0358a5d
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Thu Sep 19 12:56:28 2024 -0400

    Bring in window size and acrylic

commit 19f46d2c71
Author: Ethan Fang <ethanfang@microsoft.com>
Date:   Thu Sep 19 10:41:41 2024 -0500

    updates based on Jordi convo

commit 70ddb2e0ac
Merge: 8524961d3 961823d6a
Author: Ethan Fang <ethanfang@microsoft.com>
Date:   Thu Sep 19 10:11:16 2024 -0500

    Merge branch 'users/ethanfang/youtube-ext' of https://github.com/zadjii-msft/PowerToys into users/ethanfang/youtube-ext

commit 8524961d34
Author: Ethan Fang <ethanfang@microsoft.com>
Date:   Thu Sep 19 10:11:01 2024 -0500

    minor fixes to query size and naming

commit 66411a91cb
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Thu Sep 19 10:30:58 2024 -0400

    Fix copyright in editorconfig

commit 9316566f91
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Thu Sep 19 10:13:55 2024 -0400

    Cleanup / typos

commit 961823d6a9
Merge: 0a6b500e1 5ceb38671
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Thu Sep 19 09:51:58 2024 -0400

    Merge branch 'main' into users/ethanfang/youtube-ext

commit 0a6b500e1a
Author: Ethan Fang <ethanfang@microsoft.com>
Date:   Thu Sep 19 01:31:48 2024 -0500

    YouTube Extension V0 Complete

commit 5ceb38671a
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Wed Sep 18 18:56:23 2024 -0400

    Fix some typos

commit 36195db409
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Wed Sep 18 18:44:57 2024 -0400

    tabs -> spaces

commit 0a02d19701
Merge: 22cfd6086 95c880ca2
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Wed Sep 18 18:40:27 2024 -0400

    Merge pull request #67 from zadjii-msft/user/krschau/actionbar

    Add ActionBar control

commit 95c880ca21
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Wed Sep 18 17:40:52 2024 -0400

    Add ViewModels for ActionBar

commit e9ee4046df
Author: Ethan Fang <ethanfang@microsoft.com>
Date:   Wed Sep 18 15:04:41 2024 -0500

    savings changes for jordi to play around

commit b7a4706e49
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Wed Sep 18 15:20:09 2024 -0400

    Add ActionBar

commit 22cfd60863
Merge: 71375e75f 12f29ab6a
Author: Michael Hawker MSFT (XAML Llama) <24302614+michael-hawker@users.noreply.github.com>
Date:   Wed Sep 18 11:25:29 2024 -0700

    Merge pull request #65 from zadjii-msft/llama/ext

    Add ShellPage

commit 71375e75f1
Merge: 2cfbe6894 080d21b09
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 18 11:03:10 2024 -0700

    Merge pull request #66 from zadjii-msft/dev/crutkas/moveAppsToDedicatedPlugin

    refactoring apps to dedicated project

commit 080d21b09f
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 18 11:02:47 2024 -0700

    removing x86 references

commit 6b7930a879
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 18 10:57:20 2024 -0700

    refactoring apps to dedicated project

commit 12f29ab6a3
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Tue Sep 17 15:56:28 2024 -0700

    Setup ShellPage and Loading Placeholder

commit c92800fc32
Author: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Date:   Tue Sep 17 15:07:14 2024 -0700

    Give new UI app same identity as POC

commit 2cfbe68942
Merge: 5f778cfe4 d7a07dc7c
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 18 09:10:43 2024 -0700

    Merge branch 'microsoft:main' into main

commit 5f778cfe43
Merge: a8f12731a 2f64260fe
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Wed Sep 18 11:37:23 2024 -0400

    Merge pull request #64 from zadjii-msft/krschau/searchbar

    Make SearchBar its own control

commit 2f64260fef
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Tue Sep 17 19:22:14 2024 -0400

    Put back events

commit d6636b9450
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Wed Sep 18 11:24:38 2024 -0400

    Add SearchBar

commit a8f12731a2
Merge: 316aefba6 9561ff9e2
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Wed Sep 18 11:11:01 2024 -0400

    Merge pull request #63 from zadjii-msft/user/krschau/converters2

    Use built in converters

commit 9561ff9e28
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Tue Sep 17 20:07:29 2024 -0400

    Use built in converters

commit 52cac94e26
Author: Ethan Fang <ethanfang@microsoft.com>
Date:   Tue Sep 17 16:17:49 2024 -0500

    tags, details, & minor updates

commit 316aefba64
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Tue Sep 17 16:35:07 2024 -0400

    Add assets

commit b12930e943
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Tue Sep 17 15:41:12 2024 -0400

    cleanup

commit 91f659e1ed
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 17 12:23:44 2024 -0700

    Shuffling a smidge just for visual to know UI vs POC

commit 40ef2547ee
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 17 12:17:14 2024 -0700

    Getting MVVM in

commit 355762629f
Merge: 340303150 1748b7803
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Tue Sep 17 14:52:43 2024 -0400

    Remove unused title bar (#62)

    Remove unused title bar

commit 1748b78034
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Tue Sep 17 14:38:34 2024 -0400

    Remove some stuff we don't use

commit 3403031505
Merge: 1436fc0d6 bb51ca544
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Tue Sep 17 13:34:55 2024 -0400

    Merge pull request #61 from zadjii-msft/joadoumie/sample-updates

    small changes to sample

commit bb51ca544f
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Tue Sep 17 13:33:50 2024 -0400

    small changes to sample

commit 26ced6c51e
Merge: 54e7f694c 1436fc0d6
Author: Ethan Fang <ethanfang@microsoft.com>
Date:   Tue Sep 17 12:17:01 2024 -0500

    Merge branch 'main' of https://github.com/zadjii-msft/PowerToys into users/ethanfang/youtube-ext

commit 1436fc0d6e
Merge: 8395c5009 3c44be064
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Tue Sep 17 13:07:57 2024 -0400

    Merge pull request #60 from zadjii-msft/niels9001/fluent3

    [UX] Fluent design

commit 54e7f694c8
Author: Ethan Fang <ethanfang@microsoft.com>
Date:   Tue Sep 17 12:04:34 2024 -0500

    YouTube Extension with API Auth (& verification) as well as "Search Videos" command (working)

commit 3c44be0648
Author: Niels Laute <niels.laute@live.nl>
Date:   Tue Sep 17 16:56:15 2024 +0200

    More tweaks

commit a5b861280f
Author: Niels Laute <niels.laute@live.nl>
Date:   Tue Sep 17 15:15:37 2024 +0200

    Other pages

commit ac23fd2c9e
Author: Niels Laute <niels.laute@live.nl>
Date:   Tue Sep 17 14:42:17 2024 +0200

    Moving styles to resourcedictionary

commit 964c5eb5cd
Author: Niels Laute <niels.laute@live.nl>
Date:   Tue Sep 17 14:38:19 2024 +0200

    Adding SubtleButtonStyle

commit bd4e058c6f
Author: Niels Laute <niels.laute@live.nl>
Date:   Tue Sep 17 14:31:49 2024 +0200

    Initial pass

commit 8395c50093
Merge: fed659662 55b4ad62b
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Mon Sep 16 17:16:30 2024 -0400

    Merge pull request #58 from krschau/main

    Fix namespaces

commit 55b4ad62bf
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Mon Sep 16 16:42:02 2024 -0400

    Fix more namespaces

commit 4a5fd00ce1
Author: Kristen Schau <47155823+krschau@users.noreply.github.com>
Date:   Mon Sep 16 15:30:26 2024 -0400

    DeveloperCommandPalette -> WindowsCommandPalette

commit fed659662f
Merge: 6ec207935 2fd268784
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Fri Sep 13 14:11:55 2024 -0700

    Merge pull request #56 from zadjii-msft/joadoumie/updating-docs

    fixing bugs in my docs

commit 2fd268784e
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Fri Sep 13 14:08:23 2024 -0700

    fixing bugs in my docs

commit 6ec2079353
Merge: 598a00f13 c71881af5
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Fri Sep 13 14:06:13 2024 -0700

    Merge pull request #55 from zadjii-msft/joadoumie/updating-docs

    more doc updates

commit c71881af54
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Fri Sep 13 13:54:58 2024 -0700

    more doc updates

commit 598a00f13e
Merge: f06dd26d4 c5dc35ce4
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Fri Sep 13 13:31:18 2024 -0700

    Merge pull request #54 from zadjii-msft/joadoumie/updating-docs

    doc edits

commit c5dc35ce4a
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Fri Sep 13 13:29:17 2024 -0700

    doc edits

commit f06dd26d41
Merge: 2335e85b0 10afc7e6c
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Fri Sep 13 13:23:30 2024 -0700

    Merge pull request #53 from zadjii-msft/joadoumie/updating-docs

    updating docs

commit 10afc7e6ca
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Fri Sep 13 13:21:47 2024 -0700

    updating docs

commit 2335e85b00
Merge: f464b6979 77e0449b5
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Fri Sep 13 10:14:47 2024 -0700

    Merge pull request #52 from zadjii-msft/joadoumie/modify-template

    tweaking template

commit 77e0449b56
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Fri Sep 13 09:44:59 2024 -0700

    Adding folder structure to match docs

commit 1de870a8a8
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Fri Sep 13 09:40:31 2024 -0700

    tweaking template

commit f464b6979c
Merge: d89d2c9c1 a1a2677c2
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 12 08:51:34 2024 -0700

    Merge pull request #51 from zadjii-msft/merge-wasdk-1.6

    Merge latest PowerToys main with Windows App SDK 1.6

commit a1a2677c2d
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Thu Sep 12 11:22:12 2024 +0100

    Reference WebView2 on Projects where WinAppSDK is referenced

commit 869fd972db
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Thu Sep 12 11:07:18 2024 +0100

    Put .vsconfig more in line with versions in PowerToys

commit f96c03de4a
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Thu Sep 12 10:51:18 2024 +0100

    Adding partial to classes that implement WinRT interfaces

commit 882205b8ab
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Thu Sep 12 10:41:13 2024 +0100

    Add WebView 2 projects alongside Windows App SDK

commit 0b0cf459a3
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Thu Sep 12 10:40:55 2024 +0100

    Update versions to WASDK 1.6

commit 44a04630f4
Merge: d89d2c9c1 7e99389b6
Author: Jaime Bernardo <jaime@janeasystems.com>
Date:   Thu Sep 12 10:08:16 2024 +0100

    Merge branch 'main' into merge-wasdk-1.6

commit d89d2c9c1c
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 10 14:59:56 2024 -0700

    slamming in public profiles

commit 5b48d5f6ea
Merge: fc90b2a32 b82840c5e
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Mon Sep 9 09:01:53 2024 -0700

    Merge pull request #50 from zadjii-msft/joadoumie/sample-extension

    SSH / Sample Pages Exetnsion

commit b82840c5ed
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sat Sep 7 22:31:52 2024 -0700

    dynamic list page example

commit 7f489f2c13
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sat Sep 7 09:12:47 2024 -0700

    Add example for list page with details

commit 3cf16421bb
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sat Sep 7 08:59:33 2024 -0700

    cleaned up form page example

commit 9ba9a93cb5
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sat Sep 7 08:40:20 2024 -0700

    fixing bugs

commit 74c7f83482
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sat Sep 7 08:18:05 2024 -0700

    ty clint

commit 350ffd372a
Merge: 55bef30b0 fc90b2a32
Author: Jordi Adoumie <98557455+joadoumie@users.noreply.github.com>
Date:   Sat Sep 7 08:11:28 2024 -0700

    Merge branch 'main' into joadoumie/sample-extension

commit 55bef30b01
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sat Sep 7 07:59:02 2024 -0700

    fix bug

commit 600d039084
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sat Sep 7 07:51:53 2024 -0700

    added sample form

commit 4f14db8772
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Sat Sep 7 00:36:47 2024 -0700

    adding additional samples

commit b8ac6b82a8
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Fri Sep 6 23:29:57 2024 -0700

    fix naming in .csproj

commit e2c220f5a9
Author: Jordi Adoumie <jordiadoumie@microsoft.com>
Date:   Fri Sep 6 23:24:10 2024 -0700

    working implementation of SSH Keychain Extension

commit fc90b2a32e
Merge: d157db277 133627ac2
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 6 17:05:16 2024 -0700

    Merge pull request #49 from zadjii-msft/dev/crutkas/remainingErrors

    resolving last errors

commit 133627ac2e
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 6 15:42:16 2024 -0700

    removing property

commit c36da68701
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 6 15:41:26 2024 -0700

    last error!

commit 4524a6c079
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 6 15:37:10 2024 -0700

    more and more :)

commit d157db277e
Merge: 3b7a33b3d a76af1f8c
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 6 13:30:23 2024 -0700

    Merge pull request #48 from zadjii-msft/dev/crutkas/addArmBackIn

    Recovering arm64 support and adjusting runtime ID for x64

commit a76af1f8c7
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 6 13:29:44 2024 -0700

    missed one

commit f77a747d15
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 6 13:27:51 2024 -0700

    Recovering arm64 support and adjusting runtime ID for x64

commit 3b7a33b3dc
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Sep 6 14:12:27 2024 -0500

    Some other SDK renaming (to get rid of old `Actions` references) (#47)

    * All the `ActionProvider`s were renamed to `CommandProvider`
    * `Page`s all got a `Title`
    * `IListItem` got it own `Icon`
    * `ActionResult` -> `CommandResult`
    * add all the pubxml's we lost

commit f5d58be822
Author: Mike Griese <migrie@microsoft.com>
Date:   Fri Sep 6 12:53:29 2024 -0500

    Add a class diagram (#44)

    this represents the CURRENT STATE of the spec

commit 6c8f1bf8ba
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 6 10:46:58 2024 -0700

    Moving to root cmdpal (#46)

    should be unified root now for most things

commit 623ceec2c8
Merge: 95df52dc4 af1bfc817
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 6 08:52:12 2024 -0700

    Merge pull request #45 from zadjii-msft/dev/crutkas/pathToRoot

    simplifying path roots for cpp

commit af1bfc8170
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 6 08:23:34 2024 -0700

    simplifying path roots

commit 95df52dc44
Merge: d7a1d2777 a1220e2a4
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Sep 6 07:01:41 2024 -0700

    Merge pull request #43 from zadjii-msft/dev/crutkas/restOfCleanup

    Whole lotta cleanup, calling it a night

commit a1220e2a4f
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 21:59:18 2024 -0700

    adjusting

commit cce3124cdd
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 21:47:07 2024 -0700

    more adjustments

commit 3c3c82298a
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 21:40:47 2024 -0700

    getting errors fixed

commit 283d74511c
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 21:39:35 2024 -0700

    more errors

commit 3258d5c52c
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 21:16:24 2024 -0700

    adjusting form stuff

commit 411fab236d
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 21:13:10 2024 -0700

    few more, onward to 50

commit 4c353f2464
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 21:10:33 2024 -0700

    samll adjustments

commit 737495d251
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 21:07:31 2024 -0700

    More cleanup!

commit 2fb5251f38
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 21:02:58 2024 -0700

    more clenaup

commit 4f6ed8f91b
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 20:56:53 2024 -0700

    lotta cleanup

commit d7a1d27778
Merge: 586d6172a 452f26c53
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 20:37:59 2024 -0700

    Merge pull request #42 from zadjii-msft/dev/crutkas/sdkRefactorPart3

    Dev/crutkas/sdk refactor part3

commit 452f26c53d
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 20:36:26 2024 -0700

    operational!

commit a93d8b94d1
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 20:34:50 2024 -0700

    should be passing,

commit 234a9314a3
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 17:12:15 2024 -0700

    more updates :)

commit d6f62c0e81
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 16:35:31 2024 -0700

    getting tag compliant again

commit 2e32cfad0e
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 16:35:07 2024 -0700

    vars

commit 28cd7967d0
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 16:02:38 2024 -0700

    defaults / spacing

commit e6d4cde45f
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 15:54:04 2024 -0700

    lotta baseline adjustments

commit 586d6172a5
Merge: 3b1c615e4 9591d75d4
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 13:55:18 2024 -0700

    Merge branch 'microsoft:main' into main

commit 3b1c615e43
Merge: 4b7b72882 cd5975403
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 13:54:48 2024 -0700

    Merge pull request #41 from zadjii-msft/dev/crutkas/sdkRefactorPart2

    More renaming and making stuff private

commit cd59754031
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 13:09:45 2024 -0700

    More renaming and making stuff private

commit 4b7b728825
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Sep 5 14:04:29 2024 -0500

    Rename the extension SDK to `Microsoft.CmdPal.Extensions` (#40)

    This obviously touched the entire world

commit ecaa2235af
Merge: 44e95187e f436bbfe5
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 11:33:14 2024 -0700

    Merge pull request #39 from zadjii-msft/dev/crutkas/sdkRenaming

    Initial SDK refactors

commit f436bbfe50
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 11:11:23 2024 -0700

    updating details too

commit 25947ce10c
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 10:38:41 2024 -0700

    doing a few initial fixes

commit 44e95187e0
Merge: 9ae70eff9 8dda9a3d5
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 10:14:59 2024 -0700

    Merge pull request #38 from zadjii-msft/dev/crutkas/additionalCleanup

    Dev/crutkas/additional cleanup

commit 8dda9a3d5e
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 10:13:46 2024 -0700

    undoing warning

commit 599cec3c30
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Sep 5 10:13:29 2024 -0700

    more baseline cleanup

commit 9ae70eff91
Merge: bb77b33c0 fd464f1a3
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 20:59:10 2024 -0700

    Merge pull request #37 from zadjii-msft/dev/crutkas/moreBaseCleanup

    Dev/crutkas/more base cleanup

commit fd464f1a3a
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 20:58:15 2024 -0700

    more baseline cleanup efforts

commit 5001d88c44
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 20:39:20 2024 -0700

    abstracting files out

commit bb77b33c05
Merge: d7189bf0a c4bcd25e4
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 17:06:52 2024 -0700

    Merge pull request #36 from zadjii-msft/dev/crutkas/moreBaseCleanup

    Dev/crutkas/more base cleanup

commit c4bcd25e43
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 16:57:30 2024 -0700

    breaking more out

commit 62783f3bd5
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 16:55:30 2024 -0700

    more breaking stuff out

commit a84905426b
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 16:51:10 2024 -0700

    renaming

commit 0c6ce7bfe0
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 16:49:44 2024 -0700

    Changing name of commnad

commit 5165a0df49
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 16:35:54 2024 -0700

    Getting a bunch more setup

commit d7189bf0ad
Merge: 67387214f 6c0f28429
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 16:23:41 2024 -0700

    Merge pull request #35 from zadjii-msft/dev/crutkas/abstractSettings

    Abstracting core settings out

commit 6c0f28429e
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 16:22:51 2024 -0700

    Abstracting core settings out

commit 67387214f6
Merge: 457dcbfb8 a4897b597
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 15:57:48 2024 -0700

    Merge pull request #34 from zadjii-msft/dev/crutkas/continueFixes

    Bookmarks abstracted out of main project

commit a4897b5976
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 15:49:11 2024 -0700

    namespace adjustment

commit 75ab71f55a
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 15:44:53 2024 -0700

    bookmarks are moved to new project

commit 0ec9bbb02f
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 15:36:35 2024 -0700

    few more errors knocked out

commit 14c8f79130
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 15:29:14 2024 -0700

    simplifying namespaces

commit f185bc6442
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 15:27:17 2024 -0700

    moving bookmarks and centeralizing json loader

commit 457dcbfb8d
Merge: 8d65662f1 076841ac7
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 15:01:09 2024 -0700

    Merge pull request #33 from zadjii-msft/dev/crutkas/goingAroundTheWorldWithMoreFixes

    moving calc back into individual project

commit 8d65662f10
Merge: b5a48292e 6de494d82
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 15:00:59 2024 -0700

    Merge pull request #32 from zadjii-msft/dev/crutkas/moreCleanup

    Bookmarks so it can serialize / deserialize via objects

commit 076841ac70
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 13:58:15 2024 -0700

    moving calc back into individual project

commit 6de494d826
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 13:23:09 2024 -0700

    Booksmarks now use proper serialization

commit cee0d3adb6
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 09:49:04 2024 -0700

    bunch of cleanup

commit b5a48292ef
Merge: 751cdcf16 37afde122
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 07:16:21 2024 -0700

    Merge pull request #31 from zadjii-msft/dev/migrie/fix-form-pages

    Fix form pages

commit 751cdcf166
Merge: 94cadcf1b 6e1ca090d
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 07:16:07 2024 -0700

    Merge pull request #30 from zadjii-msft/dev/migrie/vcxproj-relative-path

    Use the nuget packages at the PowerToys root

commit 94cadcf1bf
Merge: 0e2872968 f12b9f4c4
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 07:15:55 2024 -0700

    Merge pull request #29 from zadjii-msft/dev/migrie/template-project

    Add a template project and a script to generate an extension

commit 0e28729683
Merge: 5a93de4c4 c2a47aed2
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Sep 4 07:15:40 2024 -0700

    Merge pull request #28 from zadjii-msft/dev/crutkas/fixMore

    lotta more fixes

commit 37afde1226
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Sep 4 09:07:23 2024 -0500

    Fix form pages

    Also, add the spongebot settings page back to test

    This fixes the form bubbling thing I was talking about with @crutkas

commit 6e1ca090d3
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Sep 4 06:40:06 2024 -0500

    readme

commit 61e0cb53cc
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Sep 4 06:35:30 2024 -0500

    less punishing

commit 7220c979ad
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Sep 4 06:27:30 2024 -0500

    make this point at the PowerToys root packages

commit f12b9f4c4d
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Sep 4 06:05:14 2024 -0500

    sure

commit c2a47aed27
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 23:26:20 2024 -0700

    more stuff

commit c212c9cbad
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 23:19:53 2024 -0700

    more cleanup

commit f9cb4e20ab
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 23:15:13 2024 -0700

    more and more

commit 384bf6caa7
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 23:12:35 2024 -0700

    more basic cleanu

commit d0646488f1
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 23:04:30 2024 -0700

    Fixing more errors

commit 34dda73784
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 22:52:24 2024 -0700

    More stuff

commit 442b77cf27
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 22:44:19 2024 -0700

    Getting a bunch of errors done

commit 5a93de4c46
Merge: 9963a0a8a 87d176203
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 16:46:48 2024 -0700

    Merge pull request #27 from zadjii-msft/dev/crutkas/uiCleanupPart3

    Fixing string loader

commit 87d1762031
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 16:46:10 2024 -0700

    Fixing string loader

commit 9963a0a8a5
Merge: 0bcc1841e 7575bb7e4
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 15:34:09 2024 -0700

    Merge pull request #26 from zadjii-msft/dev/crutkas/moreUiCleanup

    refactor for process termination

commit 7575bb7e4f
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 15:10:09 2024 -0700

    init checkin

commit 0010511749
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Sep 3 16:55:11 2024 -0500

    That's right - we can generate template projects easily now

commit 6dc3e9ce94
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Sep 3 16:20:14 2024 -0500

    I think this works

commit 0bcc1841ef
Merge: c51a29353 d33aa63b7
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 14:13:12 2024 -0700

    Merge pull request #24 from zadjii-msft/dev/crutkas/refactorSponge

    init pass

commit c51a293535
Merge: 8d37fe600 5c439e777
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 14:13:00 2024 -0700

    Merge pull request #25 from zadjii-msft/dev/crutkas/cleanupOnUi

    lots of baseline adjustments

commit 5c439e7773
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 14:02:37 2024 -0700

    lots of baseline adjustments

commit d33aa63b72
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 13:20:48 2024 -0700

    init pass

commit b55f81a5a0
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Sep 3 14:48:30 2024 -0500

    template project (does this work?)

commit 8d37fe6005
Merge: a6e29784b 5afb9b1ef
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 11:05:59 2024 -0700

    Merge pull request #23 from zadjii-msft/dev/crutkas/pullOutClasses

    Breaking out files from SDK default class

commit 5afb9b1ef8
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Sep 3 11:04:12 2024 -0700

    Only refactor is breaking out the single file.

commit a6e29784be
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Sep 3 12:42:14 2024 -0500

    Move builtins into sane places (#22)

    Gets rid of the `AllApps.csproj` and `Calculator.csproj`
    Makes the namespaces a bit more consistent

    The sln now looks like
    ![image](https://github.com/user-attachments/assets/e8cd4bfa-ae83-4c02-acd8-05550262ff67)

    with the "sample" extensions here
    ![image](https://github.com/user-attachments/assets/edf4b47b-012e-46a4-80b6-5e16e7643e02)
    to better differentiate between built-in ones and the sample ones

    @crutkas as an FYI because I know this was driving him mad

commit a8d69fa45b
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Sep 3 10:35:58 2024 -0500

    Adds a 'Reload extensions' builtin ; fix a bunch of string.Empty's (#21)

    * Adds a 'Reload extensions' builtin ; fix a bunch of string.Empty's

    * whoops

commit c85bc0c372
Merge: 79cfa5dd9 e9c77e81c
Author: Clint Rutkas <clint@rutkas.com>
Date:   Mon Sep 2 21:15:32 2024 -0700

    Merge pull request #20 from zadjii-msft/dev/crutkas/cleanpu

    media player plugin

commit e9c77e81cb
Author: Clint Rutkas <clint@rutkas.com>
Date:   Mon Sep 2 21:14:36 2024 -0700

    media player online

commit 79cfa5dd95
Merge: cab4b4638 789245ff9
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Aug 30 23:54:02 2024 -0700

    Merge pull request #19 from zadjii-msft/dev/crutkas/cleanpu

    cleanup, whitespace and brackets

commit 789245ff9e
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Aug 30 23:50:56 2024 -0700

    fixing whitespace style stuff

commit cab4b46388
Merge: 255dc68f4 c0b2f1654
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Aug 30 16:40:56 2024 -0700

    Merge pull request #18 from zadjii-msft/dev/crutkas/hackerNews

    Dev/crutkas/hacker news

commit c0b2f1654a
Author: Clint Rutkas <clint@rutkas.com>
Date:   Fri Aug 30 16:38:52 2024 -0700

    hackernews now passes

commit ea4bbda107
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 21:28:10 2024 -0700

    Common is now error free

commit 255dc68f4f
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 21:22:26 2024 -0700

    Calculator module is online

commit 99a616ced2
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Aug 29 16:32:34 2024 -0500

    Actually close extension processes when we exit (#14)

    * makes `quit` not crash the app
    * makes any close actually tell our extensions to exit

    once again, thanks devhome folks

commit c9871e6540
Merge: b5ff99ba3 da09538f4
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 14:17:19 2024 -0700

    Merge pull request #13 from zadjii-msft/dev/crutkas/moreFixes

    headers

commit da09538f47
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 14:13:58 2024 -0700

    headers

commit b5ff99ba3f
Merge: b59c114cf f9aa1be67
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 14:09:05 2024 -0700

    Merge pull request #12 from zadjii-msft/dev/crutkas/whitespace1

    Headers

commit f9aa1be671
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 14:08:00 2024 -0700

    Headers

commit b59c114cf0
Merge: 6328ff116 1ac57956e
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 13:53:13 2024 -0700

    Merge pull request #11 from zadjii-msft/dev/crutkas/dsafdsaWhiteSpace

    small whitespace checkin part 1

commit 1ac57956eb
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 13:52:19 2024 -0700

    smaller whitespace checkin

commit 6328ff1160
Author: Mike Griese <migrie@microsoft.com>
Date:   Thu Aug 29 15:26:55 2024 -0500

    Use the actual devhome code for loading extensions (#8)

    As in title.

    I'm adding a `ExtensionObject<T>` object too. It doesn't _enforce_ anything. We can use it to wrap up things we get from extensions. You get the object back out with `.Unsafe`, which is a mental clue "this object might not live in this process". It'll at least give us a better clue of all the places where accessing the object might not totally be safe.

    Also fixes a bug that makes cmdpal a bit more resilient to an extension dying and being reloaded. Just go to all apps & back, and presto, reload.

commit 1120e673f7
Merge: 5e64ec219 8a14aad2b
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 13:07:48 2024 -0700

    Merge pull request #7 from zadjii-msft/dev/crutkas/analyzersOnline

    analyzers online

commit 8a14aad2bc
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 13:03:29 2024 -0700

    analyzers on but as warnings

commit 5e64ec219e
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 12:34:56 2024 -0700

    Moving Extensions into main so we don't break stuff (#6)

    * Adding in exts

    * modifying exts

    * deleting outdated azure extentions

    * removing x86

commit a0dd9d161f
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 12:34:46 2024 -0700

    Dev/crutkas/name spacepart1 (#5)

    * updating namespace for common

    * Adjusting folder structure now so we can do larger move

commit 1a89580d7c
Merge: 629169298 2bc3606b5
Author: Clint Rutkas <clint@rutkas.com>
Date:   Thu Aug 29 08:29:06 2024 -0700

    Merge pull request #4 from zadjii-msft/dev/crutkas/startToBreakoutCode

    Getting more of the projects broken into into files. Based on #3

commit 2bc3606b59
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Aug 28 23:13:57 2024 -0700

    removing some older references, breaking stuff into diff class files

commit b29d8cdb8b
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Aug 28 22:48:18 2024 -0700

    renaming the c# projects

commit 280e80c9bb
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Aug 28 21:26:52 2024 -0700

    Getting stuff on base + baseline sln

commit 6291692980
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Aug 28 18:00:39 2024 -0700

    Dev/crutkas/sln adjustment (#2)

    * Moving plugin folder

    * all .net now pointing to the tool ver prop

    * fixing cpp proj

    * consolidation of packages

    * removing non root nuget config

    * Update src/modules/cmdpal/ToolingVersions.props

    ---------

    Co-authored-by: Mike Griese <migrie@microsoft.com>

commit d3ed9f84dd
Author: Clint Rutkas <clint@rutkas.com>
Date:   Wed Aug 28 16:06:42 2024 -0700

    Getting pubxml included

commit 8c2339c1bd
Merge: 9948714ae 31abbd54a
Author: Mike Griese <migrie@microsoft.com>
Date:   Wed Aug 28 12:48:21 2024 -0500

    Merge branch 'main' of https://github.com/zadjii-msft/PowerToys

commit 9948714ae9
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Aug 27 17:00:31 2024 -0700

    removing arm / x86

commit 3890d385e7
Merge: 91b7e96bd b3b26b4f6
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Aug 27 15:33:20 2024 -0700

    Merge branch 'dev/cmdpal/main' of https://github.com/microsoft/powertoys into dev/cmdpal/main

commit 91b7e96bdb
Author: Clint Rutkas <clint@rutkas.com>
Date:   Tue Aug 27 15:33:09 2024 -0700

    Adjusting solution so x64 and Arm64 only.

commit b3b26b4f69
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Aug 27 16:29:00 2024 -0500

    Whoops M.T.UI shouldn't be in the cmdpal code - I didn't understand how VS works with C#

commit ac240df991
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Aug 27 09:47:53 2024 -0500

    extensions too

commit b5bcbcc433
Author: Mike Griese <migrie@microsoft.com>
Date:   Tue Aug 27 09:34:44 2024 -0500

    Initial commit: the core project builds
2025-03-19 13:50:12 -05:00
4019 changed files with 40636 additions and 289442 deletions

View File

@@ -1 +0,0 @@
../.github/copilot-instructions.md

View File

@@ -1 +0,0 @@
../.github/agents

View File

@@ -1 +0,0 @@
../.github/prompts

View File

@@ -1 +0,0 @@
../.github/instructions

View File

@@ -1 +0,0 @@
../.github/skills

View File

@@ -2,20 +2,16 @@
# Reference: https://github.com/microsoft/PowerToys/blob/main/doc/devdocs/readme.md#compiling-powertoys
properties:
resources:
- resource: Microsoft.Windows.Settings/WindowsSettings
- resource: Microsoft.Windows.Developer/DeveloperMode
directives:
description: Enable Developer Mode
allowPrerelease: true
# Requires elevation for the set operation
securityContext: elevated
settings:
DeveloperMode: true
Ensure: Present
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: vsPackage
directives:
description: Install Visual Studio 2022 Enterprise (Any edition will work)
# Requires elevation for the set operation
securityContext: elevated
settings:
id: Microsoft.VisualStudio.2022.Enterprise
source: winget
@@ -25,8 +21,6 @@ properties:
directives:
description: Install required VS workloads
allowPrerelease: true
# Requires elevation for the get and set operations
securityContext: elevated
settings:
productId: Microsoft.VisualStudio.Product.Enterprise
channelId: VisualStudio.17.Release

View File

@@ -2,20 +2,16 @@
# Reference: https://github.com/microsoft/PowerToys/blob/main/doc/devdocs/readme.md#compiling-powertoys
properties:
resources:
- resource: Microsoft.Windows.Settings/WindowsSettings
- resource: Microsoft.Windows.Developer/DeveloperMode
directives:
description: Enable Developer Mode
allowPrerelease: true
# Requires elevation for the set operation
securityContext: elevated
settings:
DeveloperMode: true
Ensure: Present
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: vsPackage
directives:
description: Install Visual Studio 2022 Professional (Any edition will work)
# Requires elevation for the set operation
securityContext: elevated
settings:
id: Microsoft.VisualStudio.2022.Professional
source: winget
@@ -25,8 +21,6 @@ properties:
directives:
description: Install required VS workloads
allowPrerelease: true
# Requires elevation for the get and set operations
securityContext: elevated
settings:
productId: Microsoft.VisualStudio.Product.Professional
channelId: VisualStudio.17.Release

View File

@@ -2,20 +2,16 @@
# Reference: https://github.com/microsoft/PowerToys/blob/main/doc/devdocs/readme.md#compiling-powertoys
properties:
resources:
- resource: Microsoft.Windows.Settings/WindowsSettings
- resource: Microsoft.Windows.Developer/DeveloperMode
directives:
description: Enable Developer Mode
allowPrerelease: true
# Requires elevation for the set operation
securityContext: elevated
settings:
DeveloperMode: true
Ensure: Present
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: vsPackage
directives:
description: Install Visual Studio 2022 Community (Any edition will work)
# Requires elevation for the set operation
securityContext: elevated
settings:
id: Microsoft.VisualStudio.2022.Community
source: winget
@@ -25,8 +21,6 @@ properties:
directives:
description: Install required VS workloads
allowPrerelease: true
# Requires elevation for the get and set operations
securityContext: elevated
settings:
productId: Microsoft.VisualStudio.Product.Community
channelId: VisualStudio.17.Release

View File

@@ -1,5 +1,6 @@
name: "🕷️ Bug report"
description: Report errors or unexpected behavior
type: Bug
labels:
- Issue-Bug
- Needs-Triage
@@ -7,27 +8,18 @@ body:
- type: markdown
attributes:
value: Please make sure to [search for existing issues](https://github.com/microsoft/PowerToys/issues) before filing a new one!
- type: markdown
attributes:
value: |
We are aware of the following high-volume issues and are actively working on them. Please check if your issue is one of these before filing a new bug report:
* **PowerToys Run crash related to "Desktop composition is disabled"**: This may appear as `COMException: 0x80263001`. For more details, see issue [#31226](https://github.com/microsoft/PowerToys/issues/31226).
* **PowerToys Run crash with `COMException (0xD0000701)`**: For more details, see issue [#30769](https://github.com/microsoft/PowerToys/issues/30769).
* **PowerToys Run crash with a "Cyclic reference" error**: This `System.InvalidOperationException` is detailed in issue [#36451](https://github.com/microsoft/PowerToys/issues/36451).
- id: version
type: input
- type: input
attributes:
label: Microsoft PowerToys version
placeholder: X.XX.X
description: Hover over the system tray icon or look at Settings
placeholder: 0.70.0
description: Hover over system tray icon or look at Settings
validations:
required: true
- id: installed
type: dropdown
- type: dropdown
attributes:
label: Installation method
description: How / where was PowerToys installed from?
description: How / Where was PowerToys installed from?
multiple: true
options:
- GitHub
@@ -41,6 +33,14 @@ body:
validations:
required: true
- type: dropdown
attributes:
label: Running as admin
description: Are you running PowerToys as Admin?
options:
- "Yes"
- "No"
- type: dropdown
attributes:
label: Area(s) with issue?
@@ -53,7 +53,6 @@ body:
- Awake
- ColorPicker
- Command not found
- Command Palette
- Crop and Lock
- Environment Variables
- FancyZones
@@ -65,10 +64,9 @@ body:
- Image Resizer
- Installer
- Keyboard Manager
- Light Switch
- Mouse Utilities
- Mouse Without Borders
- New+
- New+
- Peek
- PowerRename
- PowerToys Run
@@ -107,19 +105,6 @@ body:
validations:
required: false
- id: additionalInfo
type: textarea
attributes:
label: Additional Information
placeholder: |
OS version
.Net version
System Language
User or System Installation
Running as admin
validations:
required: false
- type: textarea
attributes:
label: Other Software
@@ -130,4 +115,3 @@ body:
My Cool Application v0.3 (include a code snippet if it would help!)
validations:
required: false

View File

@@ -6,7 +6,7 @@ labels:
body:
- type: textarea
attributes:
label: Describe the requested doc changes
label: Provide a description of requested docs changes
placeholder: Briefly describe which document needs to be corrected and why.
validations:
required: true

View File

@@ -13,7 +13,7 @@ body:
- type: textarea
attributes:
label: Scenario when this would be used?
placeholder: What is the scenario this would be used in? Why is this important to your workflow as a power user?
placeholder: What is the scenario this would be used? Why is this important to your workflow as a power user?
validations:
required: true
- type: textarea

View File

@@ -14,7 +14,7 @@ body:
attributes:
label: Microsoft PowerToys version
placeholder: 0.70.0
description: Hover over the system tray icon or look at Settings
description: Hover over system tray icon or look at Settings
validations:
required: true
- type: dropdown
@@ -38,7 +38,6 @@ body:
- Image Resizer
- Installer
- Keyboard Manager
- Light Switch
- Mouse Utilities
- Mouse Without Borders
- New+
@@ -66,7 +65,7 @@ body:
- type: textarea
attributes:
label: ❌ Actual phrase(s)
placeholder: What is there? Please include a screenshot, as that is extremely helpful.
placeholder: What is there? Please include a screenshot as that is extremely helpful.
validations:
required: true
- type: textarea

View File

@@ -29,14 +29,11 @@ RUS
AYUV
bak
Bcl
bgcode
Deflatealgorithm
exa
exabyte
Gbits
Gbps
gcode
Heatshrink
Mbits
MBs
mkv
@@ -56,8 +53,6 @@ YVU
YVYU
zipfolder
CODEOWNERS
VNext
vnext
# FONTS
@@ -94,33 +89,19 @@ onefuzzingestionpreparationtool
OTP
Yubi
Yubico
Perplexity
Groq
svgl
# KEYS
altdown
BUTTONUP
bafunctions
Baf
Bitness
BUILDARCHSHORT
CTRLALTDEL
Ctrls
CSilent
CBal
CREATEBAFUNCTIONS
CPrereq
dirutil
DUtil
Editbox
EXSEL
HOLDENTER
HOLDESC
HOLDSPACE
HOLDBACKSPACE
IDIGNORE
KBDLLHOOKSTRUCT
keyevent
LAlt
@@ -132,16 +113,12 @@ LCONTROL
LCtrl
LEFTDOWN
LEFTUP
locutil
logutil
msimg
MBUTTON
MBUTTONDBLCLK
MBUTTONDOWN
MBUTTONUP
MIDDLEDOWN
MIDDLEUP
memutil
NCRBUTTONDBLCLK
NCRBUTTONDOWN
NCRBUTTONUP
@@ -154,18 +131,8 @@ RCONTROL
RCtrl
RIGHTDOWN
RIGHTUP
Richedit
rgwz
resrutil
srd
scz
shelutil
thmutil
uriutil
VKTAB
wcautil
winkey
wininet
WMKEYDOWN
WMKEYUP
WMSYSKEYDOWN
@@ -175,7 +142,6 @@ XBUTTONDBLCLK
XBUTTONDOWN
XBUTTONUP
XDOWN
xmlutil
# Prefix
pcs
@@ -305,40 +271,6 @@ mengyuanchen
# DllName
testhost
Testably
#Tools
OIP
xef
xes
PACKAGEVERSIONNUMBER
APPXMANIFESTVERSION
# MRU lists
CACHEWRITE
MRUCMPPROC
MRUINFO
REGSTR
# Misc Win32 APIs and PInvokes
INVOKEIDLIST
# PowerRename metadata pattern abbreviations (used in tests and regex patterns)
DDDD
FFF
HHH
riday
YYY
# Unicode
precomposed
# GitHub issue/PR commands
azp
feedbackhub
needinfo
reportbug
#ffmpeg
crf
nostdin

View File

@@ -46,8 +46,8 @@ betsegaw
bricelam
bsky
CCcat
chemwolf
chenmy
chemwolf
Chinh
chrdavis
Chrzan
@@ -55,7 +55,6 @@ clayton
Coplen
craigloewen
crutkas
Chubercik
damienleroy
daverayment
davidegiacometti
@@ -66,8 +65,8 @@ Deondre
DHowett
ductdo
Essey
ethanfangg
Feng
ethanfangg
ferraridavide
foxmsft
frankychen
@@ -78,7 +77,6 @@ Galaxi
Garside
Gershaft
Giordani
Gleb
Gokce
gordon
Griese
@@ -92,15 +90,12 @@ Hemmerlein
hlaueriksson
Horvalds
Howett
hotkidfamily
htcfreek
Huynh
Ionut
jamrobot
Jaswal
Jaylyn
jefflord
Jeremic
Jordi
jyuwono
kai
@@ -110,13 +105,11 @@ Kantarci
Karthick
kaylacinnamon
kevinguo
Khmyznikov
Krigun
Lambson
Laute
laviusmotileng
Leilei
Loewen
Luecking
Mahalingam
Markovic
@@ -133,8 +126,6 @@ Naro
nathancartlidge
Nemeth
nielslaute
Noraa
noraajunker
oldnewthing
onegreatworld
palenshus
@@ -154,18 +145,15 @@ ricardosantos
riri
ritchielawrence
robmikh
ruslanlap
Russinovich
Rutkas
ryanbodrug
saahmedm
sachaple
Sameerjs
Santossio
Schoen
Sekan
Seraphima
Shmuelie
skttl
somil
Soref
@@ -176,11 +164,9 @@ Tadele
talynone
Taras
TBM
Teutsch
tilovell
Triet
urnotdfs
vednig
waaverecords
wang
Whuihuan
@@ -199,6 +185,7 @@ zhaopy
zhaoqpcn
Zoltan
Zykova
Sameerjs
# OTHERS
@@ -208,7 +195,6 @@ capturevideosample
cmdow
Controlz
cortana
devhints
dlnilsson
fancymouse
firefox
@@ -226,9 +212,7 @@ openai
Quickime
regedit
roslyn
Skia
Spotify
tldr
Vanara
wangyi
WEX

View File

@@ -1,63 +0,0 @@
acq
APPLYTOSUBMENUS
AUDCLNT
bitmaps
BUFFERFLAGS
centiseconds
Ctl
CTLCOLOR
CTLCOLORBTN
CTLCOLORDLG
CTLCOLOREDIT
CTLCOLORLISTBOX
CTrim
DFCS
dlg
dlu
DONTCARE
DRAWITEM
DRAWITEMSTRUCT
DWLP
EDITCONTROL
ENABLEHOOK
FDE
GETCHANNELRECT
GETCHECK
GETTHUMBRECT
GIFs
HTBOTTOMRIGHT
HTHEME
KSDATAFORMAT
LEFTNOWORDWRAP
letterbox
lld
logfont
lround
MENUINFO
mic
MMRESULT
OWNERDRAW
PBGRA
pfdc
playhead
pwfx
quantums
REFKNOWNFOLDERID
reposted
SCROLLSIZEGRIP
SETDEFID
SETRECT
SHAREMODE
SHAREVIOLATION
STREAMFLAGS
submix
tci
TEXTMETRIC
tme
TRACKMOUSEEVENT
Unadvise
WASAPI
WAVEFORMATEX
WAVEFORMATEXTENSIBLE
wil
WMU

View File

@@ -1,9 +1,6 @@
# D2D
#D?2D
# Repeated letters
\b([a-z])\g{-1}{2,}\b
# marker to ignore all code on line
^.*/\* #no-spell-check-line \*/.*$
# marker to ignore all code on line
@@ -13,9 +10,6 @@
# cspell inline
^.*\b[Cc][Ss][Pp][Ee][Ll]{2}:\s*[Dd][Ii][Ss][Aa][Bb][Ll][Ee]-[Ll][Ii][Nn][Ee]\b
# copyright
Copyright (?:\([Cc]\)|)(?:[-\d, ]|and)+(?: [A-Z][a-z]+ [A-Z][a-z]+,?)+
# patch hunk comments
^@@ -\d+(?:,\d+|) \+\d+(?:,\d+|) @@ .*
# git index header
@@ -24,9 +18,6 @@ index (?:[0-9a-z]{7,40},|)[0-9a-z]{7,40}\.\.[0-9a-z]{7,40}
# file permissions
['"`\s][-bcdLlpsw](?:[-r][-w][-Ssx]){2}[-r][-w][-SsTtx]\+?['"`\s]
# css fonts
\bfont(?:-family|):[^;}]+
# css url wrappings
\burl\([^)]+\)
@@ -38,7 +29,7 @@ index (?:[0-9a-z]{7,40},|)[0-9a-z]{7,40}\.\.[0-9a-z]{7,40}
# data url in quotes
([`'"])data:(?:[^ `'"].*?|)(?:[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,}).*\g{-1}
# data url
\bdata:[-a-zA-Z=;:/0-9+_]*,\S*
\bdata:[-a-zA-Z=;:/0-9+]*,\S*
# https/http/file urls
#(?:\b(?:https?|ftp|file)://)[-A-Za-z0-9+&@#/*%?=~_|!:,.;]+[-A-Za-z0-9+&@#/*%=~_|]
@@ -77,8 +68,6 @@ magnet:[?=:\w]+
# Amazon
\bamazon\.com/[-\w]+/(?:dp/[0-9A-Z]+|)
# AWS ARN
arn:aws:[-/:\w]+
# AWS S3
\b\w*\.s3[^.]*\.amazonaws\.com/[-\w/&#%_?:=]*
# AWS execute-api
@@ -105,8 +94,6 @@ vpc-\w+
\bgoogle-analytics\.com/collect.[-0-9a-zA-Z?%=&_.~]*
# Google APIs
\bgoogleapis\.(?:com|dev)/[a-z]+/(?:v\d+/|)[a-z]+/[-@:./?=\w+|&]+
# Google Artifact Registry
\.pkg\.dev(?:/[-\w]+)+(?::[-\w]+|)
# Google Storage
\b[-a-zA-Z0-9.]*\bstorage\d*\.googleapis\.com(?:/\S*|)
# Google Calendar
@@ -142,8 +129,6 @@ themes\.googleusercontent\.com/static/fonts/[^/\s"]+/v\d+/[^.]+.
\bscholar\.google\.com/citations\?user=[A-Za-z0-9_]+
# Google Colab Research Drive
\bcolab\.research\.google\.com/drive/[-0-9a-zA-Z_?=]*
# Google Cloud regions
(?:us|(?:north|south)america|europe|asia|australia|me|africa)-(?:north|south|east|west|central){1,2}\d+
# GitHub SHAs (api)
\bapi.github\.com/repos(?:/[^/\s"]+){3}/[0-9a-f]+\b
@@ -182,12 +167,6 @@ GHSA(?:-[0-9a-z]{4}){3}
# GitLab commits
\bgitlab\.[^/\s"]*/(?:[^/\s"]+/){2}commits?/[0-9a-f]+\b
# #includes
^\s*#include\s*(?:<.*?>|".*?")
# #pragma lib
^\s*#pragma comment\(lib, ".*?"\)
# binance
accounts\.binance\.com/[a-z/]*oauth/authorize\?[-0-9a-zA-Z&%]*
@@ -240,7 +219,7 @@ accounts\.binance\.com/[a-z/]*oauth/authorize\?[-0-9a-zA-Z&%]*
\bmedium\.com/@?[^/\s"]+/[-\w]+
# microsoft
\b(?:https?://|)(?:(?:(?:blogs|download\.visualstudio|docs|msdn2?|research)\.|)microsoft|blogs\.msdn)\.co(?:m|\.\w\w)/[-_a-zA-Z0-9()=./%]*
\b(?:https?://|)(?:(?:download\.visualstudio|docs|msdn2?|research)\.microsoft|blogs\.msdn)\.com/[-_a-zA-Z0-9()=./%]*
# powerbi
\bapp\.powerbi\.com/reportEmbed/[^"' ]*
# vs devops
@@ -414,7 +393,7 @@ ipfs://[0-9a-zA-Z]{3,}
\bgetopts\s+(?:"[^"]+"|'[^']+')
# ANSI color codes
(?:\\(?:u00|x)1[Bb]|\\03[1-7]|\x1b|\\u\{1[Bb]\})\[\d+(?:;\d+)*m
(?:\\(?:u00|x)1[Bb]|\x1b|\\u\{1[Bb]\})\[\d+(?:;\d+|)m
# URL escaped characters
%[0-9A-F][A-F](?=[A-Za-z])
@@ -450,14 +429,10 @@ sha\d+:[0-9a-f]*?[a-f]{3,}[0-9a-f]*
# pki (base64)
LS0tLS1CRUdJT.*
# C# includes
^\s*using [^;]+;
# uuid:
\b[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\b
# hex digits including css/html color classes:
(?:[\\0][xX]|\\u\{?|[uU]\+|#x?|%23|&H)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b
(?:[\\0][xX]|\\u|[uU]\+|#x?|%23)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b
# integrity
integrity=(['"])(?:\s*sha\d+-[-a-zA-Z=;:/0-9+]{40,})+\g{-1}
@@ -475,10 +450,7 @@ integrity=(['"])(?:\s*sha\d+-[-a-zA-Z=;:/0-9+]{40,})+\g{-1}
Name\[[^\]]+\]=.*
# IServiceProvider / isAThing
(?:(?:\b|_|(?<=[a-z]))I|(?:\b|_)(?:nsI|isA))(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b))
# python
#\b(?i)py(?!gments|gmy|lon|ramid|ro|th)(?=[a-z]{2,})
(?:\b|_)(?:(?:ns|)I|isA)(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b))
# crypt
(['"])\$2[ayb]\$.{56}\g{-1}
@@ -492,14 +464,17 @@ Name\[[^\]]+\]=.*
# machine learning (?)
#\b(?i)ml(?=[a-z]{2,})
# python
#\b(?i)py(?!gments|gmy|lon|ramid|ro|th)(?=[a-z]{2,})
# scrypt / argon
\$(?:scrypt|argon\d+[di]*)\$\S+
# go.sum
\bh1:\S+
# imports
^import\s+(?:(?:static|type)\s+|)(?:[\w.]|\{\s*\w*?(?:,\s*(?:\w*|\*))+\s*\})+
# scala imports
^import (?:[\w.]|\{\w*?(?:,\s*(?:\w*|\*))+\})+
# scala modules
#("[^"]+"\s*%%?\s*){2,3}"[^"]+"
@@ -508,13 +483,13 @@ Name\[[^\]]+\]=.*
image: [-\w./:@]+
# Docker images
^\s*(?i)FROM\s+\S+:\S+(?:\s+AS\s+\S+|)
^\s*FROM\s+\S+:\S+(?:\s+AS\s+\S+|)
# `docker images` REPOSITORY TAG IMAGE ID CREATED SIZE
\s*\S+/\S+\s+\S+\s+[0-9a-f]{8,}\s+\d+\s+(?:hour|day|week)s ago\s+[\d.]+[KMGT]B
# Intel intrinsics
_mm\d*_(?!dd)\w+
_mm_(?!dd)\w+
# Input to GitHub JSON
content: (['"])[-a-zA-Z=;:/0-9+]*=\g{-1}
@@ -548,7 +523,7 @@ content: (['"])[-a-zA-Z=;:/0-9+]*=\g{-1}
# javascript replace regex
\.replace\(/[^/\s"]{3,}/[gim]*\s*,
# assign regex
= /[^*].*?(?:[a-z]{3,}|[A-Z]{3,}|[A-Z][a-z]{2,}).*/[gim]*(?=\W|$)
= /[^*].*?(?:[a-z]{3,}|[A-Z]{3,}|[A-Z][a-z]{2,}).*/[gi]?(?=\W|$)
# perl regex test
[!=]~ (?:/.*/|m\{.*?\}|m<.*?>|m([|!/@#,;']).*?\g{-1})
@@ -562,10 +537,10 @@ perl(?:\s+-[a-zA-Z]\w*)+
#(?:\d|\bh)to(?!ken)(?=[a-z])|to(?=[adhiklpun]\()
# Go regular expressions
regexp?\.MustCompile\((?:`[^`]*`|".*"|'.*')\)
regexp?\.MustCompile\(`[^`]*`\)
# regex choice
# \(\?:[^)]+\|[^)]+\)
\(\?:[^)]+\|[^)]+\)
# proto
^\s*(\w+)\s\g{-1} =
@@ -610,7 +585,7 @@ urn:shemas-jetbrains-com
# xcode
# xcodeproject scenes
(?:Controller|destination|(?:first|second)Item|ID|id)="\w{3}-\w{2}-\w{3}"
(?:Controller|destination|ID|id)="\w{3}-\w{2}-\w{3}"
# xcode api botches
customObjectInstantitationMethod
@@ -625,33 +600,27 @@ PrependWithABINamepsace
\.fa-[-a-z0-9]+
# bearer auth
(['"])[Bb]ear[e][r] .{3,}?\g{-1}
(['"])[Bb]ear[e][r] .*?\g{-1}
# bearer auth
\b[Bb]ear[e][r]:? [-a-zA-Z=;:/0-9+.]{3,}
\b[Bb]ear[e][r]:? [-a-zA-Z=;:/0-9+.]+
# basic auth
(['"])[Bb]asic [-a-zA-Z=;:/0-9+]{3,}\g{-1}
# basic auth
: [Bb]asic [-a-zA-Z=;:/0-9+.]{3,}
# base64 encoded content
#([`'"])[-a-zA-Z=;:/0-9+]{3,}=\g{-1}
# base64 encoded content in xml/sgml
>[-a-zA-Z=;:/0-9+]{3,}=</
# base64 encoded content, possibly wrapped in mime
#(?:^|[\s=;:?])[-a-zA-Z=;:/0-9+]{50,}(?:[\s=;:?]|$)
(?:^|[\s=;:?])[-a-zA-Z=;:/0-9+]{50,}(?:[\s=;:?]|$)
# base64 encoded json
\beyJ[-a-zA-Z=;:/0-9+]+
# base64 encoded pkcs
#\bMII[-a-zA-Z=;:/0-9+]+
# uuencoded
#[!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_]{40,}
\bMII[-a-zA-Z=;:/0-9+]+
# DNS rr data
#(?:\d+\s+){3}(?:[-+/=.\w]{2,}\s*){1,2}
(?:\d+\s+){3}(?:[-+/=.\w]{2,}\s*){1,2}
# encoded-word
=\?[-a-zA-Z0-9"*%]+\?[BQ]\?[^?]{0,75}\?=
@@ -660,7 +629,7 @@ PrependWithABINamepsace
\bnumer\b(?=.*denom)
# Time Zones
\b(?:Africa|Atlantic|America|Antarctica|Arctic|Asia|Australia|Europe|Indian|Pacific)(?:/[-\w]+)+
\b(?:Africa|Atlantic|America|Antarctica|Asia|Australia|Europe|Indian|Pacific)(?:/\w+)+
# linux kernel info
^(?:bugs|flags|Features)\s+:.*
@@ -700,13 +669,13 @@ systemd.*?running in system mode \([-+].*\)$
TeX/AMS
# File extensions
#\*\.[+\w]+,
\*\.[+\w]+,
# eslint
"varsIgnorePattern": ".+"
# nolint
nolint:\s*[\w,]+
nolint:\w+
# Windows short paths
[/\\][^/\\]{5,6}~\d{1,2}(?=[/\\])
@@ -714,9 +683,6 @@ nolint:\s*[\w,]+
# Windows Resources with accelerators
\b[A-Z]&[a-z]+\b(?!;)
# signed off by
(?i)Signed-off-by: .*
# cygwin paths
/cygdrive/[a-zA-Z]/(?:Program Files(?: \(.*?\)| ?)(?:/[-+.~\\/()\w ]+)*|[-+.~\\/()\w])+
@@ -749,31 +715,29 @@ W/"[^"]+"
# Compiler flags (Unix, Java/Scala)
# Use if you have things like `-Pdocker` and want to treat them as `docker`
#(?:^|[\t ,>"'`=(#])-(?:(?:J-|)[DPWXY]|[Llf])(?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})
#(?:^|[\t ,>"'`=(])-(?:(?:J-|)[DPWXY]|[Llf])(?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})
# Compiler flags (Windows / PowerShell)
# This is a subset of the more general compiler flags pattern.
# It avoids matching `-Path` to prevent it from being treated as `ath`
#(?:^|[\t ,"'`=(#])-(?:[DPL](?=[A-Z]{2,})|[WXYlf](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,}))
#(?:^|[\t ,"'`=(])-(?:[DPL](?=[A-Z]{2,})|[WXYlf](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,}))
# Compiler flags (linker)
,-B
# Library prefix
# e.g., `lib`+`archive`, `lib`+`raw`, `lib`+`unwind`
# (ignores some words that happen to start with `lib`)
(?:\b|_)[Ll]ib(?:re(?=office)|)(?!era[lt]|ero|erty|rar(?:i(?:an|es)|y))(?=[a-z])
# iSCSI iqn (approximate regex)
\biqn\.[0-9]{4}-[0-9]{2}(?:[\.-][a-z][a-z0-9]*)*\b
# libraries
(?:\b|_)lib(?:re(?=office)|)(?!era[lt]|ero|erty|rar(?:i(?:an|es)|y))(?=[a-z])
# WWNN/WWPN (NAA identifiers)
\b(?:0x)?10[0-9a-f]{14}\b|\b(?:0x|3)?[25][0-9a-f]{15}\b|\b(?:0x|3)?6[0-9a-f]{31}\b
# iSCSI iqn (approximate regex)
\biqn\.[0-9]{4}-[0-9]{2}(?:[\.-][a-z][a-z0-9]*)*\b
# curl arguments
\b(?:\\n|)curl(?:\.exe|)(?:\s+-[a-zA-Z]{1,2}\b)*(?:\s+-[a-zA-Z]{3,})(?:\s+-[a-zA-Z]+)*
# set arguments
\b(?:bash|sh|set)(?:\s+[-+][abefimouxE]{1,2})*\s+[-+][abefimouxE]{3,}(?:\s+[-+][abefimouxE]+)*
\b(?:bash|sh|set)(?:\s+-[abefimouxE]{1,2})*\s+-[abefimouxE]{3,}(?:\s+-[abefimouxE]+)*
# tar arguments
\b(?:\\n|)g?tar(?:\.exe|)(?:(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+
# tput arguments -- https://man7.org/linux/man-pages/man5/terminfo.5.html -- technically they can be more than 5 chars long...

View File

@@ -18,7 +18,6 @@
/TestFiles/
[^/]\.cur$
[^/]\.gcode$
[^/]\.bgcode$
[^/]\.rgs$
\.a$
\.ai$
@@ -74,9 +73,7 @@
\.qm$
\.s$
\.sig$
\.snk$
\.so$
\.stl$
\.svgz?$
\.sys$
\.tar$
@@ -93,52 +90,37 @@
\.xz$
\.zip$
^\.github/actions/spell-check/
^\.github/workflows/spelling\d*\.yml$
^\.gitmodules$
^\Q.github/workflows/spelling2.yml\E$
^\Q.pipelines/ESRPSigning_core.json\E$
^\Qdoc/devdocs/localization.md\E$
^\Qsrc/common/ManagedCommon/ColorFormatHelper.cs\E$
^\Qsrc/common/notifications/BackgroundActivatorDLL/cpp.hint\E$
^\Qsrc/modules/cmdpal/doc/initial-sdk-spec/list-elements-mock-002.pdn\E$
^\Qsrc/modules/colorPicker/ColorPickerUI/Assets/ColorPicker/colorPicker.cur\E$
^\Qsrc/modules/colorPicker/ColorPickerUI/Shaders/GridShader.cso\E$
^\Qsrc/modules/MouseUtils/MouseJump.Common/NativeMethods/User32/UI/WindowsAndMessaging/User32.SYSTEM_METRICS_INDEX.cs\E$
^\Qsrc/modules/MouseUtils/MouseJumpUI/MainForm.resx\E$
^\Qsrc/modules/MouseWithoutBorders/App/Form/frmAbout.cs\E$
^\Qsrc/modules/MouseWithoutBorders/App/Form/frmInputCallback.resx\E$
^\Qsrc/modules/MouseWithoutBorders/App/Form/frmLogon.resx\E$
^\Qsrc/modules/MouseWithoutBorders/App/Form/frmMatrix.resx\E$
^\Qsrc/modules/MouseWithoutBorders/App/Form/frmMessage.resx\E$
^\Qsrc/modules/MouseWithoutBorders/App/Form/frmMouseCursor.resx\E$
^\Qsrc/modules/MouseWithoutBorders/App/Form/frmScreen.resx\E$
^\Qsrc/modules/MouseWithoutBorders/ModuleInterface/generateSecurityDescriptor.h\E$
^\Qsrc/modules/peek/Peek.Common/NativeMethods.txt\E$
^\Qsrc/modules/previewpane/SvgPreviewHandler/SvgHTMLPreviewGenerator.cs\E$
^\Qsrc/modules/previewpane/UnitTests-StlThumbnailProvider/HelperFiles/sample.stl\E$
^\Qtools/project_template/ModuleTemplate/resource.h\E$
^doc/devdocs/akaLinks\.md$
^NOTICE\.md$
^src/common/CalculatorEngineCommon/exprtk\.hpp$
^src/common/UnitTests-CommonUtils/
^src/common/ManagedCommon/ColorFormatHelper\.cs$
^src/common/notifications/BackgroundActivatorDLL/cpp\.hint$
^src/common/sysinternals/Eula/
^src/modules/cmdpal/Tests/Microsoft\.CommandPalette\.Extensions\.Toolkit\.UnitTests/FuzzyMatcherComparisonTests.cs$
^src/modules/cmdpal/Tests/Microsoft\.CommandPalette\.Extensions\.Toolkit\.UnitTests/FuzzyMatcherDiacriticsTests.cs$
^src/modules/cmdpal/doc/initial-sdk-spec/list-elements-mock-002\.pdn$
^src/modules/cmdpal/ext/SamplePagesExtension/Pages/SampleMarkdownImagesPage\.cs$
^src/modules/cmdpal/Microsoft\.CmdPal\.UI/Settings/InternalPage\.SampleData\.cs$
^src/modules/cmdpal/Tests/Microsoft\.CmdPal\.Core\.Common\.UnitTests/.*\.TestData\.cs$
^src/modules/colorPicker/ColorPickerUI/Shaders/GridShader\.cso$
^src/modules/launcher/Plugins/Microsoft\.PowerToys\.Run\.Plugin\.TimeDate/Properties/
^src/modules/MouseUtils/MouseJumpUI/MainForm\.resx$
^src/modules/MouseWithoutBorders/App/.*/NativeMethods\.cs$
^src/modules/MouseWithoutBorders/App/Form/.*\.Designer\.cs$
^src/modules/MouseWithoutBorders/App/Form/.*\.resx$
^src/modules/MouseWithoutBorders/App/Form/frmAbout\.cs$
^src/modules/MouseWithoutBorders/App/Form/frmInputCallback\.resx$
^src/modules/MouseWithoutBorders/App/Form/frmLogon\.resx$
^src/modules/MouseWithoutBorders/App/Form/frmMatrix\.resx$
^src/modules/MouseWithoutBorders/App/Form/frmMessage\.resx$
^src/modules/MouseWithoutBorders/App/Form/frmMouseCursor\.resx$
^src/modules/MouseWithoutBorders/App/Form/frmScreen\.resx$
^src/modules/MouseWithoutBorders/App/Helper/.*\.resx$
^src/modules/MouseWithoutBorders/ModuleInterface/generateSecurityDescriptor\.h$
^src/modules/peek/Peek.Common/NativeMethods\.txt$
^src/modules/peek/Peek.UITests/TestAssets/4\.qoi$
^src/modules/powerrename/PowerRenameUITest/testItems/folder1/testCase2\.txt$
^src/modules/powerrename/PowerRenameUITest/testItems/folder2/SpecialCase\.txt$
^src/modules/powerrename/PowerRenameUITest/testItems/testCase1\.txt$
^src/modules/previewpane/SvgPreviewHandler/SvgHTMLPreviewGenerator\.cs$
^src/modules/previewpane/UnitTests-MarkdownPreviewHandler/HelperFiles/MarkdownWithHTMLImageTag\.txt$
^src/modules/registrypreview/RegistryPreviewUILib/Controls/HexBox/.*$
^src/modules/ZoomIt/ZoomIt/ZoomIt\.idc$
^src/Monaco/
^tools/project_template/ModuleTemplate/resource\.h$
^src/common/sysinternals/Eula/
^tools/Verification scripts/Check preview handler registration\.ps1$
ignore$
^src/modules/registrypreview/RegistryPreviewUILib/Controls/HexBox/.*$
^src/common/CalculatorEngineCommon/exprtk\.hpp$
src/modules/cmdpal/ext/SamplePagesExtension/Pages/SampleMarkdownImagesPage.cs

File diff suppressed because it is too large Load Diff

View File

@@ -8,31 +8,6 @@
# you might not want to check in code where you skip all the other tests.
#\bfit\(
# English does not use a hyphen between adverbs and nouns
# https://twitter.com/nyttypos/status/1894815686192685239
(?:^|\s)[A-Z]?[a-z]+ly-(?=[a-z]{3,})(?:[.,?!]?\s|$)
# Smart quotes should match
\s[^.?!]+[^.?!]+[^.?!]+|\s[^.?!]+[^.?!]+[^.?!]+|\s”[^.?!“”]+”[^.?!“”]+“[^.?!“”]+”|\s“[^.?!“”]+”[^.?!“”]+”[^.?!“”]+”
# Don't use `requires that` + `to be`
# https://twitter.com/nyttypos/status/1894816551435641027
\brequires that \w+\b[^.]+to be\b
# A fully parenthetical sentences period goes inside the parentheses, not outside.
# https://twitter.com/nyttypos/status/1898844061873639490
\([A-Z][a-z]{2,}(?: [a-z]+){3,}\)\.\s
# Complete sentences shouldn't be in the middle of another sentence as a parenthetical.
(?<!\.)(?<!\betc)\.\),
# Complete sentences in parentheticals should not have a space before the period.
\s\.\)(?!.*\}\})
# This probably indicates Mojibake https://en.wikipedia.org/wiki/Mojibake
# You probably should try to unbake this content
Ã(?:Â[¤¶¥]|[£¢])|Ã
# Should be `HH:MM:SS`
\bHH:SS:MM\b
@@ -49,74 +24,18 @@
# Should be `a priori` or `and prior`
(?i)(?<!posteriori)\sand priori\s
# Should be `a`
\san (?=(?:[b-df-gj-npqtv-xz]|h(?!our|tml|ttp)|r(?!c\b)|s(?!sh|vg))[a-z])
# Articles generally shouldn't be used without a noun and a verb
# - Perhaps you're missing a verb between the noun and the second article.
# - Or, perhaps you should remove the first verb and treat the intervening word as a verb?
# - In some cases you should add a `,` between the noun and the second article.
\s(?:an?|the(?! action))\s(?!way|wh|how\b)[A-Za-z][a-z]+[a-qs-z]\s(?:a(?! bit)n?|the)\s
# Should only be one of `a`, `an`, or `the`
\b(?:(?:an?|the)\s+){2,}\b
# Should be a list `something, a second thing, or a third thing` or `something, a thing to do a thing`
# -- This rule is experimental, if you find it has a high false-positive rate, please let the maintainer know
#(?:^|[?!.] )[^()?!;,.]+, a(?:\s+(?!to\b)\w+)+?\s+an?\b
# Should only be `are` or `can`, not both
\b(?:(?:are|can)\s+){2,}\b
# Should probably be `ABCDEFGHIJKLMNOPQRSTUVWXYZ`
(?i)(?!ABCDEFGHIJKLMNOPQRSTUVWXYZ)ABC[A-Z]{21}YZ
# Should be `an`
#(?<!\b[Ii] |\.)\bam\b
# Should be `anymore`
\bany more[,.]
# Should be `Ask`
(?:^|[.?]\s+)As\s+[A-Z][a-z]{2,}\s[^.?]*?(?:how|if|wh\w+)\b
# Should be `at one fell swoop`
# and only when talking about killing, not some other completion
# Act 4 Scene 3, Macbeth
# https://www.opensourceshakespeare.org/views/plays/play_view.php?WorkID=macbeth&Act=4&Scene=3&Scope=scene
\bin one fell s[lw]?oop\b
# Should be `'`
(?i)\b(?:(?:i|s?he|they|what|who|you)[`"]ll|(?:are|ca|did|do|does|ha[ds]|have|is|should|were|wo|would)n[`"]t|(?:s?he|let|that|there|what|where|who)[`"]s|(?:i|they|we|what|who|you)[`"]ve)\b
# Should be `background` / `intro text` / `introduction` / `prologue` unless it's a brand or relates to _subterfuge_
(?i)\bpretext\b
# Should be `bearer`
\b(?<=the )burden(?= of bad news\b)
# Should be `bona`
# unless talking about bones
\bbone(?= fide\b)
# Should be `branches`
# ... unless it's really about the meal that replaces breakfast and lunch.
\b[Bb]runches\b
(?i)\b(?:(?:i|s?he|they|what|who|you)"ll|(?:are|ca|did|do|does|ha[ds]|have|is|should|were|wo|would)n"t|(?:s?he|let|that|there|what|where|who)"s|(?:i|they|we|what|who|you)"ve)\b
# Should be `briefcase`
\bbrief-case\b
# Should be `by far` or `far and away`
\bby far and away\b
# Should be `by and large`
\bby in large\b
# Should be `bytes`
# unless talking about sports where a team gets to skip a game, or
# saying `goodbyes` (even this is questionable)
(?<!\\)\bbyes\b
# Should be `can, not only ..., ... also...`
\bcan not only.*can also\b
@@ -127,10 +46,7 @@
# > In formal writing and where contractions are frowned upon, use `cannot`.
# > It is possible to write `can not`, but you generally find it only as part of some other construction, such as `not only . . . but also.`
# - if you encounter such a case, add a pattern for that case to patterns.txt.
\b[Cc]an not\b(?! only\b)
# Should be `chart`
(?i)\bhelm\b.*\bchard\b
\b[Cc]an not\b
# Do not use `(click) here` links
# For more information, see:
@@ -140,49 +56,19 @@
# * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
(?i)(?:>|\[)(?:(?:click |)here|this(?=\]\([^\)]+:/)|link|(?:read |)more(?!</value))(?:</|\]\()
# Including "image of" or "picture of" in alt text is unnecessary.
\balt=['"](?:an? |)(?:image|picture) of
# Alt text should be short
\balt=(?:'[^']{126,}'|"[^"]{126,}")
# Should be `effect`
(?<=\btake )affect\b
# Should be `-endian`
\b(?i)(?<=big|little) endian\b
# Should be `equals` to `is equal to`
\bequals to\b
# Should be `ECMA` 262 (JavaScript)
(?i)\bTS\/EMCA\b|\bEMCA(?: \d|\s*Script)|\bEMCA\b(?=.*\bTS\b)
# Should be `ECMA` 340 (Near Field Communications)
(?i)EMCA[- ]340
# Should be `fall back`
\bfallback(?= to)\b
# Should be `for`, `for, to` or `to`
\b(?:for to|to for)\b
# Should be `GitHub`
(?<![&*.]|// |\b(?:from|import|type) )\bGithub\b(?![{()])
# Should be `GitLab`
(?<![&*.]|// |\b(?:from|import|type) )\bGitlab\b(?![{()])
# Should be `heartrending` unless talking about drawing hearts
\b(?i)heart[- ]rendering\b(?![^.?!]*(?:hearts|quirk))
# Should probably be `https://`...
# Markdown generally doesn't assume that links are to urls
\]\(www\.\w
# Should be `intents and purposes`
(?<=[Ff]or all )intensive purposes\b
# Should be `JavaScript`
\bJavascript\b
@@ -198,14 +84,11 @@
# Should be `RabbitMQ`
\bRabbitmq\b
# Should be `TensorFlow`
\bTensorflow\b
# Should be `TypeScript`
\bTypescript\b
# Should be `another`
\ban[- ]other(?!-)\b
\ban[- ]other\b
# Should be `case-(in)sensitive`
\bcase (?:in|)sensitive\b
@@ -225,14 +108,11 @@
# Should be `here-in`, `the`, `them`, `this`, `these` or reworded in some other way
\bthe here(?:\.|,| (?!and|defined))
# Should be `going to bed` or `going to a bad`
\bgoing to bad(?!-)\b
# Should be `greater than`
#\bhigher than\b
\bhigher than\b
# Should be `ID` (unless it's a flag/property)
#(?<![-\.])\bId\b(?![(])
# Should be `ID`
#\bId\b
# Should be `in front of`
\bin from of\b
@@ -245,26 +125,14 @@
# Should be `use`
\sin used by\b
# Should be `in-depth` if used as an adjective (but `in depth` when used as an adverb)
\bin depth\s(?!rather\b)\w{6,}
# Should be `in-flight` or `on the fly` (unless actually talking about airline flights)
\bon[- ]flight\b(?!=\s+(?:(?:\w{2}|)\d+|availability|booking|computer|data|delay|departure|management|performance|radar|reservation|scheduling|software|status|ticket|time|type|.*(?:hotel|taxi)))
# Should be `is obsolete`
\bis obsolescent\b
# Should be `it's` or `its`
(?<![.'])\bits[']
\bits[']
# Should be `its`
\bit's(?= (?:child|only purpose|own(?:er|)|parent|sibling)\b)
# Should be `for its` (possessive) or `because it is`
\bfor it(?:'s| is)\b
# Should be `lends`
\bleads(?= credence)
\bit's(?= own\b)
# Should be `log in`
\blogin to the
@@ -272,34 +140,12 @@
# Should be `long-standing`
\blong standing\b
# Should be `lose`
(?<=\bwill )loose\b
# `apt-key` is deprecated
# ... instead you should be writing a pair of files:
# ... * the gpg key added to a distinct key ring file based on your project/distro/key...
# ... * the sources.list in a district file -- not simply appended to `/etc/apt/sources.list` -- (there is a newer format [DEB822](https://manpages.debian.org/bookworm/dpkg-dev/deb822.5.en.html)) that references the gpg key.
# Consider:
# ````sh
# curl http://download.something.example.com/$DISTRO/Release.key | \
# gpg --dearmor --yes --output /usr/share/keyrings/something-distro.gpg
# echo "deb [signed-by=/usr/share/keyrings/something-distro.gpg] http://download.something.example.com/repositories/home:/$DISTRO ./" \
# >> /etc/apt/sources.list.d/something-distro.list
# ````
\bapt-key add\b
# Should be `nearby`
\bnear by\b
# Should probably be a person named `Nick` or the abbreviation `NIC`
\bNic\b
# Should be `not supposed`
\bsupposed not\b
# Should be `Once this` or `On this` or even `One that`. Rarely `One, this`
[?!.] One this\b
# Should probably be `much more`
\bmore much\b
@@ -307,10 +153,7 @@
\bperform it's\b
# Should be `opt-in`
(?<!\scan|for)(?<!\smust)(?<!\sif)\sopt in\s
# Should be `out-of-date` if acting as an adjective before a noun
\bout of date(?= \w{3,}\b)
(?<!\scan|for)(?<!\sif)\sopt in\s
# Should be `less than`
\bless then\b
@@ -327,89 +170,24 @@
# Should be `on the other hand`
\b(?i)on another hand\b
# Reword to `on at runtime` or `enabled at launch`
# The former if you mean it can be changed dynamically.
# The latter if you mean that it can be changed without recompiling but not after the program starts.
\bswitched on runtime\b
# Should be `Of course,`
[?.!]\s+Of course\s(?=[-\w\s]+[.?;!,])
# Most people only have two hands. Reword.
\b(?i)on the third hand\b
# Should be `Open Graph`
# unless talking about a specific Open Graph implementation:
# - Java
# - Node
# - Py
# - Ruby
\bOpenGraph\b
# Should be `OpenShift`
\bOpenshift\b
# Should be `otherwise`
\bother[- ]wise\b
# Should be `; otherwise` or `. Otherwise`
# https://study.com/learn/lesson/otherwise-in-a-sentence.html
, [Oo]therwise\b
# Should probably be `Otherwise,`
(?<=\. )Otherwise\s
# Should be `or (more|less)`
\bore (?:more|less)\b
# Should be `or`
\b(?i)true of .*false\b
# Should be `pale`
\b(?<=beyond the )pail\b
# Should be reworded.
# `passthrough` is an adjective
# `pass-through` could be a noun
# `pass through` would be a verb phrase
\b(?i)passthrough(?= an?\b)
# Should be `rather than`
\brather then\b
# Should be `Red Hat`
\bRed[Hh]at\b
# Should be `regardless, ...` or `regardless of (whether)`
\b[Rr]egardless if you\b
# Should be `self-signed`
\bself signed\b
# Should be `SendGrid`
\bSendgrid\b
# Should be `set up` (`setup` is a noun / `set up` is a verb)
\b[Ss]etup(?= (?:an?|the)\b)
# Should be `state`
\bsate(?=\b|[A-Z])|(?<=[a-z])Sate(?=\b|[A-Z])|(?<=[A-Z]{2})Sate(?=\b|[A-Z])
# Should be `this`
\b[Tt]oday(?= morning\b)
# Should be `let's` or `let us`
\b[Ll]ets (?=throw\.)
# Should be `no longer needed`
\bno more needed\b(?! than\b)
# Should be `<see|look> below for the`
(?i)\bfind below the\b
# Should be `then any` unless there's a comparison before the `,`
, than any\b
# Should be `did not exist`
\bwere not existent\b
@@ -419,18 +197,9 @@
# Should be `nonexistent`
\b[Nn]o[nt][- ]existent\b
# Should be `our`
\bspending out time\b
# Should be `@brief` / `@details` / `@param` / `@return` / `@retval`
(?:^\s*|(?:\*|//|/*)\s+`)[\\@](?:breif|(?:detail|detials)|(?:params(?!\.)|prama?)|ret(?:uns?)|retvl)\b
# Should be `more than` or `more, then`
\bmore then\b
# Should be `Pipeline`/`pipeline`
(?:(?<=\b|[A-Z])p|P)ipeLine(?:\b|(?=[A-Z]))
# Should be `preexisting`
[Pp]re[- ]existing
@@ -446,9 +215,6 @@
# Should be `prerequisite`
[Pp]re[- ]requisite
# Should be `QuickTime`
\bQuicktime\b
# Should be `recently changed` or `recent changes`
[Rr]ecent changed
@@ -458,30 +224,14 @@
# Should be `reentrant`
[Rr]e[- ]entrant
# Should be `room for`
\brooms for (?!lease|rent|sale)
# Should be `socioeconomic`
# https://dictionary.cambridge.org/us/dictionary/english/socioeconomic
socio-economic
# Should be `strong suit`
\b(?:my|his|her|their) strong suite\b
# Should probably be `temperatures` unless actually talking about thermal drafts (things birds may fly on)
\bthermals\b
# Should be `there are` or `they are` (or `they're`)
(?i)\btheir are\b
# Should be `understand`
\bunder stand\b
# Should be `URI` or `uri` unless it refers to a person named `Uri` (or a flag)
#(?<![-\.])\bUri\b(?![(])
# Should be `true`
(?i)(?<![\[\]()])\brue(?:= or false)
# Should be `URI` or `uri` unless it refers to a person named `Uri`
#(?<!\.)\bUri\b(?![(])
# Should be `it uses is`
/\bis uses is\b/
@@ -495,43 +245,12 @@ socio-economic
# Should be `where`
\bwere they are\b
# Should be `why`
, way(?= is [^.]*\?)
# should be `vCenter`
\bV[Cc]enter\b
# Should be `VM`
\bVm\b
# Should be `walkthrough(s)`
\bwalk-throughs?\b
# Should be `want`
\bdon't ant\b
# Should be `we'll`
\bwe 'll\b
# Should be `week`
# unless you're really talking about people or pointers
\bevery weak[.,?!]
# Should be `well`
\b[Yy]ou(?:'re| are) doing good\b
# Should be `whereas`
\bwhere as\b
# Should be `WinGet`
\bWinget\b
# Should be `without` (unless `out` is a modifier of the next word)
\bwith out\b(?!-)
# Should be `work around`
\b[Ww]orkaround(?= an?\b)
# Should be `workarounds`
#\bwork[- ]arounds\b
@@ -548,15 +267,15 @@ socio-economic
\b(?:coarse|fine) grained\b
# Homoglyph (Cyrillic) should be `A`/`B`/`C`/`E`/`H`/`I`/`I`/`J`/`K`/`M`/`O`/`P`/`S`/`T`/`Y`
# It's possible that your content is intentionally mixing Cyrillic and Latin scripts, but if it isn't, you definitely want to correct this.
# It's possible that your content is intentionally mixing Cyrllic and Latin scripts, but if it isn't, you definitely want to correct this.
(?<=[A-Z]{2})[АВСЕНІӀЈКМОРЅТУ]|[АВСЕНІӀЈКМОРЅТУ](?=[A-Z]+(?:\b|[a-z]+)|[a-z]+(?:[^a-z]|$))
# Homoglyph (Cyrillic) should be `a`/`b`/`c`/`e`/`o`/`p`/`x`/`y`
# It's possible that your content is intentionally mixing Cyrillic and Latin scripts, but if it isn't, you definitely want to correct this.
[авсеорху](?=[A-Za-z]{2,})|(?<=[A-Za-z]{2})[авсеорху]|(?<=[A-Za-z])[авсеорху](?=[A-Za-z])
# Homoglyph (Cyrillic) should be `a`/`b`/`e`
# It's possible that your content is intentionally mixing Cyrllic and Latin scripts, but if it isn't, you definitely want to correct this.
[аве](?=[A-Za-z]{2,})|(?<=[A-Za-z]{2})[аве]|(?<=[A-Za-z])[аве](?=[A-Za-z])
# Should be `neither/nor` -- or reword
#(?<!do )\bnot\b([^.?!"/(](?!neither|,.*?,))+\bnor\b
#(?!<do )\bnot\b([^.?!"/(](?!neither|,.*?,))+\bnor\b
# Should be `neither/nor` (plus rewording the beginning)
# This is probably a double negative...

View File

@@ -1,41 +1,31 @@
# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns
# marker to ignore all code on line
^.*/\* #no-spell-check-line \*/.*$
# marker for ignoring a comment to the end of the line
// #no-spell-check.*$
# #includes
^\s*#include\s*(?:<.*?>|".*?")
# Gaelic
Gàidhlig
Ov_erwrite
# #pragma lib
^\s*#pragma comment\(lib, ".*?"\)
# languageHashTable
"\w+(?:-\w+|)"\s+=\s+@\(".*"\)
# Regular expression with `\b`
\\b(?=[a-z]\S*\{)
# wikipedia
\b\w\w\.wikipedia\.org/wiki/[-\w%.#]+
# long lorem
L"Lorem.*"
# css fonts
\bfont-family:[^;}]+
# .github/policies/resourceManagement.yml
pattern: '.*'
# tabs in c#
\$"\\t
# Hexadecimal character pattern in code
\\x[0-9a-fA-F]{4}
fontFamily": ".*"
D[23]D(?=[A-Z][a-z])
(?<=[a-z])3D(?=[A-Z])
\.monitorId = \{ .*\}
json::value\(L"\S+"
\\x[0-9a-fA-F][0-9a-fA-F]
# windows line breaks in strings
\\r\\n(?=[A-Za-z])
\\r\\n
# power shell gallery website
\bpowershellgallery.com/[-_a-zA-Z0-9()=./%]*
@@ -45,22 +35,9 @@ L?(["']|[-<({>]|\b)[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{10,12}(?:\g{
(?:L"[abAB]+", ){3}L"[abAB]+"
\. (?: @[-A-Za-z\d]+\b(?!\.[A-Z]),?)+
auto deviceId = L".*"
deviceId(?:\.id|) = L".*"
StringComparer.OrdinalIgnoreCase\) \{.*\}
# namespaces
\b[a-z]+::
"Author": ".+"
(?:Include|Link)=".*?"
# You could ignore `xmlns`, but it's probably better to enforce rules about them...
#\s(?:xmlns:[a-z]+(?:[A-Z][a-z]+|)=|[a-z]+(?:[A-Z][a-z]+):(?=[a-z]+=))
# hit-count: 1 file-count: 1
# marker to ignore all code on line
^.*/\* #no-spell-check-line \*/.*$
# UnitTests
\[DataRow\(.*\)\]
@@ -73,135 +50,142 @@ StringComparer.OrdinalIgnoreCase\) \{.*\}
# Automatically suggested patterns
# hit-count: 5402 file-count: 1339
# hit-count: 3715 file-count: 992
# IServiceProvider / isAThing
(?:(?:\b|_|(?<=[a-z]))[IT]|(?:\b|_)(?:nsI|isA))(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b))
(?:\b|_)(?:(?:ns|)I|isA)(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b))
# hit-count: 2073 file-count: 842
# #includes
^\s*#include\s*(?:<.*?>|".*?")
# hit-count: 404 file-count: 42
# base64 encoded content, possibly wrapped in mime
(?:^|[\s=;:?])[-a-zA-Z=;:/0-9+]{50,}(?:[\s=;:?]|$)
# hit-count: 1639 file-count: 855
# C# includes
^\s*using [^;]+;
# hit-count: 1491 file-count: 693
# microsoft
\b(?:https?://|)(?:(?:(?:blogs|download\.visualstudio|docs|msdn2?|research)\.|)microsoft|blogs\.msdn)\.co(?:m|\.\w\w)/[-_a-zA-Z0-9()=./%]*
# hit-count: 398 file-count: 133
# hex digits including css/html color classes:
(?:[\\0][xX]|\\u\{?|[uU]\+|#x?|%23|&H)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b
# hit-count: 339 file-count: 146
# hit-count: 402 file-count: 160
# hex runs
\b[0-9a-fA-F]{16,}\b
# hit-count: 253 file-count: 100
# hit-count: 337 file-count: 110
# hex digits including css/html color classes:
(?:[\\0][xX]|\\u|[uU]\+|#x?|%23)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b
# hit-count: 311 file-count: 43
# D2D
D?2D(?!efault)
# hit-count: 272 file-count: 75
# GitHub SHAs (markdown)
(?:\[`?[0-9a-f]+`?\]\(https:/|)/(?:www\.|)github\.com(?:/[^/\s"]+){2,}(?:/[^/\s")]+)(?:[0-9a-f]+(?:[-0-9a-zA-Z/#.]*|)\b|)
# hit-count: 241 file-count: 37
# hit-count: 146 file-count: 27
# version suffix <word>v#
(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_]))
# hit-count: 141 file-count: 6
# Contributor / Project
\[[^\]\s]+\]\(https://github\.com/[^)]+\)(?: -(?: [A-Z]\S+)+|)|\[[^\]]+\]\(https://github\.com/(?:[^/\s"]+/?){1,2}\)
https://github.com/(?:[-\w]+/?){1,2}
# hit-count: 131 file-count: 125
# Repeated letters
\b([a-z])\g{-1}{2,}\b
# hit-count: 99 file-count: 97
# hit-count: 105 file-count: 103
# w3
\bw3\.org/[-0-9a-zA-Z/#.]+
# hit-count: 59 file-count: 11
# hit-count: 94 file-count: 6
# Contributor
\[[^\]]+\]\(https://github\.com/[^/\s"]+/?\)
RegExp\(([`'"]).*?\g{-1}\)|(?:escapes|regEx):\s*(?:/.*/|([`'"]).*?\g{-1})|return/.*?/
# hit-count: 65 file-count: 38
# regex choice
\(\?:[^)]+\|[^)]+\)
# hit-count: 37 file-count: 14
# Markdown anchor links
\(#\S*?[a-zA-Z]\S*?\)
# hit-count: 29 file-count: 23
# hit-count: 33 file-count: 5
# base64 encoded pkcs
\bMII[-a-zA-Z=;:/0-9+]+
# hit-count: 28 file-count: 22
# stackexchange -- https://stackexchange.com/feeds/sites
\b(?:askubuntu|serverfault|stack(?:exchange|overflow)|superuser).com/(?:questions/\w+/[-\w]+|a/)
# hit-count: 24 file-count: 11
# Library prefix
# e.g., `lib`+`archive`, `lib`+`raw`, `lib`+`unwind`
# (ignores some words that happen to start with `lib`)
(?:\b|_)[Ll]ib(?:re(?=office)|)(?!era[lt]|ero|erty|rar(?:i(?:an|es)|y))(?=[a-z])
# hit-count: 14 file-count: 3
# node packages
(["'])@[^/'" ]+/[^/'" ]+\g{-1}
# hit-count: 20 file-count: 2
# hit-count: 13 file-count: 1
# Intel intrinsics
_mm\d*_(?!dd)\w+
_mm_(?!dd)\w+
# hit-count: 15 file-count: 8
# hit-count: 11 file-count: 5
# URL escaped characters
%[0-9A-F][A-F](?=[A-Za-z])
# hit-count: 9 file-count: 5
# Wikipedia
\ben\.wikipedia\.org/wiki/[-\w%.#]+
# hit-count: 14 file-count: 10
# hit-count: 5 file-count: 4
# vs devops
\bvisualstudio.com(?::443|)/[-\w/?=%&.]*
# hit-count: 8 file-count: 2
# copyright
Copyright (?:\([Cc]\)|)(?:[-\d, ]|and)+(?: [A-Z][a-z]+ [A-Z][a-z]+,?)+
# hit-count: 5 file-count: 4
# Alternatively, if you're using check-spelling v0.0.25+, and you would like to _check_ the Non-English content for spelling errors, you can. For information on how to do so, see:
# https://docs.check-spelling.dev/Feature:-Configurable-word-characters.html#unicode
[a-zA-Z]*[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3}[a-zA-ZÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]*|[a-zA-Z]{3,}[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]|[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3,}
# hit-count: 8 file-count: 1
# css fonts
\bfont(?:-family|):[^;}]+
# hit-count: 4 file-count: 4
# microsoft
\b(?:https?://|)(?:(?:(?:blogs|download\.visualstudio|developer|docs|learn|msdn2?|research)\.|)microsoft|blogs\.msdn)\.co(?:m|\.\w\w)/[-_a-zA-Z0-9()=./%#]*
aka\.ms/[a-zA-Z0-9]+
# hit-count: 8 file-count: 1
# kubernetes crd patterns
^\s*pattern: .*$
# hit-count: 5 file-count: 3
# URL escaped characters
%[0-9A-F][A-F](?=[A-Za-z])
# hit-count: 3 file-count: 3
# githubusercontent
/[-a-z0-9]+\.githubusercontent\.com/[-a-zA-Z0-9?&=_\/.]*
# hit-count: 2 file-count: 2
# medium
\bmedium\.com/@?[^/\s"]+/[-\w:/*.]+
# hit-count: 3 file-count: 2
# css url wrappings
\burl\([^)]+\)
# hit-count: 3 file-count: 1
# kubernetes crd patterns
^\s*pattern: .*$
# hit-count: 3 file-count: 1
# Lorem
# Update Lorem based on your content (requires `ge` and `w` from https://github.com/jsoref/spelling; and `review` from https://github.com/check-spelling/check-spelling/wiki/Looking-for-items-locally )
# grep '^[^#].*lorem' .github/actions/spelling/patterns.txt|perl -pne 's/.*i..\?://;s/\).*//' |tr '|' "\n"|sort -f |xargs -n1 ge|perl -pne 's/^[^:]*://'|sort -u|w|sed -e 's/ .*//'|w|review -
# Warning, while `(?i)` is very neat and fancy, if you have some binary files that aren't proper unicode, you might run into:
# ... Operation "substitution (s///)" returns its argument for non-Unicode code point 0x1C19AE (the code point will vary).
# ... You could manually change `(?i)X...` to use `[Xx]...`
# ... or you could add the files to your `excludes` file (a version after 0.0.19 should identify the file path)
(?:(?:\w|\s|[,.])*\b(?i)(?:amet|consectetur|cursus|dolor|eros|ipsum|lacus|libero|ligula|lorem|magna|neque|nulla|suscipit|tempus)\b(?:\w|\s|[,.])*)
# hit-count: 3 file-count: 1
# libraries
(?:\b|_)lib(?:re(?=office)|)(?!era[lt]|ero|erty|rar(?:i(?:an|es)|y))(?=[a-z])
# hit-count: 2 file-count: 1
# While you could try to match `http://` and `https://` by using `s?` in `https?://`, sometimes there
# YouTube url
\b(?:(?:www\.|)youtube\.com|youtu.be)/(?:channel/|embed/|user/|playlist\?list=|watch\?v=|v/|)[-a-zA-Z0-9?&=_%]*
# hit-count: 2 file-count: 1
# hit-count: 1 file-count: 1
# GHSA
GHSA(?:-[0-9a-z]{4}){3}
# hit-count: 1 file-count: 1
# GitHub actions
\buses:\s+[-\w.]+/[-\w./]+@[-\w.]+
# hit-count: 1 file-count: 1
# curl arguments
\b(?:\\n|)curl(?:\.exe|)(?:\s+-[a-zA-Z]{1,2}\b)*(?:\s+-[a-zA-Z]{3,})(?:\s+-[a-zA-Z]+)*
# medium
\bmedium\.com/@?[^/\s"]+/[-\w]+
# hit-count: 1 file-count: 1
# sha-... -- uses a fancy capture
(\\?['"]|&quot;)[0-9a-f]{40,}\g{-1}
# hit-count: 1 file-count: 1
# tar arguments
\b(?:\\n|)g?tar(?:\.exe|)(?:(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+
# #pragma lib
^\s*#pragma comment\(lib, ".*?"\)
# UnitTests
\[DataRow\(.*\)\]
# AdditionalDependencies
<AdditionalDependencies>.*<
# the last line of mimetype="application/x-microsoft.net.object.bytearray.base64" things in .resx files
^\s*[-a-zA-Z=;:/0-9+]*[-a-zA-Z;:/0-9+][-a-zA-Z=;:/0-9+]*=$
RegExp\(@?([`'"]).*?\g{-1}\)|(?:escapes|regEx):\s*(?:/.*/|([`'"]).*?\g{-1})|return/.*?/
# Questionably acceptable forms of `in to`
# Personally, I prefer `log into`, but people object
# https://www.tprteaching.com/log-into-log-in-to-login/
@@ -210,16 +194,13 @@ RegExp\(@?([`'"]).*?\g{-1}\)|(?:escapes|regEx):\s*(?:/.*/|([`'"]).*?\g{-1})|retu
# to opt in
\bto opt in\b
# pass(ed|ing) in
\bpass(?:ed|ing) in\b
# acceptable duplicates
# ls directory listings
[-bcdlpsw](?:[-r][-w][-SsTtx]){3}[\.+*]?\s+\d+\s+\S+\s+\S+\s+[.\d]+(?:[KMGT]|)\s+
# mount
\bmount\s+-t\s+(\w+)\s+\g{-1}\b
# C types and repeated CSS values
\s(auto|buffalo|center|div|inherit|long|LONG|none|normal|solid|thin|transparent|very)(?:\s\g{-1})+\s
\s(auto|buffalo|center|div|inherit|long|LONG|none|normal|solid|thin|transparent|very)(?: \g{-1})+\s
# C enum and struct
\b(?:enum|struct)\s+(\w+)\s+\g{-1}\b
# go templates
@@ -251,11 +232,9 @@ _SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING
# ignore long runs of a single character:
\b([A-Za-z])\g{-1}{3,}\b
# hit-count: 1 file-count: 1
# Amazon
\bamazon\.com/[-\w]+/(?:dp/[0-9A-Z]+|)
# hit-count: 3 file-count: 3
# imgur
\bimgur\.com/[^.]+
@@ -264,28 +243,4 @@ Process Process
# ZoomIt menu items with accelerator keys
E&xit
St&yle
# This matches a relative clause where the relative pronoun "that" is omitted.
# Example: "Gets or sets the window the TitleBar should configure."
\bthe\s+\w+\s+the\b
# Usernames with numbers
# 0x6f677548 is user name but user folder causes a flag
\bx6f677548\b
# Windows API constants and hardware interface terms
\bCOINIT[_A-Z]*\b
\bEOAC[_A-Z]*\b
\b(?:RPC_C_AUTHN_)?WINNT\b
\bUPDATEREGISTRY\b
\b(?:CDS_)?UPDATEREGISTRY\b
# Display interface terms (HDMI, DVI, DisplayPort)
\b(?:HDMI|DVI|DisplayPort)(?:-\d+)?\b
# 2D Region struct names
\bDisplayConfig2?D?Region\b
# Microsoft Store URLs and product IDs
ms-windows-store://\S+
St&yle

View File

@@ -1,17 +1,8 @@
^attache$
^bellows?$
^bellow$
benefitting
occurences?
^dependan.*
^develope$
^developement$
^developpe
^Devers?$
^devex
^devide
^Devinn?[ae]
^devisal
^devisor
^diables?$
^oer$
Sorce
@@ -19,5 +10,4 @@ Sorce
^Teh$
^untill$
^untilling$
^venders?$
^wether.*

View File

@@ -1,92 +0,0 @@
---
description: 'Implements fixes for GitHub issues based on implementation plans'
name: 'FixIssue'
tools: ['read', 'edit', 'search', 'execute', 'agent', 'usages', 'problems', 'changes', 'testFailure', 'github/*', 'github.vscode-pull-request-github/*']
argument-hint: 'GitHub issue number (e.g., #12345)'
infer: true
---
# FixIssue Agent
You are an **IMPLEMENTATION AGENT** specialized in executing implementation plans to fix GitHub issues.
## Identity & Expertise
- Expert at translating plans into working code
- Deep knowledge of PowerToys codebase patterns and conventions
- Skilled at writing tests, handling edge cases, and validating builds
- You follow plans precisely while handling ambiguity gracefully
## Goal
For the given **issue_number**, execute the implementation plan and produce:
1. Working code changes applied directly to the repository
2. `Generated Files/issueFix/{{issue_number}}/pr-description.md` — PR-ready description
3. `Generated Files/issueFix/{{issue_number}}/manual-steps.md` — Only if human action needed
## Core Directive
**Follow the implementation plan in `Generated Files/issueReview/{{issue_number}}/implementation-plan.md` as the single source of truth.**
If the plan doesn't exist, invoke PlanIssue agent first via `runSubagent`.
## Working Principles
- **Plan First**: Read and understand the entire implementation plan before coding
- **Validate Always**: For each change: Edit → Build → Verify → Commit. Never proceed if build fails.
- **Atomic Commits**: Each commit must be self-contained, buildable, and meaningful
- **Ask, Don't Guess**: When uncertain, insert `// TODO(Human input needed): <question>` and document in manual-steps.md
## Strategy
**Core Loop** — For every unit of work:
1. **Edit**: Make focused changes to implement one logical piece
2. **Build**: Run `tools\build\build.cmd` and check for exit code 0
3. **Verify**: Use `problems` tool for lint/compile errors; run relevant tests
4. **Commit**: Only after build passes — use `.github/prompts/create-commit-title.prompt.md`
Never skip steps. Never commit broken code. Never proceed if build fails.
**Feature-by-Feature E2E**: For big scenarios with multiple features, complete each feature end-to-end before moving to the next:
- Settings UI → Functionality → Logging → Tests (for Feature 1)
- Then repeat for Feature 2
- Benefits: Each feature is self-contained, testable, easier to review, can ship incrementally
**Large Changes** (3+ files or cross-module):
- Use `tools\build\New-WorktreeFromBranch.ps1` for isolated worktrees
- Create separate branches per feature (e.g., `issue/{{issue_number}}-export`, `issue/{{issue_number}}-import`)
- Merge feature branches back after each is validated
**Recovery**: If implementation goes wrong:
- Create a checkpoint branch before risky changes
- On failure: branch from last known-good state, cherry-pick working changes, abandon broken branch
- For complex changes, consider multiple smaller PRs
## Guidelines
**DO**:
- Follow the plan exactly
- Validate build before every commit — **NEVER commit broken code**
- Use `.github/prompts/create-commit-title.prompt.md` for commit messages
- Add comprehensive tests for changed behavior
- Use worktrees for large changes (3+ files or cross-module)
- Document deviations from plan
**DON'T**:
- Implement everything in a single massive commit
- Continue after a failed build without fixing
- Make drive-by refactors outside issue scope
- Skip tests for behavioral changes
- Add noisy logs in hot paths
- Break IPC/JSON contracts without updating both sides
- Introduce dependencies without documenting in NOTICE.md
## References
- [Build Guidelines](../../tools/build/BUILD-GUIDELINES.md) — Build commands and validation
- [Coding Style](../../doc/devdocs/development/style.md) — Formatting and conventions
- [AGENTS.md](../../AGENTS.md) — Full contributor guide
## Parameter
- **issue_number**: Extract from `#123`, `issue 123`, or plain number. If missing, ask user.

View File

@@ -1,65 +0,0 @@
---
description: 'Analyzes GitHub issues to produce overview and implementation plans'
name: 'PlanIssue'
tools: ['execute', 'read', 'edit', 'search', 'web', 'github/*', 'agent', 'github-artifacts/*', 'todo']
argument-hint: 'GitHub issue number (e.g., #12345)'
handoffs:
- label: Start Implementation
agent: FixIssue
prompt: 'Fix issue #{{issue_number}} using the implementation plan'
- label: Open Plan in Editor
agent: agent
prompt: 'Open Generated Files/issueReview/{{issue_number}}/overview.md and implementation-plan.md'
showContinueOn: false
send: true
infer: true
---
# PlanIssue Agent
You are a **PLANNING AGENT** specialized in analyzing GitHub issues and producing comprehensive planning documentation.
## Identity & Expertise
- Expert at issue triage, priority scoring, and technical analysis
- Deep knowledge of PowerToys architecture and codebase patterns
- Skilled at breaking down problems into actionable implementation steps
- You research thoroughly before planning, gathering 80% confidence before drafting
## Goal
For the given **issue_number**, produce two deliverables:
1. `Generated Files/issueReview/{{issue_number}}/overview.md` — Issue analysis with scoring
2. `Generated Files/issueReview/{{issue_number}}/implementation-plan.md` — Technical implementation plan
Above is the core interaction with the end user. If you cannot produce the files above, you fail the task. Each time, you must check whether the files exist or have been modified by the end user, without assuming you know their contents.
3. `Generated Files/issueReview/{{issue_number}}/logs/**` — logs for your diagnostic of root cause, research steps, and reasoning
## Core Directive
**Follow the template in `.github/prompts/review-issue.prompt.md` exactly.** Read it first, then apply every section as specified.
- Fetch issue details: reactions, comments, linked PRs, images, logs
- Search related code and similar past fixes
- Ask clarifying questions when ambiguous
- Identify subject matter experts via git history
<stopping_rules>
You are a PLANNING agent, NOT an implementation agent.
STOP if you catch yourself:
- Writing code or editing source files outside `Generated Files/issueReview/`
- Making assumptions without researching
- Skipping the scoring/assessment phase
Plans describe what the USER or FixIssue agent will execute later.
</stopping_rules>
## References
- [Review Issue Prompt](../.github/prompts/review-issue.prompt.md) — Template for plan structure
- [Architecture Overview](../../doc/devdocs/core/architecture.md) — System design context
- [AGENTS.md](../../AGENTS.md) — Full contributor guide
## Parameter
- **issue_number**: Extract from `#123`, `issue 123`, or plain number. If missing, ask user.

View File

@@ -1,36 +0,0 @@
---
description: 'PowerToys AI contributor guidance'
---
# PowerToys Copilot Instructions
Concise guidance for AI contributions. For complete details, see [AGENTS.md](../AGENTS.md).
## Key Rules
- Atomic PRs: one logical change, no drive-by refactors
- Add tests when changing behavior
- Keep hot paths quiet (no logging in hooks/tight loops)
## Style Enforcement
- C#: `src/.editorconfig`, StyleCop.Analyzers
- C++: `src/.clang-format`
- XAML: XamlStyler
## When to Ask for Clarification
- Ambiguous spec after scanning docs
- Cross-module impact unclear
- Security, elevation, or installer changes
## Component-Specific Instructions
These are auto-applied based on file location:
- [Runner & Settings UI](.github/instructions/runner-settings-ui.instructions.md)
- [Common Libraries](.github/instructions/common-libraries.instructions.md)
## Detailed Documentation
- [Architecture](../doc/devdocs/core/architecture.md)
- [Coding Style](../doc/devdocs/development/style.md)

View File

@@ -1,261 +0,0 @@
---
description: 'Guidelines for creating high-quality Agent Skills for GitHub Copilot'
applyTo: '**/.github/skills/**/SKILL.md, **/.claude/skills/**/SKILL.md'
---
# Agent Skills File Guidelines
Instructions for creating effective and portable Agent Skills that enhance GitHub Copilot with specialized capabilities, workflows, and bundled resources.
## What Are Agent Skills?
Agent Skills are self-contained folders with instructions and bundled resources that teach AI agents specialized capabilities. Unlike custom instructions (which define coding standards), skills enable task-specific workflows that can include scripts, examples, templates, and reference data.
Key characteristics:
- **Portable**: Works across VS Code, Copilot CLI, and Copilot coding agent
- **Progressive loading**: Only loaded when relevant to the user's request
- **Resource-bundled**: Can include scripts, templates, examples alongside instructions
- **On-demand**: Activated automatically based on prompt relevance
## Directory Structure
Skills are stored in specific locations:
| Location | Scope | Recommendation |
|----------|-------|----------------|
| `.github/skills/<skill-name>/` | Project/repository | Recommended for project skills |
| `.claude/skills/<skill-name>/` | Project/repository | Legacy, for backward compatibility |
| `~/.github/skills/<skill-name>/` | Personal (user-wide) | Recommended for personal skills |
| `~/.claude/skills/<skill-name>/` | Personal (user-wide) | Legacy, for backward compatibility |
Each skill **must** have its own subdirectory containing at minimum a `SKILL.md` file.
## Required SKILL.md Format
### Frontmatter (Required)
```yaml
---
name: webapp-testing
description: Toolkit for testing local web applications using Playwright. Use when asked to verify frontend functionality, debug UI behavior, capture browser screenshots, check for visual regressions, or view browser console logs. Supports Chrome, Firefox, and WebKit browsers.
license: Complete terms in LICENSE.txt
---
```
| Field | Required | Constraints |
|-------|----------|-------------|
| `name` | Yes | Lowercase, hyphens for spaces, max 64 characters (e.g., `webapp-testing`) |
| `description` | Yes | Clear description of capabilities AND use cases, max 1024 characters |
| `license` | No | Reference to LICENSE.txt (e.g., `Complete terms in LICENSE.txt`) or SPDX identifier |
### Description Best Practices
**CRITICAL**: The `description` field is the PRIMARY mechanism for automatic skill discovery. Copilot reads ONLY the `name` and `description` to decide whether to load a skill. If your description is vague, the skill will never be activated.
**What to include in description:**
1. **WHAT** the skill does (capabilities)
2. **WHEN** to use it (specific triggers, scenarios, file types, or user requests)
3. **Keywords** that users might mention in their prompts
**Good description:**
```yaml
description: Toolkit for testing local web applications using Playwright. Use when asked to verify frontend functionality, debug UI behavior, capture browser screenshots, check for visual regressions, or view browser console logs. Supports Chrome, Firefox, and WebKit browsers.
```
**Poor description:**
```yaml
description: Web testing helpers
```
The poor description fails because:
- No specific triggers (when should Copilot load this?)
- No keywords (what user prompts would match?)
- No capabilities (what can it actually do?)
### Body Content
The body contains detailed instructions that Copilot loads AFTER the skill is activated. Recommended sections:
| Section | Purpose |
|---------|---------|
| `# Title` | Brief overview of what this skill enables |
| `## When to Use This Skill` | List of scenarios (reinforces description triggers) |
| `## Prerequisites` | Required tools, dependencies, environment setup |
| `## Step-by-Step Workflows` | Numbered steps for common tasks |
| `## Troubleshooting` | Common issues and solutions table |
| `## References` | Links to bundled docs or external resources |
## Bundling Resources
Skills can include additional files that Copilot accesses on-demand:
### Supported Resource Types
| Folder | Purpose | Loaded into Context? | Example Files |
|--------|---------|---------------------|---------------|
| `scripts/` | Executable automation that performs specific operations | When executed | `helper.py`, `validate.sh`, `build.ts` |
| `references/` | Documentation the AI agent reads to inform decisions | Yes, when referenced | `api_reference.md`, `schema.md`, `workflow_guide.md` |
| `assets/` | **Static files used AS-IS** in output (not modified by the AI agent) | No | `logo.png`, `brand-template.pptx`, `custom-font.ttf` |
| `templates/` | **Starter code/scaffolds that the AI agent MODIFIES** and builds upon | Yes, when referenced | `viewer.html` (insert algorithm), `hello-world/` (extend) |
### Directory Structure Example
```
.github/skills/my-skill/
├── SKILL.md # Required: Main instructions
├── LICENSE.txt # Recommended: License terms (Apache 2.0 typical)
├── scripts/ # Optional: Executable automation
│ ├── helper.py # Python script
│ └── helper.ps1 # PowerShell script
├── references/ # Optional: Documentation loaded into context
│ ├── api_reference.md
│ ├── step1-setup.md # Detailed workflow (>3 steps)
│ └── step2-deployment.md
├── assets/ # Optional: Static files used AS-IS in output
│ ├── baseline.png # Reference image for comparison
│ └── report-template.html
└── templates/ # Optional: Starter code the AI agent modifies
├── scaffold.py # Code scaffold the AI agent customizes
└── config.template # Config template the AI agent fills in
```
> **LICENSE.txt**: When creating a skill, download the Apache 2.0 license text from https://www.apache.org/licenses/LICENSE-2.0.txt and save as `LICENSE.txt`. Update the copyright year and owner in the appendix section.
### Assets vs Templates: Key Distinction
**Assets** are static resources **consumed unchanged** in the output:
- A `logo.png` that gets embedded into a generated document
- A `report-template.html` copied as output format
- A `custom-font.ttf` applied to text rendering
**Templates** are starter code/scaffolds that **the AI agent actively modifies**:
- A `scaffold.py` where the AI agent inserts logic
- A `config.template` where the AI agent fills in values based on user requirements
- A `hello-world/` project directory that the AI agent extends with new features
**Rule of thumb**: If the AI agent reads and builds upon the file content → `templates/`. If the file is used as-is in output → `assets/`.
### Referencing Resources in SKILL.md
Use relative paths to reference files within the skill directory:
```markdown
## Available Scripts
Run the [helper script](./scripts/helper.py) to automate common tasks.
See [API reference](./references/api_reference.md) for detailed documentation.
Use the [scaffold](./templates/scaffold.py) as a starting point.
```
## Progressive Loading Architecture
Skills use three-level loading for efficiency:
| Level | What Loads | When |
|-------|------------|------|
| 1. Discovery | `name` and `description` only | Always (lightweight metadata) |
| 2. Instructions | Full `SKILL.md` body | When request matches description |
| 3. Resources | Scripts, examples, docs | Only when Copilot references them |
This means:
- Install many skills without consuming context
- Only relevant content loads per task
- Resources don't load until explicitly needed
## Content Guidelines
### Writing Style
- Use imperative mood: "Run", "Create", "Configure" (not "You should run")
- Be specific and actionable
- Include exact commands with parameters
- Show expected outputs where helpful
- Keep sections focused and scannable
### Script Requirements
When including scripts, prefer cross-platform languages:
| Language | Use Case |
|----------|----------|
| Python | Complex automation, data processing |
| pwsh | PowerShell Core scripting |
| Node.js | JavaScript-based tooling |
| Bash/Shell | Simple automation tasks |
Best practices:
- Include help/usage documentation (`--help` flag)
- Handle errors gracefully with clear messages
- Avoid storing credentials or secrets
- Use relative paths where possible
### When to Bundle Scripts
Include scripts in your skill when:
- The same code would be rewritten repeatedly by the agent
- Deterministic reliability is critical (e.g., file manipulation, API calls)
- Complex logic benefits from being pre-tested rather than generated each time
- The operation has a self-contained purpose that can evolve independently
- Testability matters — scripts can be unit tested and validated
- Predictable behavior is preferred over dynamic generation
Scripts enable evolution: even simple operations benefit from being implemented as scripts when they may grow in complexity, need consistent behavior across invocations, or require future extensibility.
### Security Considerations
- Scripts rely on existing credential helpers (no credential storage)
- Include `--force` flags only for destructive operations
- Warn users before irreversible actions
- Document any network operations or external calls
## Common Patterns
### Parameter Table Pattern
Document parameters clearly:
```markdown
| Parameter | Required | Default | Description |
|-----------|----------|---------|-------------|
| `--input` | Yes | - | Input file or URL to process |
| `--action` | Yes | - | Action to perform |
| `--verbose` | No | `false` | Enable verbose output |
```
## Validation Checklist
Before publishing a skill:
- [ ] `SKILL.md` has valid frontmatter with `name` and `description`
- [ ] `name` is lowercase with hyphens, ≤64 characters
- [ ] `description` clearly states **WHAT** it does, **WHEN** to use it, and relevant **KEYWORDS**
- [ ] Body includes when to use, prerequisites, and step-by-step workflows
- [ ] SKILL.md body kept under 500 lines (split large content into `references/` folder)
- [ ] Large workflows (>5 steps) split into `references/` folder with clear links from SKILL.md
- [ ] Scripts include help documentation and error handling
- [ ] Relative paths used for all resource references
- [ ] No hardcoded credentials or secrets
## Workflow Execution Pattern
When executing multi-step workflows, create a TODO list where each step references the relevant documentation:
```markdown
## TODO
- [ ] Step 1: Configure environment - see [workflow-setup.md](./references/workflow-setup.md#environment)
- [ ] Step 2: Build project - see [workflow-setup.md](./references/workflow-setup.md#build)
- [ ] Step 3: Deploy to staging - see [workflow-deployment.md](./references/workflow-deployment.md#staging)
- [ ] Step 4: Run validation - see [workflow-deployment.md](./references/workflow-deployment.md#validation)
- [ ] Step 5: Deploy to production - see [workflow-deployment.md](./references/workflow-deployment.md#production)
```
This ensures traceability and allows resuming workflows if interrupted.
## Related Resources
- [Agent Skills Specification](https://agentskills.io/)
- [VS Code Agent Skills Documentation](https://code.visualstudio.com/docs/copilot/customization/agent-skills)
- [Reference Skills Repository](https://github.com/anthropics/skills)
- [Awesome Copilot Skills](https://github.com/github/awesome-copilot/blob/main/docs/README.skills.md)

View File

@@ -1,791 +0,0 @@
---
description: 'Guidelines for creating custom agent files for GitHub Copilot'
applyTo: '**/*.agent.md'
---
# Custom Agent File Guidelines
Instructions for creating effective and maintainable custom agent files that provide specialized expertise for specific development tasks in GitHub Copilot.
## Project Context
- Target audience: Developers creating custom agents for GitHub Copilot
- File format: Markdown with YAML frontmatter
- File naming convention: lowercase with hyphens (e.g., `test-specialist.agent.md`)
- Location: `.github/agents/` directory (repository-level) or `agents/` directory (organization/enterprise-level)
- Purpose: Define specialized agents with tailored expertise, tools, and instructions for specific tasks
- Official documentation: https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/create-custom-agents
## Required Frontmatter
Every agent file must include YAML frontmatter with the following fields:
```yaml
---
description: 'Brief description of the agent purpose and capabilities'
name: 'Agent Display Name'
tools: ['read', 'edit', 'search']
model: 'Claude Sonnet 4.5'
target: 'vscode'
infer: true
---
```
### Core Frontmatter Properties
#### **description** (REQUIRED)
- Single-quoted string, clearly stating the agent's purpose and domain expertise
- Should be concise (50-150 characters) and actionable
- Example: `'Focuses on test coverage, quality, and testing best practices'`
#### **name** (OPTIONAL)
- Display name for the agent in the UI
- If omitted, defaults to filename (without `.md` or `.agent.md`)
- Use title case and be descriptive
- Example: `'Testing Specialist'`
#### **tools** (OPTIONAL)
- List of tool names or aliases the agent can use
- Supports comma-separated string or YAML array format
- If omitted, agent has access to all available tools
- See "Tool Configuration" section below for details
#### **model** (STRONGLY RECOMMENDED)
- Specifies which AI model the agent should use
- Supported in VS Code, JetBrains IDEs, Eclipse, and Xcode
- Example: `'Claude Sonnet 4.5'`, `'gpt-4'`, `'gpt-4o'`
- Choose based on agent complexity and required capabilities
#### **target** (OPTIONAL)
- Specifies target environment: `'vscode'` or `'github-copilot'`
- If omitted, agent is available in both environments
- Use when agent has environment-specific features
#### **infer** (OPTIONAL)
- Boolean controlling whether Copilot can automatically use this agent based on context
- Default: `true` if omitted
- Set to `false` to require manual agent selection
#### **metadata** (OPTIONAL, GitHub.com only)
- Object with name-value pairs for agent annotation
- Example: `metadata: { category: 'testing', version: '1.0' }`
- Not supported in VS Code
#### **mcp-servers** (OPTIONAL, Organization/Enterprise only)
- Configure MCP servers available only to this agent
- Only supported for organization/enterprise level agents
- See "MCP Server Configuration" section below
## Tool Configuration
### Tool Specification Strategies
**Enable all tools** (default):
```yaml
# Omit tools property entirely, or use:
tools: ['*']
```
**Enable specific tools**:
```yaml
tools: ['read', 'edit', 'search', 'execute']
```
**Enable MCP server tools**:
```yaml
tools: ['read', 'edit', 'github/*', 'playwright/navigate']
```
**Disable all tools**:
```yaml
tools: []
```
### Standard Tool Aliases
All aliases are case-insensitive:
| Alias | Alternative Names | Category | Description |
|-------|------------------|----------|-------------|
| `execute` | shell, Bash, powershell | Shell execution | Execute commands in appropriate shell |
| `read` | Read, NotebookRead, view | File reading | Read file contents |
| `edit` | Edit, MultiEdit, Write, NotebookEdit | File editing | Edit and modify files |
| `search` | Grep, Glob, search | Code search | Search for files or text in files |
| `agent` | custom-agent, Task | Agent invocation | Invoke other custom agents |
| `web` | WebSearch, WebFetch | Web access | Fetch web content and search |
| `todo` | TodoWrite | Task management | Create and manage task lists (VS Code only) |
### Built-in MCP Server Tools
**GitHub MCP Server**:
```yaml
tools: ['github/*'] # All GitHub tools
tools: ['github/get_file_contents', 'github/search_repositories'] # Specific tools
```
- All read-only tools available by default
- Token scoped to source repository
**Playwright MCP Server**:
```yaml
tools: ['playwright/*'] # All Playwright tools
tools: ['playwright/navigate', 'playwright/screenshot'] # Specific tools
```
- Configured to access localhost only
- Useful for browser automation and testing
### Tool Selection Best Practices
- **Principle of Least Privilege**: Only enable tools necessary for the agent's purpose
- **Security**: Limit `execute` access unless explicitly required
- **Focus**: Fewer tools = clearer agent purpose and better performance
- **Documentation**: Comment why specific tools are required for complex configurations
## Sub-Agent Invocation (Agent Orchestration)
Agents can invoke other agents using `runSubagent` to orchestrate multi-step workflows.
### How It Works
Include `agent` in tools list to enable sub-agent invocation:
```yaml
tools: ['read', 'edit', 'search', 'agent']
```
Then invoke other agents with `runSubagent`:
```javascript
const result = await runSubagent({
description: 'What this step does',
prompt: `You are the [Specialist] specialist.
Context:
- Parameter: ${parameterValue}
- Input: ${inputPath}
- Output: ${outputPath}
Task:
1. Do the specific work
2. Write results to output location
3. Return summary of completion`
});
```
### Basic Pattern
Structure each sub-agent call with:
1. **description**: Clear one-line purpose of the sub-agent invocation
2. **prompt**: Detailed instructions with substituted variables
The prompt should include:
- Who the sub-agent is (specialist role)
- What context it needs (parameters, paths)
- What to do (concrete tasks)
- Where to write output
- What to return (summary)
### Example: Multi-Step Processing
```javascript
// Step 1: Process data
const processing = await runSubagent({
description: 'Transform raw input data',
prompt: `You are the Data Processor specialist.
Project: ${projectName}
Input: ${basePath}/raw/
Output: ${basePath}/processed/
Task:
1. Read all files from input directory
2. Apply transformations
3. Write processed files to output
4. Create summary: ${basePath}/processed/summary.md
Return: Number of files processed and any issues found`
});
// Step 2: Analyze (depends on Step 1)
const analysis = await runSubagent({
description: 'Analyze processed data',
prompt: `You are the Data Analyst specialist.
Project: ${projectName}
Input: ${basePath}/processed/
Output: ${basePath}/analysis/
Task:
1. Read processed files from input
2. Generate analysis report
3. Write to: ${basePath}/analysis/report.md
Return: Key findings and identified patterns`
});
```
### Key Points
- **Pass variables in prompts**: Use `${variableName}` for all dynamic values
- **Keep prompts focused**: Clear, specific tasks for each sub-agent
- **Return summaries**: Each sub-agent should report what it accomplished
- **Sequential execution**: Use `await` to maintain order when steps depend on each other
- **Error handling**: Check results before proceeding to dependent steps
### ⚠️ Tool Availability Requirement
**Critical**: If a sub-agent requires specific tools (e.g., `edit`, `execute`, `search`), the orchestrator must include those tools in its own `tools` list. Sub-agents cannot access tools that aren't available to their parent orchestrator.
**Example**:
```yaml
# If your sub-agents need to edit files, execute commands, or search code
tools: ['read', 'edit', 'search', 'execute', 'agent']
```
The orchestrator's tool permissions act as a ceiling for all invoked sub-agents. Plan your tool list carefully to ensure all sub-agents have the tools they need.
### ⚠️ Important Limitation
**Sub-agent orchestration is NOT suitable for large-scale data processing.** Avoid using `runSubagent` when:
- Processing hundreds or thousands of files
- Handling large datasets
- Performing bulk transformations on big codebases
- Orchestrating more than 5-10 sequential steps
Each sub-agent call adds latency and context overhead. For high-volume processing, implement logic directly in a single agent instead. Use orchestration only for coordinating specialized tasks on focused, manageable datasets.
## Agent Prompt Structure
The markdown content below the frontmatter defines the agent's behavior, expertise, and instructions. Well-structured prompts typically include:
1. **Agent Identity and Role**: Who the agent is and its primary role
2. **Core Responsibilities**: What specific tasks the agent performs
3. **Approach and Methodology**: How the agent works to accomplish tasks
4. **Guidelines and Constraints**: What to do/avoid and quality standards
5. **Output Expectations**: Expected output format and quality
### Prompt Writing Best Practices
- **Be Specific and Direct**: Use imperative mood ("Analyze", "Generate"); avoid vague terms
- **Define Boundaries**: Clearly state scope limits and constraints
- **Include Context**: Explain domain expertise and reference relevant frameworks
- **Focus on Behavior**: Describe how the agent should think and work
- **Use Structured Format**: Headers, bullets, and lists make prompts scannable
## Variable Definition and Extraction
Agents can define dynamic parameters to extract values from user input and use them throughout the agent's behavior and sub-agent communications. This enables flexible, context-aware agents that adapt to user-provided data.
### When to Use Variables
**Use variables when**:
- Agent behavior depends on user input
- Need to pass dynamic values to sub-agents
- Want to make agents reusable across different contexts
- Require parameterized workflows
- Need to track or reference user-provided context
**Examples**:
- Extract project name from user prompt
- Capture certification name for pipeline processing
- Identify file paths or directories
- Extract configuration options
- Parse feature names or module identifiers
### Variable Declaration Pattern
Define variables section early in the agent prompt to document expected parameters:
```markdown
# Agent Name
## Dynamic Parameters
- **Parameter Name**: Description and usage
- **Another Parameter**: How it's extracted and used
## Your Mission
Process [PARAMETER_NAME] to accomplish [task].
```
### Variable Extraction Methods
#### 1. **Explicit User Input**
Ask the user to provide the variable if not detected in the prompt:
```markdown
## Your Mission
Process the project by analyzing your codebase.
### Step 1: Identify Project
If no project name is provided, **ASK THE USER** for:
- Project name or identifier
- Base path or directory location
- Configuration type (if applicable)
Use this information to contextualize all subsequent tasks.
```
#### 2. **Implicit Extraction from Prompt**
Automatically extract variables from the user's natural language input:
```javascript
// Example: Extract certification name from user input
const userInput = "Process My Certification";
// Extract key information
const certificationName = extractCertificationName(userInput);
// Result: "My Certification"
const basePath = `certifications/${certificationName}`;
// Result: "certifications/My Certification"
```
#### 3. **Contextual Variable Resolution**
Use file context or workspace information to derive variables:
```markdown
## Variable Resolution Strategy
1. **From User Prompt**: First, look for explicit mentions in user input
2. **From File Context**: Check current file name or path
3. **From Workspace**: Use workspace folder or active project
4. **From Settings**: Reference configuration files
5. **Ask User**: If all else fails, request missing information
```
### Using Variables in Agent Prompts
#### Variable Substitution in Instructions
Use template variables in agent prompts to make them dynamic:
```markdown
# Agent Name
## Dynamic Parameters
- **Project Name**: ${projectName}
- **Base Path**: ${basePath}
- **Output Directory**: ${outputDir}
## Your Mission
Process the **${projectName}** project located at `${basePath}`.
## Process Steps
1. Read input from: `${basePath}/input/`
2. Process files according to project configuration
3. Write results to: `${outputDir}/`
4. Generate summary report
## Quality Standards
- Maintain project-specific coding standards for **${projectName}**
- Follow directory structure: `${basePath}/[structure]`
```
#### Passing Variables to Sub-Agents
When invoking a sub-agent, pass all context through template variables in the prompt:
```javascript
// Extract and prepare variables
const basePath = `projects/${projectName}`;
const inputPath = `${basePath}/src/`;
const outputPath = `${basePath}/docs/`;
// Pass to sub-agent with all variables substituted
const result = await runSubagent({
description: 'Generate project documentation',
prompt: `You are the Documentation specialist.
Project: ${projectName}
Input: ${inputPath}
Output: ${outputPath}
Task:
1. Read source files from ${inputPath}
2. Generate comprehensive documentation
3. Write to ${outputPath}/index.md
4. Include code examples and usage guides
Return: Summary of documentation generated (file count, word count)`
});
```
The sub-agent receives all necessary context embedded in the prompt. Variables are resolved before sending the prompt, so the sub-agent works with concrete paths and values, not variable placeholders.
### Real-World Example: Code Review Orchestrator
Example of a simple orchestrator that validates code through multiple specialized agents:
```javascript
async function reviewCodePipeline(repositoryName, prNumber) {
const basePath = `projects/${repositoryName}/pr-${prNumber}`;
// Step 1: Security Review
const security = await runSubagent({
description: 'Scan for security vulnerabilities',
prompt: `You are the Security Reviewer specialist.
Repository: ${repositoryName}
PR: ${prNumber}
Code: ${basePath}/changes/
Task:
1. Scan code for OWASP Top 10 vulnerabilities
2. Check for injection attacks, auth flaws
3. Write findings to ${basePath}/security-review.md
Return: List of critical, high, and medium issues found`
});
// Step 2: Test Coverage Check
const coverage = await runSubagent({
description: 'Verify test coverage for changes',
prompt: `You are the Test Coverage specialist.
Repository: ${repositoryName}
PR: ${prNumber}
Changes: ${basePath}/changes/
Task:
1. Analyze code coverage for modified files
2. Identify untested critical paths
3. Write report to ${basePath}/coverage-report.md
Return: Current coverage percentage and gaps`
});
// Step 3: Aggregate Results
const finalReport = await runSubagent({
description: 'Compile all review findings',
prompt: `You are the Review Aggregator specialist.
Repository: ${repositoryName}
Reports: ${basePath}/*.md
Task:
1. Read all review reports from ${basePath}/
2. Synthesize findings into single report
3. Determine overall verdict (APPROVE/NEEDS_FIXES/BLOCK)
4. Write to ${basePath}/final-review.md
Return: Final verdict and executive summary`
});
return finalReport;
}
```
This pattern applies to any orchestration scenario: extract variables, call sub-agents with clear context, await results.
### Variable Best Practices
#### 1. **Clear Documentation**
Always document what variables are expected:
```markdown
## Required Variables
- **projectName**: The name of the project (string, required)
- **basePath**: Root directory for project files (path, required)
## Optional Variables
- **mode**: Processing mode - quick/standard/detailed (enum, default: standard)
- **outputFormat**: Output format - markdown/json/html (enum, default: markdown)
## Derived Variables
- **outputDir**: Automatically set to ${basePath}/output
- **logFile**: Automatically set to ${basePath}/.log.md
```
#### 2. **Consistent Naming**
Use consistent variable naming conventions:
```javascript
// Good: Clear, descriptive naming
const variables = {
projectName, // What project to work on
basePath, // Where project files are located
outputDirectory, // Where to save results
processingMode, // How to process (detail level)
configurationPath // Where config files are
};
// Avoid: Ambiguous or inconsistent
const bad_variables = {
name, // Too generic
path, // Unclear which path
mode, // Too short
config // Too vague
};
```
#### 3. **Validation and Constraints**
Document valid values and constraints:
```markdown
## Variable Constraints
**projectName**:
- Type: string (alphanumeric, hyphens, underscores allowed)
- Length: 1-100 characters
- Required: yes
- Pattern: `/^[a-zA-Z0-9_-]+$/`
**processingMode**:
- Type: enum
- Valid values: "quick" (< 5min), "standard" (5-15min), "detailed" (15+ min)
- Default: "standard"
- Required: no
```
## MCP Server Configuration (Organization/Enterprise Only)
MCP servers extend agent capabilities with additional tools. Only supported for organization and enterprise-level agents.
### Configuration Format
```yaml
---
name: my-custom-agent
description: 'Agent with MCP integration'
tools: ['read', 'edit', 'custom-mcp/tool-1']
mcp-servers:
custom-mcp:
type: 'local'
command: 'some-command'
args: ['--arg1', '--arg2']
tools: ["*"]
env:
ENV_VAR_NAME: ${{ secrets.API_KEY }}
---
```
### MCP Server Properties
- **type**: Server type (`'local'` or `'stdio'`)
- **command**: Command to start the MCP server
- **args**: Array of command arguments
- **tools**: Tools to enable from this server (`["*"]` for all)
- **env**: Environment variables (supports secrets)
### Environment Variables and Secrets
Secrets must be configured in repository settings under "copilot" environment.
**Supported syntax**:
```yaml
env:
# Environment variable only
VAR_NAME: COPILOT_MCP_ENV_VAR_VALUE
# Variable with header
VAR_NAME: $COPILOT_MCP_ENV_VAR_VALUE
VAR_NAME: ${COPILOT_MCP_ENV_VAR_VALUE}
# GitHub Actions-style (YAML only)
VAR_NAME: ${{ secrets.COPILOT_MCP_ENV_VAR_VALUE }}
VAR_NAME: ${{ var.COPILOT_MCP_ENV_VAR_VALUE }}
```
## File Organization and Naming
### Repository-Level Agents
- Location: `.github/agents/`
- Scope: Available only in the specific repository
- Access: Uses repository-configured MCP servers
### Organization/Enterprise-Level Agents
- Location: `.github-private/agents/` (then move to `agents/` root)
- Scope: Available across all repositories in org/enterprise
- Access: Can configure dedicated MCP servers
### Naming Conventions
- Use lowercase with hyphens: `test-specialist.agent.md`
- Name should reflect agent purpose
- Filename becomes default agent name (if `name` not specified)
- Allowed characters: `.`, `-`, `_`, `a-z`, `A-Z`, `0-9`
## Agent Processing and Behavior
### Versioning
- Based on Git commit SHAs for the agent file
- Create branches/tags for different agent versions
- Instantiated using latest version for repository/branch
- PR interactions use same agent version for consistency
### Name Conflicts
Priority (highest to lowest):
1. Repository-level agent
2. Organization-level agent
3. Enterprise-level agent
Lower-level configurations override higher-level ones with the same name.
### Tool Processing
- `tools` list filters available tools (built-in and MCP)
- No tools specified = all tools enabled
- Empty list (`[]`) = all tools disabled
- Specific list = only those tools enabled
- Unrecognized tool names are ignored (allows environment-specific tools)
### MCP Server Processing Order
1. Out-of-the-box MCP servers (e.g., GitHub MCP)
2. Custom agent MCP configuration (org/enterprise only)
3. Repository-level MCP configurations
Each level can override settings from previous levels.
## Agent Creation Checklist
### Frontmatter
- [ ] `description` field present and descriptive (50-150 chars)
- [ ] `description` wrapped in single quotes
- [ ] `name` specified (optional but recommended)
- [ ] `tools` configured appropriately (or intentionally omitted)
- [ ] `model` specified for optimal performance
- [ ] `target` set if environment-specific
- [ ] `infer` set to `false` if manual selection required
### Prompt Content
- [ ] Clear agent identity and role defined
- [ ] Core responsibilities listed explicitly
- [ ] Approach and methodology explained
- [ ] Guidelines and constraints specified
- [ ] Output expectations documented
- [ ] Examples provided where helpful
- [ ] Instructions are specific and actionable
- [ ] Scope and boundaries clearly defined
- [ ] Total content under 30,000 characters
### File Structure
- [ ] Filename follows lowercase-with-hyphens convention
- [ ] File placed in correct directory (`.github/agents/` or `agents/`)
- [ ] Filename uses only allowed characters
- [ ] File extension is `.agent.md`
### Quality Assurance
- [ ] Agent purpose is unique and not duplicative
- [ ] Tools are minimal and necessary
- [ ] Instructions are clear and unambiguous
- [ ] Agent has been tested with representative tasks
- [ ] Documentation references are current
- [ ] Security considerations addressed (if applicable)
## Common Agent Patterns
### Testing Specialist
**Purpose**: Focus on test coverage and quality
**Tools**: All tools (for comprehensive test creation)
**Approach**: Analyze, identify gaps, write tests, avoid production code changes
### Implementation Planner
**Purpose**: Create detailed technical plans and specifications
**Tools**: Limited to `['read', 'search', 'edit']`
**Approach**: Analyze requirements, create documentation, avoid implementation
### Code Reviewer
**Purpose**: Review code quality and provide feedback
**Tools**: `['read', 'search']` only
**Approach**: Analyze, suggest improvements, no direct modifications
### Refactoring Specialist
**Purpose**: Improve code structure and maintainability
**Tools**: `['read', 'search', 'edit']`
**Approach**: Analyze patterns, propose refactorings, implement safely
### Security Auditor
**Purpose**: Identify security issues and vulnerabilities
**Tools**: `['read', 'search', 'web']`
**Approach**: Scan code, check against OWASP, report findings
## Common Mistakes to Avoid
### Frontmatter Errors
- ❌ Missing `description` field
- ❌ Description not wrapped in quotes
- ❌ Invalid tool names without checking documentation
- ❌ Incorrect YAML syntax (indentation, quotes)
### Tool Configuration Issues
- ❌ Granting excessive tool access unnecessarily
- ❌ Missing required tools for agent's purpose
- ❌ Not using tool aliases consistently
- ❌ Forgetting MCP server namespace (`server-name/tool`)
### Prompt Content Problems
- ❌ Vague, ambiguous instructions
- ❌ Conflicting or contradictory guidelines
- ❌ Lack of clear scope definition
- ❌ Missing output expectations
- ❌ Overly verbose instructions (exceeding character limits)
- ❌ No examples or context for complex tasks
### Organizational Issues
- ❌ Filename doesn't reflect agent purpose
- ❌ Wrong directory (confusing repo vs org level)
- ❌ Using spaces or special characters in filename
- ❌ Duplicate agent names causing conflicts
## Testing and Validation
### Manual Testing
1. Create the agent file with proper frontmatter
2. Reload VS Code or refresh GitHub.com
3. Select the agent from the dropdown in Copilot Chat
4. Test with representative user queries
5. Verify tool access works as expected
6. Confirm output meets expectations
### Integration Testing
- Test agent with different file types in scope
- Verify MCP server connectivity (if configured)
- Check agent behavior with missing context
- Test error handling and edge cases
- Validate agent switching and handoffs
### Quality Checks
- Run through agent creation checklist
- Review against common mistakes list
- Compare with example agents in repository
- Get peer review for complex agents
- Document any special configuration needs
## Additional Resources
### Official Documentation
- [Creating Custom Agents](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/create-custom-agents)
- [Custom Agents Configuration](https://docs.github.com/en/copilot/reference/custom-agents-configuration)
- [Custom Agents in VS Code](https://code.visualstudio.com/docs/copilot/customization/custom-agents)
- [MCP Integration](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/extend-coding-agent-with-mcp)
### Community Resources
- [Awesome Copilot Agents Collection](https://github.com/github/awesome-copilot/tree/main/agents)
- [Customization Library Examples](https://docs.github.com/en/copilot/tutorials/customization-library/custom-agents)
- [Your First Custom Agent Tutorial](https://docs.github.com/en/copilot/tutorials/customization-library/custom-agents/your-first-custom-agent)
### Related Files
- [Prompt Files Guidelines](./prompt.instructions.md) - For creating prompt files
- [Instructions Guidelines](./instructions.instructions.md) - For creating instruction files
## Version Compatibility Notes
### GitHub.com (Coding Agent)
- ✅ Fully supports all standard frontmatter properties
- ✅ Repository and org/enterprise level agents
- ✅ MCP server configuration (org/enterprise)
- ❌ Does not support `model`, `argument-hint`, `handoffs` properties
### VS Code / JetBrains / Eclipse / Xcode
- ✅ Supports `model` property for AI model selection
- ✅ Supports `argument-hint` and `handoffs` properties
- ✅ User profile and workspace-level agents
- ❌ Cannot configure MCP servers at repository level
- ⚠️ Some properties may behave differently
When creating agents for multiple environments, focus on common properties and test in all target environments. Use `target` property to create environment-specific agents when necessary.

View File

@@ -1,187 +0,0 @@
---
description: 'Best practices for Azure DevOps Pipeline YAML files'
applyTo: '**/azure-pipelines.yml, **/azure-pipelines*.yml, **/*.pipeline.yml'
---
# Azure DevOps Pipeline YAML Best Practices
Guidelines for creating maintainable, secure, and efficient Azure DevOps pipelines in PowerToys.
## General Guidelines
- Use YAML syntax consistently with proper indentation (2 spaces)
- Always include meaningful names and display names for pipelines, stages, jobs, and steps
- Implement proper error handling and conditional execution
- Use variables and parameters to make pipelines reusable and maintainable
- Follow the principle of least privilege for service connections and permissions
- Include comprehensive logging and diagnostics for troubleshooting
## Pipeline Structure
- Organize complex pipelines using stages for better visualization and control
- Use jobs to group related steps and enable parallel execution when possible
- Implement proper dependencies between stages and jobs
- Use templates for reusable pipeline components
- Keep pipeline files focused and modular - split large pipelines into multiple files
## Build Best Practices
- Use specific agent pool versions and VM images for consistency
- Cache dependencies (npm, NuGet, Maven, etc.) to improve build performance
- Implement proper artifact management with meaningful names and retention policies
- Use build variables for version numbers and build metadata
- Include code quality gates (lint checks, testing, security scans)
- Ensure builds are reproducible and environment-independent
## Testing Integration
- Run unit tests as part of the build process
- Publish test results in standard formats (JUnit, VSTest, etc.)
- Include code coverage reporting and quality gates
- Implement integration and end-to-end tests in appropriate stages
- Use test impact analysis when available to optimize test execution
- Fail fast on test failures to provide quick feedback
## Security Considerations
- Use Azure Key Vault for sensitive configuration and secrets
- Implement proper secret management with variable groups
- Use service connections with minimal required permissions
- Enable security scans (dependency vulnerabilities, static analysis)
- Implement approval gates for production deployments
- Use managed identities when possible instead of service principals
## Deployment Strategies
- Implement proper environment promotion (dev → staging → production)
- Use deployment jobs with proper environment targeting
- Implement blue-green or canary deployment strategies when appropriate
- Include rollback mechanisms and health checks
- Use infrastructure as code (ARM, Bicep, Terraform) for consistent deployments
- Implement proper configuration management per environment
## Variable and Parameter Management
- Use variable groups for shared configuration across pipelines
- Implement runtime parameters for flexible pipeline execution
- Use conditional variables based on branches or environments
- Secure sensitive variables and mark them as secrets
- Document variable purposes and expected values
- Use variable templates for complex variable logic
## Performance Optimization
- Use parallel jobs and matrix strategies when appropriate
- Implement proper caching strategies for dependencies and build outputs
- Use shallow clone for Git operations when full history isn't needed
- Optimize Docker image builds with multi-stage builds and layer caching
- Monitor pipeline performance and optimize bottlenecks
- Use pipeline resource triggers efficiently
## Monitoring and Observability
- Include comprehensive logging throughout the pipeline
- Use Azure Monitor and Application Insights for deployment tracking
- Implement proper notification strategies for failures and successes
- Include deployment health checks and automated rollback triggers
- Use pipeline analytics to identify improvement opportunities
- Document pipeline behavior and troubleshooting steps
## Template and Reusability
- Create pipeline templates for common patterns
- Use extends templates for complete pipeline inheritance
- Implement step templates for reusable task sequences
- Use variable templates for complex variable logic
- Version templates appropriately for stability
- Document template parameters and usage examples
## Branch and Trigger Strategy
- Implement appropriate triggers for different branch types
- Use path filters to trigger builds only when relevant files change
- Configure proper CI/CD triggers for main/master branches
- Use pull request triggers for code validation
- Implement scheduled triggers for maintenance tasks
- Consider resource triggers for multi-repository scenarios
## Example Structure
```yaml
# azure-pipelines.yml
trigger:
branches:
include:
- main
- develop
paths:
exclude:
- docs/*
- README.md
variables:
- group: shared-variables
- name: buildConfiguration
value: 'Release'
stages:
- stage: Build
displayName: 'Build and Test'
jobs:
- job: Build
displayName: 'Build Application'
pool:
vmImage: 'ubuntu-latest'
steps:
- task: UseDotNet@2
displayName: 'Use .NET SDK'
inputs:
version: '8.x'
- task: DotNetCoreCLI@2
displayName: 'Restore dependencies'
inputs:
command: 'restore'
projects: '**/*.csproj'
- task: DotNetCoreCLI@2
displayName: 'Build application'
inputs:
command: 'build'
projects: '**/*.csproj'
arguments: '--configuration $(buildConfiguration) --no-restore'
- stage: Deploy
displayName: 'Deploy to Staging'
dependsOn: Build
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- deployment: DeployToStaging
displayName: 'Deploy to Staging Environment'
environment: 'staging'
strategy:
runOnce:
deploy:
steps:
- download: current
displayName: 'Download drop artifact'
artifact: drop
- task: AzureWebApp@1
displayName: 'Deploy to Azure Web App'
inputs:
azureSubscription: 'staging-service-connection'
appType: 'webApp'
appName: 'myapp-staging'
package: '$(Pipeline.Workspace)/drop/**/*.zip'
```
## Common Anti-Patterns to Avoid
- Hardcoding sensitive values directly in YAML files
- Using overly broad triggers that cause unnecessary builds
- Mixing build and deployment logic in a single stage
- Not implementing proper error handling and cleanup
- Using deprecated task versions without upgrade plans
- Creating monolithic pipelines that are difficult to maintain
- Not using proper naming conventions for clarity
- Ignoring pipeline security best practices

View File

@@ -1,61 +0,0 @@
---
description: 'Guidelines for shared libraries including logging, IPC, settings, DPI, telemetry, and utilities consumed by multiple modules'
applyTo: 'src/common/**'
---
# Common Libraries Shared Code Guidance
Guidelines for modifying shared code in `src/common/`. Changes here can have wide-reaching impact across the entire PowerToys codebase.
## Scope
- Logging infrastructure (`src/common/logger/`)
- IPC primitives and named pipe utilities
- Settings serialization and management
- DPI awareness and scaling utilities
- Telemetry helpers
- General utilities (JSON parsing, string helpers, etc.)
## Guidelines
### API Stability
- Avoid breaking public headers/APIs; if changed, search & update all callers
- Coordinate ABI-impacting struct/class layout changes; keep binary compatibility
- When modifying public interfaces, grep the entire codebase for usages
### Performance
- Watch perf in hot paths (hooks, timers, serialization)
- Avoid avoidable allocations in frequently called code
- Profile changes that touch performance-sensitive areas
### Dependencies
- Ask before adding third-party deps or changing serialization formats
- New dependencies must be MIT-licensed or approved by PM team
- Add any new external packages to `NOTICE.md`
### Logging
- C++ logging uses spdlog (`Logger::info`, `Logger::warn`, `Logger::error`, `Logger::debug`)
- Initialize with `init_logger()` early in startup
- Keep hot paths quiet no logging in tight loops or hooks
## Acceptance Criteria
- No unintended ABI breaks
- No noisy logs in hot paths
- New non-obvious symbols briefly commented
- All callers updated when interfaces change
## Code Style
- **C++**: Follow `.clang-format` in `src/`; use Modern C++ patterns per C++ Core Guidelines
- **C#**: Follow `src/.editorconfig`; enforce StyleCop.Analyzers
## Validation
- Build: `tools\build\build.cmd` from `src/common/` folder
- Verify no ABI breaks: grep for changed function/struct names across codebase
- Check logs: ensure no new logging in performance-critical paths

View File

@@ -1,256 +0,0 @@
---
description: 'Guidelines for creating high-quality custom instruction files for GitHub Copilot'
applyTo: '**/*.instructions.md'
---
# Custom Instructions File Guidelines
Instructions for creating effective and maintainable custom instruction files that guide GitHub Copilot in generating domain-specific code and following project conventions.
## Project Context
- Target audience: Developers and GitHub Copilot working with domain-specific code
- File format: Markdown with YAML frontmatter
- File naming convention: lowercase with hyphens (e.g., `react-best-practices.instructions.md`)
- Location: `.github/instructions/` directory
- Purpose: Provide context-aware guidance for code generation, review, and documentation
## Required Frontmatter
Every instruction file must include YAML frontmatter with the following fields:
```yaml
---
description: 'Brief description of the instruction purpose and scope'
applyTo: 'glob pattern for target files (e.g., **/*.ts, **/*.py)'
---
```
### Frontmatter Guidelines
- **description**: Single-quoted string, 1-500 characters, clearly stating the purpose
- **applyTo**: Glob pattern(s) specifying which files these instructions apply to
- Single pattern: `'**/*.ts'`
- Multiple patterns: `'**/*.ts, **/*.tsx, **/*.js'`
- Specific files: `'src/**/*.py'`
- All files: `'**'`
## File Structure
A well-structured instruction file should include the following sections:
### 1. Title and Overview
- Clear, descriptive title using `#` heading
- Brief introduction explaining the purpose and scope
- Optional: Project context section with key technologies and versions
### 2. Core Sections
Organize content into logical sections based on the domain:
- **General Instructions**: High-level guidelines and principles
- **Best Practices**: Recommended patterns and approaches
- **Code Standards**: Naming conventions, formatting, style rules
- **Architecture/Structure**: Project organization and design patterns
- **Common Patterns**: Frequently used implementations
- **Security**: Security considerations (if applicable)
- **Performance**: Optimization guidelines (if applicable)
- **Testing**: Testing standards and approaches (if applicable)
### 3. Examples and Code Snippets
Provide concrete examples with clear labels:
```markdown
### Good Example
\`\`\`language
// Recommended approach
code example here
\`\`\`
### Bad Example
\`\`\`language
// Avoid this pattern
code example here
\`\`\`
```
### 4. Validation and Verification (Optional but Recommended)
- Build commands to verify code
- Lint checks and formatting tools
- Testing requirements
- Verification steps
## Content Guidelines
### Writing Style
- Use clear, concise language
- Write in imperative mood ("Use", "Implement", "Avoid")
- Be specific and actionable
- Avoid ambiguous terms like "should", "might", "possibly"
- Use bullet points and lists for readability
- Keep sections focused and scannable
### Best Practices
- **Be Specific**: Provide concrete examples rather than abstract concepts
- **Show Why**: Explain the reasoning behind recommendations when it adds value
- **Use Tables**: For comparing options, listing rules, or showing patterns
- **Include Examples**: Real code snippets are more effective than descriptions
- **Stay Current**: Reference current versions and best practices
- **Link Resources**: Include official documentation and authoritative sources
### Common Patterns to Include
1. **Naming Conventions**: How to name variables, functions, classes, files
2. **Code Organization**: File structure, module organization, import order
3. **Error Handling**: Preferred error handling patterns
4. **Dependencies**: How to manage and document dependencies
5. **Comments and Documentation**: When and how to document code
6. **Version Information**: Target language/framework versions
## Patterns to Follow
### Bullet Points and Lists
```markdown
## Security Best Practices
- Always validate user input before processing
- Use parameterized queries to prevent SQL injection
- Store secrets in environment variables, never in code
- Implement proper authentication and authorization
- Enable HTTPS for all production endpoints
```
### Tables for Structured Information
```markdown
## Common Issues
| Issue | Solution | Example |
| ---------------- | ------------------- | ----------------------------- |
| Magic numbers | Use named constants | `const MAX_RETRIES = 3` |
| Deep nesting | Extract functions | Refactor nested if statements |
| Hardcoded values | Use configuration | Store API URLs in config |
```
### Code Comparison
```markdown
### Good Example - Using TypeScript interfaces
\`\`\`typescript
interface User {
id: string;
name: string;
email: string;
}
function getUser(id: string): User {
// Implementation
}
\`\`\`
### Bad Example - Using any type
\`\`\`typescript
function getUser(id: any): any {
// Loses type safety
}
\`\`\`
```
### Conditional Guidance
```markdown
## Framework Selection
- **For small projects**: Use Minimal API approach
- **For large projects**: Use controller-based architecture with clear separation
- **For microservices**: Consider domain-driven design patterns
```
## Patterns to Avoid
- **Overly verbose explanations**: Keep it concise and scannable
- **Outdated information**: Always reference current versions and practices
- **Ambiguous guidelines**: Be specific about what to do or avoid
- **Missing examples**: Abstract rules without concrete code examples
- **Contradictory advice**: Ensure consistency throughout the file
- **Copy-paste from documentation**: Add value by distilling and providing context
## Testing Your Instructions
Before finalizing instruction files:
1. **Test with Copilot**: Try the instructions with actual prompts in VS Code
2. **Verify Examples**: Ensure code examples are correct and run without errors
3. **Check Glob Patterns**: Confirm `applyTo` patterns match intended files
## Example Structure
Here's a minimal example structure for a new instruction file:
```markdown
---
description: 'Brief description of purpose'
applyTo: '**/*.ext'
---
# Technology Name Development
Brief introduction and context.
## General Instructions
- High-level guideline 1
- High-level guideline 2
## Best Practices
- Specific practice 1
- Specific practice 2
## Code Standards
### Naming Conventions
- Rule 1
- Rule 2
### File Organization
- Structure 1
- Structure 2
## Common Patterns
### Pattern 1
Description and example
\`\`\`language
code example
\`\`\`
### Pattern 2
Description and example
## Validation
- Build command: `command to verify`
- Lint checks: `command to lint`
- Testing: `command to test`
```
## Maintenance
- Review instructions when dependencies or frameworks are updated
- Update examples to reflect current best practices
- Remove outdated patterns or deprecated features
- Add new patterns as they emerge in the community
- Keep glob patterns accurate as project structure evolves
## Additional Resources
- [Custom Instructions Documentation](https://code.visualstudio.com/docs/copilot/customization/custom-instructions)
- [Awesome Copilot Instructions](https://github.com/github/awesome-copilot/tree/main/instructions)

View File

@@ -1,88 +0,0 @@
---
description: 'Guidelines for creating high-quality prompt files for GitHub Copilot'
applyTo: '**/*.prompt.md'
---
# Copilot Prompt Files Guidelines
Instructions for creating effective and maintainable prompt files that guide GitHub Copilot in delivering consistent, high-quality outcomes across any repository.
## Scope and Principles
- Target audience: maintainers and contributors authoring reusable prompts for Copilot Chat.
- Goals: predictable behaviour, clear expectations, minimal permissions, and portability across repositories.
- Primary references: VS Code documentation on prompt files and organization-specific conventions.
## Frontmatter Requirements
Every prompt file should include YAML frontmatter with the following fields:
### Required/Recommended Fields
| Field | Required | Description |
|-------|----------|-------------|
| `description` | Recommended | A short description of the prompt (single sentence, actionable outcome) |
| `name` | Optional | The name shown after typing `/` in chat. Defaults to filename if not specified |
| `agent` | Recommended | The agent to use: `ask`, `edit`, `agent`, or a custom agent name. Defaults to current agent |
| `model` | Optional | The language model to use. Defaults to currently selected model |
| `tools` | Optional | List of tool/tool set names available for this prompt |
| `argument-hint` | Optional | Hint text shown in chat input to guide user interaction |
### Guidelines
- Use consistent quoting (single quotes recommended) and keep one field per line for readability and version control clarity
- If `tools` are specified and current agent is `ask` or `edit`, the default agent becomes `agent`
- Preserve any additional metadata (`language`, `tags`, `visibility`, etc.) required by your organization
## File Naming and Placement
- Use kebab-case filenames ending with `.prompt.md` and store them under `.github/prompts/` unless your workspace standard specifies another directory.
- Provide a short filename that communicates the action (for example, `generate-readme.prompt.md` rather than `prompt1.prompt.md`).
## Body Structure
- Start with an `#` level heading that matches the prompt intent so it surfaces well in Quick Pick search.
- Organize content with predictable sections. Recommended baseline: `Mission` or `Primary Directive`, `Scope & Preconditions`, `Inputs`, `Workflow` (step-by-step), `Output Expectations`, and `Quality Assurance`.
- Adjust section names to fit the domain, but retain the logical flow: why → context → inputs → actions → outputs → validation.
- Reference related prompts or instruction files using relative links to aid discoverability.
## Input and Context Handling
- Use `${input:variableName[:placeholder]}` for required values and explain when the user must supply them. Provide defaults or alternatives where possible.
- Call out contextual variables such as `${selection}`, `${file}`, `${workspaceFolder}` only when they are essential, and describe how Copilot should interpret them.
- Document how to proceed when mandatory context is missing (for example, “Request the file path and stop if it remains undefined”).
## Tool and Permission Guidance
- Limit `tools` to the smallest set that enables the task. List them in the preferred execution order when the sequence matters.
- If the prompt inherits tools from a chat mode, mention that relationship and state any critical tool behaviours or side effects.
- Warn about destructive operations (file creation, edits, terminal commands) and include guard rails or confirmation steps in the workflow.
## Instruction Tone and Style
- Write in direct, imperative sentences targeted at Copilot (for example, “Analyze”, “Generate”, “Summarize”).
- Keep sentences short and unambiguous, following Google Developer Documentation translation best practices to support localization.
- Avoid idioms, humor, or culturally specific references; favor neutral, inclusive language.
## Output Definition
- Specify the format, structure, and location of expected results (for example, “Create an architecture decision record file using the template below, such as `docs/architecture-decisions/record-XXXX.md`).
- Include success criteria and failure triggers so Copilot knows when to halt or retry.
- Provide validation steps—manual checks, automated commands, or acceptance criteria lists—that reviewers can execute after running the prompt.
## Examples and Reusable Assets
- Embed Good/Bad examples or scaffolds (Markdown templates, JSON stubs) that the prompt should produce or follow.
- Maintain reference tables (capabilities, status codes, role descriptions) inline to keep the prompt self-contained. Update these tables when upstream resources change.
- Link to authoritative documentation instead of duplicating lengthy guidance.
## Quality Assurance Checklist
- [ ] Frontmatter fields are complete, accurate, and least-privilege.
- [ ] Inputs include placeholders, default behaviours, and fallbacks.
- [ ] Workflow covers preparation, execution, and post-processing without gaps.
- [ ] Output expectations include formatting and storage details.
- [ ] Validation steps are actionable (commands, diff checks, review prompts).
- [ ] Security, compliance, and privacy policies referenced by the prompt are current.
- [ ] Prompt executes successfully in VS Code (`Chat: Run Prompt`) using representative scenarios.
## Maintenance Guidance
- Version-control prompts alongside the code they affect; update them when dependencies, tooling, or review processes change.
- Review prompts periodically to ensure tool lists, model requirements, and linked documents remain valid.
- Coordinate with other repositories: when a prompt proves broadly useful, extract common guidance into instruction files or shared prompt packs.
## Additional Resources
- [Prompt Files Documentation](https://code.visualstudio.com/docs/copilot/customization/prompt-files#_prompt-file-format)
- [Awesome Copilot Prompt Files](https://github.com/github/awesome-copilot/tree/main/prompts)
- [Tool Configuration](https://code.visualstudio.com/docs/copilot/chat/chat-agent-mode#_agent-mode-tools)

View File

@@ -1,68 +0,0 @@
---
description: 'Guidelines for Runner and Settings UI components that communicate via named pipes and manage module lifecycle'
applyTo: 'src/runner/**,src/settings-ui/**'
---
# Runner & Settings UI Core Components Guidance
Guidelines for modifying the Runner (tray/module loader) and Settings UI (configuration app). These components communicate via Windows Named Pipes using JSON messages.
## Runner (`src/runner/`)
### Scope
- Module bootstrap, hotkey management, settings bridge, update/elevation handling
### Guidelines
- If IPC/JSON contracts change, mirror updates in `src/settings-ui/**`
- Keep module discovery in `src/runner/main.cpp` in sync when adding/removing modules
- Keep startup lean: avoid blocking/network calls in early init path
- Preserve GPO & elevation behaviors; confirm no regression in policy handling
- Ask before modifying update workflow or elevation logic
### Acceptance Criteria
- Stable startup, consistent contracts, no unnecessary logging noise
## Settings UI (`src/settings-ui/`)
### Scope
- WinUI/WPF UI, communicates with Runner over named pipes; manages persisted settings schema
### Guidelines
- Don't break settings schema silently; add migration when shape changes
- If IPC/JSON contracts change, align with `src/runner/**` implementation
- Keep UI responsive: marshal to UI thread for UI-bound operations
- Reuse existing styles/resources; avoid duplicate theme keys
- Add/adjust migration or serialization tests when changing persisted settings
### Acceptance Criteria
- Schema integrity preserved, responsive UI, consistent contracts, no style duplication
## Shared Concerns
### IPC Contract Changes
When modifying the JSON message format between Runner and Settings UI:
1. Update both `src/runner/` and `src/settings-ui/` in the same PR
2. Preserve backward compatibility where possible
3. Add migration logic for settings schema changes
4. Test both directions of communication
### Code Style
- **C++ (Runner)**: Follow `.clang-format` in `src/`
- **C# (Settings UI)**: Follow `src/.editorconfig`, use StyleCop.Analyzers
- **XAML**: Use XamlStyler or run `.\.pipelines\applyXamlStyling.ps1 -Main`
## Validation
- Build Runner: `tools\build\build.cmd` from `src/runner/`
- Build Settings UI: `tools\build\build.cmd` from `src/settings-ui/`
- Test IPC: Launch both Runner and Settings UI, verify communication works
- Schema changes: Run serialization tests if settings shape changed

View File

@@ -1,228 +0,0 @@
---
description: 'Instructions for building Model Context Protocol (MCP) servers using the TypeScript SDK'
applyTo: '**/*.ts, **/*.js, **/package.json'
---
# TypeScript MCP Server Development
## Instructions
- Use the **@modelcontextprotocol/sdk** npm package: `npm install @modelcontextprotocol/sdk`
- Import from specific paths: `@modelcontextprotocol/sdk/server/mcp.js`, `@modelcontextprotocol/sdk/server/stdio.js`, etc.
- Use `McpServer` class for high-level server implementation with automatic protocol handling
- Use `Server` class for low-level control with manual request handlers
- Use **zod** for input/output schema validation: `npm install zod@3`
- Always provide `title` field for tools, resources, and prompts for better UI display
- Use `registerTool()`, `registerResource()`, and `registerPrompt()` methods (recommended over older APIs)
- Define schemas using zod: `{ inputSchema: { param: z.string() }, outputSchema: { result: z.string() } }`
- Return both `content` (for display) and `structuredContent` (for structured data) from tools
- For HTTP servers, use `StreamableHTTPServerTransport` with Express or similar frameworks
- For local integrations, use `StdioServerTransport` for stdio-based communication
- Create new transport instances per request to prevent request ID collisions (stateless mode)
- Use session management with `sessionIdGenerator` for stateful servers
- Enable DNS rebinding protection for local servers: `enableDnsRebindingProtection: true`
- Configure CORS headers and expose `Mcp-Session-Id` for browser-based clients
- Use `ResourceTemplate` for dynamic resources with URI parameters: `new ResourceTemplate('resource://{param}', { list: undefined })`
- Support completions for better UX using `completable()` wrapper from `@modelcontextprotocol/sdk/server/completable.js`
- Implement sampling with `server.server.createMessage()` to request LLM completions from clients
- Use `server.server.elicitInput()` to request additional user input during tool execution
- Enable notification debouncing for bulk updates: `debouncedNotificationMethods: ['notifications/tools/list_changed']`
- Dynamic updates: call `.enable()`, `.disable()`, `.update()`, or `.remove()` on registered items to emit `listChanged` notifications
- Use `getDisplayName()` from `@modelcontextprotocol/sdk/shared/metadataUtils.js` for UI display names
- Test servers with MCP Inspector: `npx @modelcontextprotocol/inspector`
## Best Practices
- Keep tool implementations focused on single responsibilities
- Provide clear, descriptive titles and descriptions for LLM understanding
- Use proper TypeScript types for all parameters and return values
- Implement comprehensive error handling with try-catch blocks
- Return `isError: true` in tool results for error conditions
- Use async/await for all asynchronous operations
- Close database connections and clean up resources properly
- Validate input parameters before processing
- Use structured logging for debugging without polluting stdout/stderr
- Consider security implications when exposing file system or network access
- Implement proper resource cleanup on transport close events
- Use environment variables for configuration (ports, API keys, etc.)
- Document tool capabilities and limitations clearly
- Test with multiple clients to ensure compatibility
## Common Patterns
### Basic Server Setup (HTTP)
```typescript
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
import express from 'express';
const server = new McpServer({
name: 'my-server',
version: '1.0.0'
});
const app = express();
app.use(express.json());
app.post('/mcp', async (req, res) => {
const transport = new StreamableHTTPServerTransport({
sessionIdGenerator: undefined,
enableJsonResponse: true
});
res.on('close', () => transport.close());
await server.connect(transport);
await transport.handleRequest(req, res, req.body);
});
app.listen(3000);
```
### Basic Server Setup (stdio)
```typescript
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new McpServer({
name: 'my-server',
version: '1.0.0'
});
// ... register tools, resources, prompts ...
const transport = new StdioServerTransport();
await server.connect(transport);
```
### Simple Tool
```typescript
import { z } from 'zod';
server.registerTool(
'calculate',
{
title: 'Calculator',
description: 'Perform basic calculations',
inputSchema: { a: z.number(), b: z.number(), op: z.enum(['+', '-', '*', '/']) },
outputSchema: { result: z.number() }
},
async ({ a, b, op }) => {
const result = op === '+' ? a + b : op === '-' ? a - b :
op === '*' ? a * b : a / b;
const output = { result };
return {
content: [{ type: 'text', text: JSON.stringify(output) }],
structuredContent: output
};
}
);
```
### Dynamic Resource
```typescript
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
server.registerResource(
'user',
new ResourceTemplate('users://{userId}', { list: undefined }),
{
title: 'User Profile',
description: 'Fetch user profile data'
},
async (uri, { userId }) => ({
contents: [{
uri: uri.href,
text: `User ${userId} data here`
}]
})
);
```
### Tool with Sampling
```typescript
server.registerTool(
'summarize',
{
title: 'Text Summarizer',
description: 'Summarize text using LLM',
inputSchema: { text: z.string() },
outputSchema: { summary: z.string() }
},
async ({ text }) => {
const response = await server.server.createMessage({
messages: [{
role: 'user',
content: { type: 'text', text: `Summarize: ${text}` }
}],
maxTokens: 500
});
const summary = response.content.type === 'text' ?
response.content.text : 'Unable to summarize';
const output = { summary };
return {
content: [{ type: 'text', text: JSON.stringify(output) }],
structuredContent: output
};
}
);
```
### Prompt with Completion
```typescript
import { completable } from '@modelcontextprotocol/sdk/server/completable.js';
server.registerPrompt(
'review',
{
title: 'Code Review',
description: 'Review code with specific focus',
argsSchema: {
language: completable(z.string(), value =>
['typescript', 'python', 'javascript', 'java']
.filter(l => l.startsWith(value))
),
code: z.string()
}
},
({ language, code }) => ({
messages: [{
role: 'user',
content: {
type: 'text',
text: `Review this ${language} code:\n\n${code}`
}
}]
})
);
```
### Error Handling
```typescript
server.registerTool(
'risky-operation',
{
title: 'Risky Operation',
description: 'An operation that might fail',
inputSchema: { input: z.string() },
outputSchema: { result: z.string() }
},
async ({ input }) => {
try {
const result = await performRiskyOperation(input);
const output = { result };
return {
content: [{ type: 'text', text: JSON.stringify(output) }],
structuredContent: output
};
} catch (err: unknown) {
const error = err as Error;
return {
content: [{ type: 'text', text: `Error: ${error.message}` }],
isError: true
};
}
}
);
```

View File

@@ -1,49 +0,0 @@
---
agent: 'agent'
description: 'Generate an 80-character git commit title for the local diff'
---
# Generate Commit Title
## Purpose
Provide a single-line, ready-to-paste git commit title (<= 80 characters) that reflects the most important local changes since `HEAD`.
## Input to collect
- Run exactly one command to view the local diff:
```@terminal
git diff HEAD
```
## How to decide the title
1. From the diff, find the dominant area (e.g., `src/modules/*`, `doc/devdocs/**`) and the change type (bug fix, docs update, config tweak).
2. Draft an imperative, plain-ASCII title that:
- Mentions the primary component when obvious (e.g., `FancyZones:` or `Docs:`)
- Stays within 80 characters and has no trailing punctuation
## Final output
- Reply with only the commit title on a single line—no extra text.
## PR title convention (when asked)
Use Conventional Commits style:
`<type>(<scope>): <summary>`
**Allowed types**
- feat, fix, docs, refactor, perf, test, build, ci, chore
**Scope rules**
- Use a short, PowerToys-focused scope (one word preferred). Common scopes:
- Core: `runner`, `settings-ui`, `common`, `docs`, `build`, `ci`, `installer`, `gpo`, `dsc`
- Modules: `fancyzones`, `powerrename`, `awake`, `colorpicker`, `imageresizer`, `keyboardmanager`, `mouseutils`, `peek`, `hosts`, `file-locksmith`, `screen-ruler`, `text-extractor`, `cropandlock`, `paste`, `powerlauncher`
- If unclear, pick the closest module or subsystem; omit only if unavoidable
**Summary rules**
- Imperative, present tense (“add”, “update”, “remove”, “fix”)
- Keep it <= 72 characters when possible; be specific, avoid “misc changes”
**Examples**
- `feat(fancyzones): add canvas template duplication`
- `fix(mouseutils): guard crosshair toggle when dpi info missing`
- `docs(runner): document tray icon states`
- `build(installer): align wix v5 suffix flag`
- `ci(ci): cache pipeline artifacts for x64`

View File

@@ -1,24 +0,0 @@
---
agent: 'agent'
description: 'Generate a PowerToys-ready pull request description from the local diff'
---
# Generate PR Summary
**Goal:** Produce a ready-to-paste PR title and description that follows PowerToys conventions by comparing the current branch against a user-selected target branch.
**Repo guardrails:**
- Treat `.github/pull_request_template.md` as the single source of truth; load it at runtime instead of embedding hardcoded content in this prompt.
- Preserve section order from the template but only surface checklist lines that are relevant for the detected changes, filling them with `[x]`/`[ ]` as appropriate.
- Cite touched paths with inline backticks, matching the guidance in `.github/copilot-instructions.md`.
- Call out test coverage explicitly: list automated tests run (unit/UI) or state why they are not applicable.
**Workflow:**
1. Determine the target branch from user context; default to `main` when no branch is supplied.
2. Run `git status --short` once to surface uncommitted files that may influence the summary.
3. Run `git diff <target-branch>...HEAD` a single time to review the detailed changes. Only when confidence stays low dig deeper with focused calls such as `git diff <target-branch>...HEAD -- <path>`.
4. From the diff, capture impacted areas, key file changes, behavioral risks, migrations, and noteworthy edge cases.
5. Confirm validation: list tests executed with results or state why tests were skipped in line with repo guidance.
6. Load `.github/pull_request_template.md`, mirror its section order, and populate it with the gathered facts. Include only relevant checklist entries, marking them `[x]/[ ]` and noting any intentional omissions as "N/A".
7. Present the filled template inside a fenced ```markdown code block with no extra commentary so it is ready to paste into a PR, clearly flagging any placeholders that still need user input.
8. Prepend the PR title above the filled template, applying the Conventional Commit type/scope rules from `.github/prompts/create-commit-title.prompt.md`; pick the dominant component from the diff and keep the title concise and imperative.

View File

@@ -1,72 +0,0 @@
---
agent: 'agent'
description: 'Execute the fix for a GitHub issue using the previously generated implementation plan'
---
# Fix GitHub Issue
## Dependencies
Source review prompt (for generating the implementation plan if missing):
- .github/prompts/review-issue.prompt.md
Required plan file (single source of truth):
- Generated Files/issueReview/{{issue_number}}/implementation-plan.md
## Dependency Handling
1) If `implementation-plan.md` exists → proceed.
2) If missing → run the review prompt:
- Invoke: `.github/prompts/review-issue.prompt.md`
- Pass: `issue_number={{issue_number}}`
- Then re-check for `implementation-plan.md`.
3) If still missing → stop and generate:
- `Generated Files/issueFix/{{issue_number}}/manual-steps.md` containing:
“implementation-plan.md not found; please run .github/prompts/review-issue.prompt.md for #{{issue_number}}.”
# GOAL
For **#{{issue_number}}**:
- Use implementation-plan.md as the single authority.
- Apply code and test changes directly in the repository.
- Produce a PR-ready description.
# OUTPUT FILES
1) Generated Files/issueFix/{{issue_number}}/pr-description.md
2) Generated Files/issueFix/{{issue_number}}/manual-steps.md # only if human interaction or external setup is required
# EXECUTION RULES
1) Read implementation-plan.md and execute:
- Layers & Files → edit/create as listed
- Pattern Choices → follow repository conventions
- Fundamentals (perf, security, compatibility, accessibility)
- Logging & Exceptions
- Telemetry (only if explicitly included in the plan)
- Risks & Mitigations
- Tests to Add
2) Locate affected files via `rg` or `git grep`.
3) Add/update tests to enforce the fixed behavior.
4) If any ambiguity exists, add:
// TODO(Human input needed): <clarification needed>
5) Verify locally: build & tests run successfully.
# pr-description.md should include:
- Title: `Fix: <short summary> (#{{issue_number}})`
- What changed and why the fix works
- Files or modules touched
- Risks & mitigations (implemented)
- Tests added/updated and how to run them
- Telemetry behavior (if applicable)
- Validation / reproduction steps
- `Closes #{{issue_number}}`
# manual-steps.md (only if needed)
- List required human actions: secrets, config, approvals, missing info, or code comments requiring human decisions.
# IMPORTANT
- Apply code and tests directly; do not produce patch files.
- Follow implementation-plan.md as the source of truth.
- Insert comments for human review where a decision or input is required.
- Use repository conventions and deterministic, minimal changes.
# FINALIZE
- Write pr-description.md
- Write manual-steps.md only if needed
- Print concise success message or note items requiring human interaction

View File

@@ -1,70 +0,0 @@
---
description: 'Fix active pull request comments with scoped changes'
name: 'fix-pr-active-comments'
agent: 'agent'
argument-hint: 'PR number or active PR URL'
---
# Fix Active PR Comments
## Mission
Resolve active pull request comments by applying only simple fixes. For complex refactors, write a plan instead of changing code.
## Scope & Preconditions
- You must have an active pull request context or a provided PR number.
- Only implement simple changes. Do not implement large refactors.
- If required context is missing, request it and stop.
## Inputs
- Required: ${input:pr_number:PR number or URL}
- Optional: ${input:comment_scope:files or areas to focus on}
- Optional: ${input:fixing_guidelines:additional fixing guidelines from the user}
## Workflow
1. Locate all active (unresolved) PR review comments for the given PR.
2. For each comment, classify the change scope:
- Simple change: limited edits, localized fix, low risk, no broad redesign.
- Large refactor: multi-file redesign, architecture change, or risky behavior change.
3. For each large refactor request:
- Do not modify code.
- Write a planning document to Generated Files/prReview/${input:pr_number}/fixPlan/.
4. For each simple change request:
- Implement the fix with minimal edits.
- Run quick checks if needed.
- Commit and push the change.
5. For comments that seem invalid, unclear, or not applicable (even if simple):
- Do not change code.
- Add the item to a summary table in Generated Files/prReview/${input:pr_number}/fixPlan/overview.md.
- Consult back to the end user in a friendly, polite tone.
6. Respond to each comment that you fixed:
- Reply in the active conversation.
- Use a polite or friendly tone.
- Keep the response under 200 words.
- Resolve the comment after replying.
## Output Expectations
- Simple fixes: code changes committed and pushed.
- Large refactors: a plan file saved to Generated Files/prReview/${input:pr_number}/fixPlan/.
- Invalid or unclear comments: captured in Generated Files/prReview/${input:pr_number}/fixPlan/overview.md.
- Each fixed comment has a reply under 200 words and is resolved.
## Plan File Template
Use this template for each large refactor item:
# Fix Plan: <short title>
## Context
- Comment link:
- Impacted areas:
## Overview Table Template
Use this table in Generated Files/prReview/${input:pr_number}/fixPlan/overview.md:
| Comment link | Summary | Reason not applied | Suggested follow-up |
| --- | --- | --- | --- |
| | | | |
## Quality Assurance
- Verify plan file path exists.
- Ensure no code changes were made for large refactor items.
- Confirm replies are under 200 words and comments are resolved.

View File

@@ -1,24 +0,0 @@
---
agent: 'agent'
description: 'Resolve Code scanning / check-spelling comments on the active PR'
---
# Fix Spelling Comments
**Goal:** Clear every outstanding GitHub pull request comment created by the `Code scanning / check-spelling` workflow by explicitly allowing intentional terms.
**Guardrails:**
- Update only discussion threads authored by `github-actions` or `github-actions[bot]` that mention `Code scanning results / check-spelling`.
- Prefer improving the wording in the originally flagged file when it clarifies intent without changing meaning; if the wording is already clear/standard for the context, handle it via `.github/actions/spell-check/expect.txt` and reuse existing entries.
- Limit edits to the flagged text and `.github/actions/spell-check/expect.txt`; leave all other files and topics untouched.
**Prerequisites:**
- Install GitHub CLI if it is not present: `winget install GitHub.cli`.
- Run `gh auth login` once before the first CLI use.
**Workflow:**
1. Determine the active pull request with a single `gh pr view --json number` call (default to the current branch).
2. Fetch all PR discussion data once via `gh pr view --json comments,reviews` and filter to check-spelling comments authored by `github-actions` or `github-actions[bot]` that are not minimized; when several remain, process only the most recent comment body.
3. For each flagged token, first consider tightening or rephrasing the original text to avoid the false positive while keeping the meaning intact; if the existing wording is already normal and professional for the context, proceed to allowlisting instead of changing it.
4. When allowlisting, review `.github/actions/spell-check/expect.txt` for an equivalent term (for example an existing lowercase variant); when found, reuse that normalized term rather than adding a new entry, even if the flagged token differs only by casing. Only add a new entry after confirming no equivalent already exists.
5. Add any remaining missing token to `.github/actions/spell-check/expect.txt`, keeping surrounding formatting intact.

View File

@@ -1,165 +0,0 @@
---
agent: 'agent'
description: 'Review a GitHub issue, score it (0-100), and generate an implementation plan'
---
# Review GitHub Issue
## Goal
For **#{{issue_number}}** produce:
1) `Generated Files/issueReview/{{issue_number}}/overview.md`
2) `Generated Files/issueReview/{{issue_number}}/implementation-plan.md`
## Inputs
Figure out required inputs {{issue_number}} from the invocation context; if anything is missing, ask for the value or note it as a gap.
# CONTEXT (brief)
Ground evidence using `gh issue view {{issue_number}} --json number,title,body,author,createdAt,updatedAt,state,labels,milestone,reactions,comments,linkedPullRequests`, download images via MCP `github_issue_images` to better understand the issue context. Finally, use MCP `github_issue_attachments` to download logs with parameter `extractFolder` as `Generated Files/issueReview/{{issue_number}}/logs`, and analyze the downloaded logs if available to identify relevant issues. Locate the source code in the current workspace (use `rg`/`git grep` as needed). Link related issues and PRs.
## When to call MCP tools
If the following MCP "github-artifacts" tools are available in the environment, use them:
- `github_issue_images`: use when the issue/PR likely contains screenshots or other visual evidence (UI bugs, glitches, design problems).
- `github_issue_attachments`: use when the issue/PR mentions attached ZIPs (PowerToysReport_*.zip, logs.zip, debug.zip) or asks to analyze logs/diagnostics. Always provide `extractFolder` as `Generated Files/issueReview/{{issue_number}}/logs`
If these tools are not available (not listed by the runtime), start the MCP server "github-artifacts" first.
# OVERVIEW.MD
## Summary
Issue, state, milestone, labels. **Signals**: 👍/❤️/👎, comment count, last activity, linked PRs.
## At-a-Glance Score Table
Present all ratings in a compact table for quick scanning:
| Dimension | Score | Assessment | Key Drivers |
|-----------|-------|------------|-------------|
| **A) Business Importance** | X/100 | Low/Medium/High | Top 2 factors with scores |
| **B) Community Excitement** | X/100 | Low/Medium/High | Top 2 factors with scores |
| **C) Technical Feasibility** | X/100 | Low/Medium/High | Top 2 factors with scores |
| **D) Requirement Clarity** | X/100 | Low/Medium/High | Top 2 factors with scores |
| **Overall Priority** | X/100 | Low/Medium/High/Critical | Average or weighted summary |
| **Effort Estimate** | X days (T-shirt) | XS/S/M/L/XL/XXL/Epic | Type: bug/feature/chore |
| **Similar Issues Found** | X open, Y closed | — | Quick reference to related work |
| **Potential Assignees** | @username, @username | — | Top contributors to module |
**Assessment bands**: 0-25 Low, 26-50 Medium, 51-75 High, 76-100 Critical
## Ratings (0100) — add evidence & short rationale
### A) Business Importance
- Labels (priority/security/regression): **≤35**
- Milestone/roadmap: **≤25**
- Customer/contract impact: **≤20**
- Unblocks/platform leverage: **≤20**
### B) Community Excitement
- 👍+❤️ normalized: **≤45**
- Comment volume & unique participants: **≤25**
- Recent activity (≤30d): **≤15**
- Duplicates/related issues: **≤15**
### C) Technical Feasibility
- Contained surface/clear seams: **≤30**
- Existing patterns/utilities: **≤25**
- Risk (perf/sec/compat) manageable: **≤25**
- Testability & CI support: **≤20**
### D) Requirement Clarity
- Behavior/repro/constraints: **≤60**
- Non-functionals (perf/sec/i18n/a11y): **≤25**
- Decision owners/acceptance signals: **≤15**
## Effort
Days + **T-shirt** (XS 0.51d, S 12, M 24, L 47, XL 714, XXL 1430, Epic >30).
Type/level: bug/feature/chore/docs/refactor/test-only; severity/value tier.
## Suggested Actions
Provide actionable recommendations for issue triage and assignment:
### A) Requirement Clarification (if Clarity score <50)
**When Requirement Clarity (Dimension D) is Medium or Low:**
- Identify specific gaps in issue description: missing repro steps, unclear expected behavior, undefined acceptance criteria, missing non-functional requirements
- Draft 3-5 clarifying questions to post as issue comment
- Suggest additional information needed: screenshots, logs, environment details, OS version, PowerToys version, error messages
- If behavior is ambiguous, propose 2-3 interpretation scenarios and ask reporter to confirm
- Example questions:
- "Can you provide exact steps to reproduce this issue?"
- "What is the expected behavior vs. what you're actually seeing?"
- "Does this happen on Windows 10, 11, or both?"
- "Can you attach a screenshot or screen recording?"
### B) Correct Label Suggestions
- Analyze issue type, module, and severity to suggest missing or incorrect labels
- Recommend labels from: `Issue-Bug`, `Issue-Feature`, `Issue-Docs`, `Issue-Task`, `Priority-High`, `Priority-Medium`, `Priority-Low`, `Needs-Triage`, `Needs-Author-Feedback`, `Product-<ModuleName>`, etc.
- If Requirement Clarity is low (<50), add `Needs-Author-Feedback` label
- If current labels are incorrect or incomplete, provide specific label changes with rationale
### C) Find Similar Issues & Past Fixes
- Search for similar issues using `gh issue list --search "keywords" --state all --json number,title,state,closedAt`
- Identify patterns: duplicate issues, related bugs, or similar feature requests
- For closed issues, find linked PRs that fixed them: check `linkedPullRequests` in issue data
- Provide 3-5 examples of similar issues with format: `#<number> - <title> (closed by PR #<pr>)` or `(still open)`
### D) Identify Subject Matter Experts
- Use git blame/log to find who fixed similar issues in the past
- Search for PR authors who touched relevant files: `git log --all --format='%aN' -- <file_paths> | sort | uniq -c | sort -rn | head -5`
- Check issue/PR history for frequent contributors to the affected module
- Suggest 2-3 potential assignees with context: `@<username> - <reason>` (e.g., "fixed similar rendering bug in #12345", "maintains FancyZones module")
### E) Semantic Search for Related Work
- Use semantic_search tool to find similar issues, code patterns, or past discussions
- Search queries should include: issue keywords, module names, error messages, feature descriptions
- Cross-reference semantic results with GitHub issue search for comprehensive coverage
**Output format for Suggested Actions section in overview.md:**
```markdown
## Suggested Actions
### Clarifying Questions (if Clarity <50)
Post these questions as issue comment to gather missing information:
1. <question>
2. <question>
3. <question>
**Recommended label**: `Needs-Author-Feedback`
### Label Recommendations
- Add: `<label>` - <reason>
- Remove: `<label>` - <reason>
- Current labels are appropriate ✓
### Similar Issues Found
1. #<number> - <title> (<state>, closed by PR #<pr> on <date>)
2. #<number> - <title> (<state>)
...
### Potential Assignees
- @<username> - <reason>
- @<username> - <reason>
### Related Code/Discussions
- <semantic search findings>
```
# IMPLEMENTATION-PLAN.MD
1) **Problem Framing** — restate problem; current vs expected; scope boundaries.
2) **Layers & Files** — layers (UI/domain/data/infra/build). For each, list **files/dirs to modify** and **new files** (exact paths + why). Prefer repo patterns; cite examples/PRs.
3) **Pattern Choices** — reuse existing; if new, justify trade-offs & transition.
4) **Fundamentals** (brief plan or N/A + reason):
- Performance (hot paths, allocs, caching/streaming)
- Security (validation, authN/Z, secrets, SSRF/XSS/CSRF)
- G11N/L10N (resources, number/date, pluralization)
- Compatibility (public APIs, formats, OS/runtime/toolchain)
- Extensibility (DI seams, options/flags, plugin points)
- Accessibility (roles, labels, focus, keyboard, contrast)
- SOLID & repo conventions (naming, folders, dependency direction)
5) **Logging & Exception Handling**
- Where to log; levels; structured fields; correlation/traces.
- What to catch vs rethrow; retries/backoff; user-visible errors.
- **Privacy**: never log secrets/PII; redaction policy.
6) **Telemetry (optional — business metrics only)**
- Events/metrics (name, when, props); success signal; privacy/sampling; dashboards/alerts.
7) **Risks & Mitigations** — flags/canary/shadow-write/config guards.
8) **Task Breakdown (agent-ready)** — table (leave a blank line before the header so Markdown renders correctly):
| Task | Intent | Files/Areas | Steps | Tests (brief) | Owner (Agent/Human) | Human interaction needed? (why) |
|---|---|---|---|---|---|---|
9) **Tests to Add (only)**
- **Unit**: targets, cases (success/edge/error), mocks/fixtures, path, notes.
- **UI** (if applicable): flows, locator strategy, env/data/flags, path, flake mitigation.

View File

@@ -1,198 +0,0 @@
---
agent: 'agent'
description: 'Perform a comprehensive PR review with per-step Markdown and machine-readable outputs'
---
# Review Pull Request
**Goal**: Given `{{pr_number}}`, run a *one-topic-per-step* review. Write files to `Generated Files/prReview/{{pr_number}}/` (replace `{{pr_number}}` with the integer). Emit machinereadable blocks for a GitHub MCP to post review comments.
## PR selection
Resolve the target PR using these fallbacks in order:
1. Parse the invocation text for an explicit identifier (first integer following patterns such as a leading hash and digits or the text `PR:` followed by digits).
2. If no PR is found yet, locate the newest `Generated Files/prReview/_batch/batch-overview-*.md` file (highest timestamp in filename, fallback newest mtime) and take the first entry in its `## PRs` list whose review folder is missing `00-OVERVIEW.md` or contains `__error.flag`.
3. If the batch file has no pending PRs, query assignments with `gh pr list --assignee @me --state open --json number,updatedAt --limit 20` and pick the most recently updated PR that does not already have a completed review folder.
4. If still unknown, run `gh pr view --json number` in the current branch and use that result when it is unambiguous.
5. If every step above fails, prompt the user for a PR number before proceeding.
## Fetch PR data with `gh`
- `gh pr view {{pr_number}} --json number,baseRefName,headRefName,baseRefOid,headRefOid,changedFiles,files`
- `gh api repos/:owner/:repo/pulls/{{pr_number}}/files?per_page=250` # patches for line mapping
### Incremental review workflow
1. **Check for existing review**: Read `Generated Files/prReview/{{pr_number}}/00-OVERVIEW.md`
2. **Extract state**: Parse `Last reviewed SHA:` from review metadata section
3. **Detect changes**: Run `Get-PrIncrementalChanges.ps1 -PullRequestNumber {{pr_number}} -LastReviewedCommitSha {{sha}}`
4. **Analyze result**:
- `NeedFullReview: true` → Review all files in the PR
- `NeedFullReview: false` and `IsIncremental: true` → Review only files in `ChangedFiles` array
- `ChangedFiles` is empty → No changes, skip review (update iteration history with "No changes since last review")
5. **Apply smart filtering**: Use the file patterns in smart step filtering table to skip irrelevant steps
6. **Update metadata**: After completing review, save current `headRefOid` as `Last reviewed SHA:` in `00-OVERVIEW.md`
### Reusable PowerShell scripts
Scripts live in `.github/review-tools/` to avoid repeated manual approvals during PR reviews:
| Script | Usage |
| --- | --- |
| `.github/review-tools/Get-GitHubRawFile.ps1` | Download a repository file at a given ref, optionally with line numbers. |
| `.github/review-tools/Get-GitHubPrFilePatch.ps1` | Fetch the unified diff for a specific file within a pull request via `gh api`. |
| `.github/review-tools/Get-PrIncrementalChanges.ps1` | Compare last reviewed SHA with current PR head to identify incremental changes. Returns JSON with changed files, new commits, and whether full review is needed. |
| `.github/review-tools/Test-IncrementalReview.ps1` | Test helper to preview incremental review detection for a PR. Use before running full review to see what changed. |
Always prefer these scripts (or new ones added under `.github/review-tools/`) over raw `gh api` or similar shell commands so the review flow does not trigger interactive approval prompts.
## Output files
Folder: `Generated Files/prReview/{{pr_number}}/`
Files: `00-OVERVIEW.md`, `01-functionality.md`, `02-compatibility.md`, `03-performance.md`, `04-accessibility.md`, `05-security.md`, `06-localization.md`, `07-globalization.md`, `08-extensibility.md`, `09-solid-design.md`, `10-repo-patterns.md`, `11-docs-automation.md`, `12-code-comments.md`, `13-copilot-guidance.md` *(only if guidance md exists).*
- **Write-after-step rule:** Immediately after completing each TODO step, persist that step's markdown file before proceeding to the next. Generate `00-OVERVIEW.md` only after every step file has been refreshed for the current run.
## Iteration management
- Determine the current review iteration by reading `00-OVERVIEW.md` (look for `Review iteration:`). If missing, assume iteration `1`.
- Extract the last reviewed SHA from `00-OVERVIEW.md` (look for `Last reviewed SHA:` in the review metadata section). If missing, this is iteration 1.
- **Incremental review detection**:
1. Call `.github/review-tools/Get-PrIncrementalChanges.ps1 -PullRequestNumber {{pr_number}} -LastReviewedCommitSha {{last_sha}}` to get delta analysis.
2. Parse the JSON result to determine if incremental review is possible (`IsIncremental: true`, `NeedFullReview: false`).
3. If force-push detected or first review, proceed with full review of all changed files.
4. If incremental, review only the files listed in `ChangedFiles` array and apply smart step filtering (see below).
- Increment the iteration for each review run and propagate the new value to all step files and the overview.
- Preserve prior iteration notes by keeping/expanding an `## Iteration history` section in each markdown file, appending the newest summary under `### Iteration <N>`.
- Summaries should capture key deltas since the previous iteration so reruns can pick up context quickly.
- **After review completion**, update `Last reviewed SHA:` in `00-OVERVIEW.md` with the current `headRefOid` and update the timestamp.
### Smart step filtering (incremental reviews only)
When performing incremental review, skip steps that are irrelevant based on changed file types:
| File pattern | Required steps | Skippable steps |
| --- | --- | --- |
| `**/*.cs`, `**/*.cpp`, `**/*.h` | Functionality, Compatibility, Performance, Security, SOLID, Repo patterns, Code comments | (depends on files) |
| `**/*.resx`, `**/Resources/*.xaml` | Localization, Globalization | Most others |
| `**/*.md` (docs) | Docs & automation | Most others (unless copilot guidance) |
| `**/*copilot*.md`, `.github/prompts/*.md` | Copilot guidance, Docs & automation | Most others |
| `**/*.csproj`, `**/*.vcxproj`, `**/packages.config` | Compatibility, Security, Repo patterns | Localization, Globalization, Accessibility |
| `**/UI/**`, `**/*View.xaml` | Accessibility, Localization | Performance (unless perf-sensitive controls) |
**Default**: If uncertain or files span multiple categories, run all applicable steps. When in doubt, be conservative and review more rather than less.
## TODO steps (one concern each)
1) Functionality
2) Compatibility
3) Performance
4) Accessibility
5) Security
6) Localization
7) Globalization
8) Extensibility
9) SOLID principles
10) Repo patterns
11) Docs & automation coverage for the changes
12) Code comments
13) Copilot guidance (conditional): if changed folders contain `*copilot*.md` or `.github/prompts/*.md`, review diffs **against** that guidance and write `13-copilot-guidance.md` (omit if none).
## Per-step file template (use verbatim)
```md
# <STEP TITLE>
**PR:** (populate with PR identifier) — Base:<baseRefName> Head:<headRefName>
**Review iteration:** ITERATION
## Iteration history
- Maintain subsections titled `### Iteration N` in reverse chronological order (append the latest at the top) with 24 bullet highlights.
### Iteration ITERATION
- <Latest key point 1>
- <Latest key point 2>
## Checks executed
- List the concrete checks for *this step only* (510 bullets).
## Findings
(If none, write **None**. Defaults have one or more blocks:)
```mcp-review-comment
{"file":"relative/path.ext","start_line":123,"end_line":125,"severity":"high|medium|low|info","tags":["<step-slug>","pr-tag-here"],"related_files":["optional/other/file1"],"body":"Problem → Why it matters → Concrete fix. If spans multiple files, name them here."}
```
Use the second tag to encode the PR number.
```
## Overview file (`00-OVERVIEW.md`) template
```md
# PR Review Overview — (populate with PR identifier)
**Review iteration:** ITERATION
**Changed files:** <n> | **High severity issues:** <count>
## Review metadata
**Last reviewed SHA:** <headRefOid from gh pr view>
**Last review timestamp:** <ISO8601 timestamp>
**Review mode:** <Full|Incremental (N files changed since iteration X)>
**Base ref:** <baseRefName>
**Head ref:** <headRefName>
## Step results
Write lines like: `01 Functionality — <OK|Issues|Skipped> (see 01-functionality.md)` … through step 13.
Mark steps as "Skipped" when using incremental review smart filtering.
## Iteration history
- Maintain subsections titled `### Iteration N` mirroring the per-step convention with concise deltas and cross-links to the relevant step files.
- For incremental reviews, list the specific files that changed and which commits were added.
```
## Line numbers & multifile issues
- Map headside lines from `patch` hunks (`@@ -a,b +c,d @@` → new lines `+c..+c+d-1`).
- For crossfile issues: set the primary `"file"`, list others in `"related_files"`, and name them in `"body"`.
## Posting (for MCP)
- Parse all ```mcp-review-comment``` blocks across step files and post as PR review comments.
- If posting isnt available, still write all files.
## Constraint
Read/analyze only; don't modify code. Keep comments small, specific, and fixoriented.
**Testing**: Use `.github/review-tools/Test-IncrementalReview.ps1 -PullRequestNumber 42374` to preview incremental detection before running full review.
## Scratch cache for large PRs
Create a local scratch workspace to progressively summarize diffs and reload state across runs.
### Paths
- Root: `Generated Files/prReview/{{pr_number}}/__tmp/`
- Files:
- `index.jsonl` — append-only JSON Lines index of artifacts.
- `todo-queue.json` — pending items (files/chunks/steps).
- `rollup-<step>-v<N>.md` — iterative per-step aggregates.
- `file-<hash>.txt` — optional saved chunk text (when needed).
### JSON schema (per line in `index.jsonl`)
```json
{"type":"chunk|summary|issue|crosslink",
"path":"relative/file.ext","chunk_id":"f-12","step":"functionality|compatibility|...",
"base_sha":"...", "head_sha":"...", "range":[start,end], "version":1,
"notes":"short text or key:value map", "created_utc":"ISO8601"}
```
### Phases (stateful; resume-safe)
0. **Discover** PR + SHAs: `gh pr view <PR> --json baseRefName,headRefName,baseRefOid,headRefOid,files`.
1. **Chunk** each changed file (head): split into ~300600 LOC or ~4k chars; stable `chunk_id` = hash(path+start).
- Save `chunk` records. Optionally write `file-<hash>.txt` for expensive chunks.
2. **Summarize** per chunk: intent, APIs, risks per TODO step; emit `summary` records (≤600 tokens each).
3. **Issues**: convert findings to machine-readable blocks and emit `issue` records (later rendered to step MD).
4. **Rollups**: build/update `rollup-<step>-v<N>.md` from `summary`+`issue`. Keep prior versions.
5. **Finalize**: write per-step files + `00-OVERVIEW.md` from rollups. Post comments via MCP if available.
### Re-use & token limits
- Always **reload** `index.jsonl` first; skip chunks with same `head_sha` and `range`.
- **Incremental review optimization**: When `Get-PrIncrementalChanges.ps1` returns a subset of changed files, load only chunks from those files. Reuse existing chunks/summaries for unchanged files.
- Prefer re-summarizing only changed chunks; merge chunk summaries → file summaries → step rollups.
- When context is tight, load only the minimal chunk text (or its saved `file-<hash>.txt`) needed for a comment.
### Original vs diff
- Fetch base content when needed: prefer `git show <baseRefName>:<path>`; fallback `gh api repos/:owner/:repo/contents/<path>?ref=<base_sha>` (base64).
- Use patch hunks from `gh api .../pulls/<PR>/files` to compute **head** line numbers.
### Queue-driven loop
- Seed `todo-queue.json` with all changed files.
- Process: chunk → summarize → detect issues → roll up.
- Append to `index.jsonl` after each step; never rewrite previous lines (append-only).
### Hygiene
- `__tmp/` is implementation detail; do not include in final artifacts.
- It is safe to delete to force a clean pass; the next run rebuilds it.

View File

@@ -4,11 +4,10 @@
<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist
- [ ] Closes: #xxx
<!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) -->
- [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected
- [ ] **Closes:** #xxx
- [ ] **Communication:** I've discussed this with core contributors already. If work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Localization:** All end user facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries
@@ -17,7 +16,7 @@
- [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx
<!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here -->
<!-- Provide a more detailed description of the PR, other things fixed or any additional comments/features here -->
## Detailed Description of the Pull Request / Additional comments
<!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well -->

View File

@@ -1,79 +0,0 @@
<#
.SYNOPSIS
Retrieves the unified diff patch for a specific file in a GitHub pull request.
.DESCRIPTION
This script fetches the patch content (unified diff format) for a specified file
within a pull request. It uses the GitHub CLI (gh) to query the GitHub API and
retrieve file change information.
.PARAMETER PullRequestNumber
The pull request number to query.
.PARAMETER FilePath
The relative path to the file in the repository (e.g., "src/modules/main.cpp").
.PARAMETER RepositoryOwner
The GitHub repository owner. Defaults to "microsoft".
.PARAMETER RepositoryName
The GitHub repository name. Defaults to "PowerToys".
.EXAMPLE
.\Get-GitHubPrFilePatch.ps1 -PullRequestNumber 42374 -FilePath "src/modules/cmdpal/main.cpp"
Retrieves the patch for main.cpp in PR #42374.
.EXAMPLE
.\Get-GitHubPrFilePatch.ps1 -PullRequestNumber 42374 -FilePath "README.md" -RepositoryOwner "myorg" -RepositoryName "myrepo"
Retrieves the patch from a different repository.
.NOTES
Requires GitHub CLI (gh) to be installed and authenticated.
Run 'gh auth login' if not already authenticated.
.LINK
https://cli.github.com/
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, HelpMessage = "Pull request number")]
[int]$PullRequestNumber,
[Parameter(Mandatory = $true, HelpMessage = "Relative path to the file in the repository")]
[string]$FilePath,
[Parameter(Mandatory = $false, HelpMessage = "Repository owner")]
[string]$RepositoryOwner = "microsoft",
[Parameter(Mandatory = $false, HelpMessage = "Repository name")]
[string]$RepositoryName = "PowerToys"
)
# Construct GitHub API path for pull request files
$apiPath = "repos/$RepositoryOwner/$RepositoryName/pulls/$PullRequestNumber/files?per_page=250"
# Query GitHub API to get all files in the pull request
try {
$pullRequestFiles = gh api $apiPath | ConvertFrom-Json
} catch {
Write-Error "Failed to query GitHub API for PR #$PullRequestNumber. Ensure gh CLI is authenticated. Details: $_"
exit 1
}
# Find the matching file in the pull request
$matchedFile = $pullRequestFiles | Where-Object { $_.filename -eq $FilePath }
if (-not $matchedFile) {
Write-Error "File '$FilePath' not found in PR #$PullRequestNumber."
exit 1
}
# Check if patch content exists
if (-not $matchedFile.patch) {
Write-Warning "File '$FilePath' has no patch content (possibly binary or too large)."
return
}
# Output the patch content
$matchedFile.patch

View File

@@ -1,91 +0,0 @@
<#
.SYNOPSIS
Downloads and displays the content of a file from a GitHub repository at a specific git reference.
.DESCRIPTION
This script fetches the raw content of a file from a GitHub repository using GitHub's raw content API.
It can optionally display line numbers and supports any valid git reference (branch, tag, or commit SHA).
.PARAMETER FilePath
The relative path to the file in the repository (e.g., "src/modules/main.cpp").
.PARAMETER GitReference
The git reference (branch name, tag, or commit SHA) to fetch the file from. Defaults to "main".
.PARAMETER RepositoryOwner
The GitHub repository owner. Defaults to "microsoft".
.PARAMETER RepositoryName
The GitHub repository name. Defaults to "PowerToys".
.PARAMETER ShowLineNumbers
When specified, displays line numbers before each line of content.
.PARAMETER StartLineNumber
The starting line number to use when ShowLineNumbers is enabled. Defaults to 1.
.EXAMPLE
.\Get-GitHubRawFile.ps1 -FilePath "README.md" -GitReference "main"
Downloads and displays the README.md file from the main branch.
.EXAMPLE
.\Get-GitHubRawFile.ps1 -FilePath "src/runner/main.cpp" -GitReference "dev/feature-branch" -ShowLineNumbers
Downloads main.cpp from a feature branch and displays it with line numbers.
.EXAMPLE
.\Get-GitHubRawFile.ps1 -FilePath "LICENSE" -GitReference "abc123def" -ShowLineNumbers -StartLineNumber 10
Downloads the LICENSE file from a specific commit and displays it with line numbers starting at 10.
.NOTES
Requires internet connectivity to access GitHub's raw content API.
Does not require GitHub CLI authentication for public repositories.
.LINK
https://docs.github.com/en/rest/repos/contents
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, HelpMessage = "Relative path to the file in the repository")]
[string]$FilePath,
[Parameter(Mandatory = $false, HelpMessage = "Git reference (branch, tag, or commit SHA)")]
[string]$GitReference = "main",
[Parameter(Mandatory = $false, HelpMessage = "Repository owner")]
[string]$RepositoryOwner = "microsoft",
[Parameter(Mandatory = $false, HelpMessage = "Repository name")]
[string]$RepositoryName = "PowerToys",
[Parameter(Mandatory = $false, HelpMessage = "Display line numbers before each line")]
[switch]$ShowLineNumbers,
[Parameter(Mandatory = $false, HelpMessage = "Starting line number for display")]
[int]$StartLineNumber = 1
)
# Construct the raw content URL
$rawContentUrl = "https://raw.githubusercontent.com/$RepositoryOwner/$RepositoryName/$GitReference/$FilePath"
# Fetch the file content from GitHub
try {
$response = Invoke-WebRequest -UseBasicParsing -Uri $rawContentUrl
} catch {
Write-Error "Failed to fetch file from $rawContentUrl. Details: $_"
exit 1
}
# Split content into individual lines
$contentLines = $response.Content -split "`n"
# Display the content with or without line numbers
if ($ShowLineNumbers) {
$currentLineNumber = $StartLineNumber
foreach ($line in $contentLines) {
Write-Output ("{0:d4}: {1}" -f $currentLineNumber, $line)
$currentLineNumber++
}
} else {
$contentLines | ForEach-Object { Write-Output $_ }
}

View File

@@ -1,173 +0,0 @@
<#
.SYNOPSIS
Detects changes between the last reviewed commit and current head of a pull request.
.DESCRIPTION
This script compares a previously reviewed commit SHA with the current head of a pull request
to determine what has changed. It helps enable incremental reviews by identifying new commits
and modified files since the last review iteration.
The script handles several scenarios:
- First review (no previous SHA provided)
- No changes (current SHA matches last reviewed SHA)
- Force-push detected (last reviewed SHA no longer in history)
- Incremental changes (new commits added since last review)
.PARAMETER PullRequestNumber
The pull request number to analyze.
.PARAMETER LastReviewedCommitSha
The commit SHA that was last reviewed. If omitted, this is treated as a first review.
.PARAMETER RepositoryOwner
The GitHub repository owner. Defaults to "microsoft".
.PARAMETER RepositoryName
The GitHub repository name. Defaults to "PowerToys".
.OUTPUTS
JSON object containing:
- PullRequestNumber: The PR number being analyzed
- CurrentHeadSha: The current head commit SHA
- LastReviewedSha: The last reviewed commit SHA (if provided)
- BaseRefName: Base branch name
- HeadRefName: Head branch name
- IsIncremental: Boolean indicating if incremental review is possible
- NeedFullReview: Boolean indicating if a full review is required
- ChangedFiles: Array of files that changed (filename, status, additions, deletions)
- NewCommits: Array of commits added since last review (sha, message, author, date)
- Summary: Human-readable description of changes
.EXAMPLE
.\Get-PrIncrementalChanges.ps1 -PullRequestNumber 42374
Analyzes PR #42374 with no previous review (first review scenario).
.EXAMPLE
.\Get-PrIncrementalChanges.ps1 -PullRequestNumber 42374 -LastReviewedCommitSha "abc123def456"
Compares current PR state against the last reviewed commit to identify incremental changes.
.EXAMPLE
$changes = .\Get-PrIncrementalChanges.ps1 -PullRequestNumber 42374 -LastReviewedCommitSha "abc123" | ConvertFrom-Json
if ($changes.IsIncremental) { Write-Host "Can perform incremental review" }
Captures the output as a PowerShell object for further processing.
.NOTES
Requires GitHub CLI (gh) to be installed and authenticated.
Run 'gh auth login' if not already authenticated.
.LINK
https://cli.github.com/
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, HelpMessage = "Pull request number")]
[int]$PullRequestNumber,
[Parameter(Mandatory = $false, HelpMessage = "Commit SHA that was last reviewed")]
[string]$LastReviewedCommitSha,
[Parameter(Mandatory = $false, HelpMessage = "Repository owner")]
[string]$RepositoryOwner = "microsoft",
[Parameter(Mandatory = $false, HelpMessage = "Repository name")]
[string]$RepositoryName = "PowerToys"
)
# Fetch current pull request state from GitHub
try {
$pullRequestData = gh pr view $PullRequestNumber --json headRefOid,headRefName,baseRefName,baseRefOid | ConvertFrom-Json
} catch {
Write-Error "Failed to fetch PR #$PullRequestNumber details. Details: $_"
exit 1
}
$currentHeadSha = $pullRequestData.headRefOid
$baseRefName = $pullRequestData.baseRefName
$headRefName = $pullRequestData.headRefName
# Initialize result object
$analysisResult = @{
PullRequestNumber = $PullRequestNumber
CurrentHeadSha = $currentHeadSha
BaseRefName = $baseRefName
HeadRefName = $headRefName
LastReviewedSha = $LastReviewedCommitSha
IsIncremental = $false
NeedFullReview = $true
ChangedFiles = @()
NewCommits = @()
Summary = ""
}
# Scenario 1: First review (no previous SHA provided)
if ([string]::IsNullOrWhiteSpace($LastReviewedCommitSha)) {
$analysisResult.Summary = "Initial review - no previous iteration found"
$analysisResult.NeedFullReview = $true
return $analysisResult | ConvertTo-Json -Depth 10
}
# Scenario 2: No changes since last review
if ($currentHeadSha -eq $LastReviewedCommitSha) {
$analysisResult.Summary = "No changes since last review (SHA: $currentHeadSha)"
$analysisResult.NeedFullReview = $false
$analysisResult.IsIncremental = $true
return $analysisResult | ConvertTo-Json -Depth 10
}
# Scenario 3: Check for force-push (last reviewed SHA no longer exists in history)
try {
$null = gh api "repos/$RepositoryOwner/$RepositoryName/commits/$LastReviewedCommitSha" 2>&1
if ($LASTEXITCODE -ne 0) {
# SHA not found - likely force-push or branch rewrite
$analysisResult.Summary = "Force-push detected - last reviewed SHA $LastReviewedCommitSha no longer exists. Full review required."
$analysisResult.NeedFullReview = $true
return $analysisResult | ConvertTo-Json -Depth 10
}
} catch {
$analysisResult.Summary = "Cannot verify last reviewed SHA $LastReviewedCommitSha - assuming force-push. Full review required."
$analysisResult.NeedFullReview = $true
return $analysisResult | ConvertTo-Json -Depth 10
}
# Scenario 4: Get incremental changes between last reviewed SHA and current head
try {
$compareApiPath = "repos/$RepositoryOwner/$RepositoryName/compare/$LastReviewedCommitSha...$currentHeadSha"
$comparisonData = gh api $compareApiPath | ConvertFrom-Json
# Extract new commits information
$analysisResult.NewCommits = $comparisonData.commits | ForEach-Object {
@{
Sha = $_.sha.Substring(0, 7)
Message = $_.commit.message.Split("`n")[0] # First line only
Author = $_.commit.author.name
Date = $_.commit.author.date
}
}
# Extract changed files information
$analysisResult.ChangedFiles = $comparisonData.files | ForEach-Object {
@{
Filename = $_.filename
Status = $_.status # added, modified, removed, renamed
Additions = $_.additions
Deletions = $_.deletions
Changes = $_.changes
}
}
$fileCount = $analysisResult.ChangedFiles.Count
$commitCount = $analysisResult.NewCommits.Count
$analysisResult.IsIncremental = $true
$analysisResult.NeedFullReview = $false
$analysisResult.Summary = "Incremental review: $commitCount new commit(s), $fileCount file(s) changed since SHA $($LastReviewedCommitSha.Substring(0, 7))"
} catch {
Write-Error "Failed to compare commits. Details: $_"
$analysisResult.Summary = "Error comparing commits - defaulting to full review"
$analysisResult.NeedFullReview = $true
}
# Return the analysis result as JSON
return $analysisResult | ConvertTo-Json -Depth 10

View File

@@ -1,170 +0,0 @@
<#
.SYNOPSIS
Tests and previews incremental review detection for a pull request.
.DESCRIPTION
This helper script validates the incremental review detection logic by analyzing an existing
PR review folder. It reads the last reviewed SHA from the overview file, compares it with
the current PR state, and displays detailed information about what has changed.
This is useful for:
- Testing the incremental review system before running a full review
- Understanding what changed since the last review iteration
- Verifying that review metadata was properly recorded
.PARAMETER PullRequestNumber
The pull request number to test incremental review detection for.
.PARAMETER RepositoryOwner
The GitHub repository owner. Defaults to "microsoft".
.PARAMETER RepositoryName
The GitHub repository name. Defaults to "PowerToys".
.OUTPUTS
Colored console output displaying:
- Current and last reviewed commit SHAs
- Whether incremental review is possible
- List of new commits since last review
- List of changed files with status indicators
- Recommended review strategy
.EXAMPLE
.\Test-IncrementalReview.ps1 -PullRequestNumber 42374
Tests incremental review detection for PR #42374.
.EXAMPLE
.\Test-IncrementalReview.ps1 -PullRequestNumber 42374 -RepositoryOwner "myorg" -RepositoryName "myrepo"
Tests incremental review for a PR in a different repository.
.NOTES
Requires GitHub CLI (gh) to be installed and authenticated.
Run 'gh auth login' if not already authenticated.
Prerequisites:
- PR review folder must exist at "Generated Files\prReview\{PRNumber}"
- 00-OVERVIEW.md must exist in the review folder
- For incremental detection, overview must contain "Last reviewed SHA" metadata
.LINK
https://cli.github.com/
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, HelpMessage = "Pull request number to test")]
[int]$PullRequestNumber,
[Parameter(Mandatory = $false, HelpMessage = "Repository owner")]
[string]$RepositoryOwner = "microsoft",
[Parameter(Mandatory = $false, HelpMessage = "Repository name")]
[string]$RepositoryName = "PowerToys"
)
# Resolve paths to review folder and overview file
$repositoryRoot = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
$reviewFolderPath = Join-Path $repositoryRoot "Generated Files\prReview\$PullRequestNumber"
$overviewFilePath = Join-Path $reviewFolderPath "00-OVERVIEW.md"
Write-Host "=== Testing Incremental Review for PR #$PullRequestNumber ===" -ForegroundColor Cyan
Write-Host ""
# Check if review folder exists
if (-not (Test-Path $reviewFolderPath)) {
Write-Host "❌ Review folder not found: $reviewFolderPath" -ForegroundColor Red
Write-Host "This appears to be a new review (iteration 1)" -ForegroundColor Yellow
exit 0
}
# Check if overview file exists
if (-not (Test-Path $overviewFilePath)) {
Write-Host "❌ Overview file not found: $overviewFilePath" -ForegroundColor Red
Write-Host "This appears to be an incomplete review" -ForegroundColor Yellow
exit 0
}
# Read overview file and extract last reviewed SHA
Write-Host "📄 Reading overview file..." -ForegroundColor Green
$overviewFileContent = Get-Content $overviewFilePath -Raw
if ($overviewFileContent -match '\*\*Last reviewed SHA:\*\*\s+(\w+)') {
$lastReviewedSha = $Matches[1]
Write-Host "✅ Found last reviewed SHA: $lastReviewedSha" -ForegroundColor Green
} else {
Write-Host "⚠️ No 'Last reviewed SHA' found in overview - this may be an old format" -ForegroundColor Yellow
Write-Host "Proceeding without incremental detection (full review will be needed)" -ForegroundColor Yellow
exit 0
}
Write-Host ""
Write-Host "🔍 Running incremental change detection..." -ForegroundColor Cyan
# Call the incremental changes detection script
$incrementalChangesScriptPath = Join-Path $PSScriptRoot "Get-PrIncrementalChanges.ps1"
if (-not (Test-Path $incrementalChangesScriptPath)) {
Write-Host "❌ Script not found: $incrementalChangesScriptPath" -ForegroundColor Red
exit 1
}
try {
$analysisResult = & $incrementalChangesScriptPath `
-PullRequestNumber $PullRequestNumber `
-LastReviewedCommitSha $lastReviewedSha `
-RepositoryOwner $RepositoryOwner `
-RepositoryName $RepositoryName | ConvertFrom-Json
# Display analysis results
Write-Host ""
Write-Host "=== Incremental Review Analysis ===" -ForegroundColor Cyan
Write-Host "Current HEAD SHA: $($analysisResult.CurrentHeadSha)" -ForegroundColor White
Write-Host "Last reviewed SHA: $($analysisResult.LastReviewedSha)" -ForegroundColor White
Write-Host "Base branch: $($analysisResult.BaseRefName)" -ForegroundColor White
Write-Host "Head branch: $($analysisResult.HeadRefName)" -ForegroundColor White
Write-Host ""
Write-Host "Is incremental? $($analysisResult.IsIncremental)" -ForegroundColor $(if ($analysisResult.IsIncremental) { "Green" } else { "Yellow" })
Write-Host "Need full review? $($analysisResult.NeedFullReview)" -ForegroundColor $(if ($analysisResult.NeedFullReview) { "Yellow" } else { "Green" })
Write-Host ""
Write-Host "Summary: $($analysisResult.Summary)" -ForegroundColor Cyan
Write-Host ""
# Display new commits if any
if ($analysisResult.NewCommits -and $analysisResult.NewCommits.Count -gt 0) {
Write-Host "📝 New commits ($($analysisResult.NewCommits.Count)):" -ForegroundColor Green
foreach ($commit in $analysisResult.NewCommits) {
Write-Host " - $($commit.Sha): $($commit.Message)" -ForegroundColor Gray
}
Write-Host ""
}
# Display changed files if any
if ($analysisResult.ChangedFiles -and $analysisResult.ChangedFiles.Count -gt 0) {
Write-Host "📁 Changed files ($($analysisResult.ChangedFiles.Count)):" -ForegroundColor Green
foreach ($file in $analysisResult.ChangedFiles) {
$statusDisplayColor = switch ($file.Status) {
"added" { "Green" }
"removed" { "Red" }
"modified" { "Yellow" }
"renamed" { "Cyan" }
default { "White" }
}
Write-Host " - [$($file.Status)] $($file.Filename) (+$($file.Additions)/-$($file.Deletions))" -ForegroundColor $statusDisplayColor
}
Write-Host ""
}
# Suggest review strategy based on analysis
Write-Host "=== Recommended Review Strategy ===" -ForegroundColor Cyan
if ($analysisResult.NeedFullReview) {
Write-Host "🔄 Full review recommended" -ForegroundColor Yellow
} elseif ($analysisResult.IsIncremental -and ($analysisResult.ChangedFiles.Count -eq 0)) {
Write-Host "✅ No changes detected - no review needed" -ForegroundColor Green
} elseif ($analysisResult.IsIncremental) {
Write-Host "⚡ Incremental review possible - review only changed files" -ForegroundColor Green
Write-Host "💡 Consider applying smart step filtering based on file types" -ForegroundColor Cyan
}
} catch {
Write-Host "❌ Error running incremental change detection: $_" -ForegroundColor Red
exit 1
}

View File

@@ -1,313 +0,0 @@
---
description: PowerShell scripts for efficient PR reviews in PowerToys repository
applyTo: '**'
---
# PR Review Tools - Reference Guide
PowerShell scripts to support efficient and incremental pull request reviews in the PowerToys repository.
## Quick Start
### Prerequisites
- PowerShell 7+ (or Windows PowerShell 5.1+)
- GitHub CLI (`gh`) installed and authenticated (`gh auth login`)
- Access to the PowerToys repository
### Testing Your Setup
Run the full test suite (recommended):
```powershell
cd "d:\PowerToys-00c1\.github\review-tools"
.\Run-ReviewToolsTests.ps1
```
Expected: 9-10 tests passing
### Individual Script Tests
**Test incremental change detection:**
```powershell
.\Get-PrIncrementalChanges.ps1 -PullRequestNumber 42374
```
Expected: JSON output showing review analysis
**Preview incremental review:**
```powershell
.\Test-IncrementalReview.ps1 -PullRequestNumber 42374
```
Expected: Analysis showing current vs last reviewed SHA
**Fetch file content:**
```powershell
.\Get-GitHubRawFile.ps1 -FilePath "README.md" -GitReference "main"
```
Expected: README content displayed
**Get PR file patch:**
```powershell
.\Get-GitHubPrFilePatch.ps1 -PullRequestNumber 42374 -FilePath ".github/actions/spell-check/expect.txt"
```
Expected: Unified diff output
## Available Scripts
### Get-GitHubRawFile.ps1
Downloads and displays file content from a GitHub repository at a specific git reference.
**Purpose:** Retrieve baseline file content for comparison during PR reviews.
**Parameters:**
- `FilePath` (required): Relative path to file in repository
- `GitReference` (optional): Git ref (branch, tag, SHA). Default: "main"
- `RepositoryOwner` (optional): Repository owner. Default: "microsoft"
- `RepositoryName` (optional): Repository name. Default: "PowerToys"
- `ShowLineNumbers` (switch): Prefix each line with line number
- `StartLineNumber` (optional): Starting line number when using `-ShowLineNumbers`. Default: 1
**Usage:**
```powershell
.\Get-GitHubRawFile.ps1 -FilePath "src/runner/main.cpp" -GitReference "main" -ShowLineNumbers
```
### Get-GitHubPrFilePatch.ps1
Fetches the unified diff (patch) for a specific file in a pull request.
**Purpose:** Get the exact changes made to a file in a PR for detailed review.
**Parameters:**
- `PullRequestNumber` (required): Pull request number
- `FilePath` (required): Relative path to file in the PR
- `RepositoryOwner` (optional): Repository owner. Default: "microsoft"
- `RepositoryName` (optional): Repository name. Default: "PowerToys"
**Usage:**
```powershell
.\Get-GitHubPrFilePatch.ps1 -PullRequestNumber 42374 -FilePath "src/modules/cmdpal/main.cpp"
```
**Output:** Unified diff showing changes made to the file.
### Get-PrIncrementalChanges.ps1
Compares the last reviewed commit with the current PR head to identify incremental changes.
**Purpose:** Enable efficient incremental reviews by detecting what changed since the last review iteration.
**Parameters:**
- `PullRequestNumber` (required): Pull request number
- `LastReviewedCommitSha` (optional): SHA of the commit that was last reviewed. If omitted, assumes first review.
- `RepositoryOwner` (optional): Repository owner. Default: "microsoft"
- `RepositoryName` (optional): Repository name. Default: "PowerToys"
**Usage:**
```powershell
.\Get-PrIncrementalChanges.ps1 -PullRequestNumber 42374 -LastReviewedCommitSha "abc123def456"
```
**Output:** JSON object with detailed change analysis:
```json
{
"PullRequestNumber": 42374,
"CurrentHeadSha": "xyz789abc123",
"LastReviewedSha": "abc123def456",
"IsIncremental": true,
"NeedFullReview": false,
"ChangedFiles": [
{
"Filename": "src/modules/cmdpal/main.cpp",
"Status": "modified",
"Additions": 15,
"Deletions": 8,
"Changes": 23
}
],
"NewCommits": [
{
"Sha": "def456",
"Message": "Fix memory leak",
"Author": "John Doe",
"Date": "2025-11-07T10:30:00Z"
}
],
"Summary": "Incremental review: 1 new commit(s), 1 file(s) changed since SHA abc123d"
}
```
**Scenarios Handled:**
- **No LastReviewedCommitSha**: Returns `NeedFullReview: true` (first review)
- **SHA matches current HEAD**: Returns empty `ChangedFiles` (no changes)
- **Force-push detected**: Returns `NeedFullReview: true` (SHA not in history)
- **Incremental changes**: Returns list of changed files and new commits
### Test-IncrementalReview.ps1
Helper script to test and preview incremental review detection before running the full review.
**Purpose:** Validate incremental review functionality and preview what changed.
**Parameters:**
- `PullRequestNumber` (required): Pull request number
- `RepositoryOwner` (optional): Repository owner. Default: "microsoft"
- `RepositoryName` (optional): Repository name. Default: "PowerToys"
**Usage:**
```powershell
.\Test-IncrementalReview.ps1 -PullRequestNumber 42374
```
**Output:** Colored console output showing:
- Current and last reviewed SHAs
- Whether incremental review is possible
- List of new commits and changed files
- Recommended review strategy
## Workflow Integration
These scripts integrate with the PR review prompt (`.github/prompts/review-pr.prompt.md`).
### Typical Review Flow
1. **Initial Review (Iteration 1)**
- Review prompt processes the PR
- Creates `Generated Files/prReview/{PR}/00-OVERVIEW.md`
- Includes review metadata section with current HEAD SHA
2. **Subsequent Reviews (Iteration 2+)**
- Review prompt reads `00-OVERVIEW.md` to get last reviewed SHA
- Calls `Get-PrIncrementalChanges.ps1` to detect what changed
- If incremental:
- Reviews only changed files
- Skips irrelevant review steps (e.g., skip Localization if no `.resx` files changed)
- Uses `Get-GitHubPrFilePatch.ps1` to get patches for changed files
- Updates `00-OVERVIEW.md` with new SHA and iteration number
### Manual Testing Workflow
Preview changes before review:
```powershell
# Check what changed in PR #42374 since last review
.\Test-IncrementalReview.ps1 -PullRequestNumber 42374
# Get incremental changes programmatically
$changes = .\Get-PrIncrementalChanges.ps1 -PullRequestNumber 42374 -LastReviewedCommitSha "abc123" | ConvertFrom-Json
if (-not $changes.NeedFullReview) {
Write-Host "Only need to review $($changes.ChangedFiles.Count) files"
# Review each changed file
foreach ($file in $changes.ChangedFiles) {
Write-Host "Reviewing $($file.Filename)..."
.\Get-GitHubPrFilePatch.ps1 -PullRequestNumber 42374 -FilePath $file.Filename
}
}
```
## Error Handling and Troubleshooting
### Common Requirements
All scripts:
- Exit with code 1 on error
- Write detailed error messages to stderr
- Require `gh` CLI to be installed and authenticated
### Common Issues
**Error: "gh not found"**
- **Solution**: Install GitHub CLI from https://cli.github.com/ and run `gh auth login`
**Error: "Failed to query GitHub API"**
- **Solution**: Verify `gh` authentication with `gh auth status`
- **Solution**: Check PR number exists and you have repository access
**Error: "PR not found"**
- **Solution**: Verify the PR number is correct and still exists
- **Solution**: Ensure repository owner and name are correct
**Error: "SHA not found" or "Force-push detected"**
- **Explanation**: Last reviewed SHA no longer exists in branch history (force-push occurred)
- **Solution**: A full review is required; incremental review not possible
**Tests show "FAIL" but functionality works**
- **Explanation**: Some tests may show exit code failures even when logic is correct
- **Solution**: Check test output message - if it says "Correctly detected", functionality is working
**Error: "Could not find insertion point"**
- **Explanation**: Overview file doesn't have expected "**Changed files:**" line
- **Solution**: Verify overview file format is correct or regenerate it
### Verification Checklist
After setup, verify:
- [ ] `Run-ReviewToolsTests.ps1` shows 9+ tests passing
- [ ] `Get-PrIncrementalChanges.ps1` returns valid JSON
- [ ] `Test-IncrementalReview.ps1` analyzes a PR without errors
- [ ] `Get-GitHubRawFile.ps1` downloads files correctly
- [ ] `Get-GitHubPrFilePatch.ps1` retrieves patches correctly
## Best Practices
### For Review Authors
1. **Test before full review**: Use `Test-IncrementalReview.ps1` to preview changes
2. **Check for force-push**: Review the analysis output - force-pushes require full reviews
3. **Smart step filtering**: Skip review steps for file types that didn't change
### For Script Users
1. **Use absolute paths**: When specifying folders, use absolute paths to avoid ambiguity
2. **Check exit codes**: Scripts exit with code 1 on error - check `$LASTEXITCODE` in automation
3. **Parse JSON output**: Use `ConvertFrom-Json` to work with structured output from `Get-PrIncrementalChanges.ps1`
4. **Handle empty results**: Check `ChangedFiles.Count` before iterating
### Performance Tips
1. **Batch operations**: When reviewing multiple PRs, collect all PR numbers and process in batch
2. **Cache raw files**: Download baseline files once and reuse for multiple comparisons
3. **Filter early**: Use incremental detection to skip unnecessary file reviews
4. **Parallel processing**: Consider processing independent PRs in parallel
## Integration with AI Review Systems
These tools are designed to work with AI-powered review systems:
1. **Copilot Instructions**: This file serves as reference documentation for GitHub Copilot
2. **Structured Output**: JSON output from scripts is easily parsed by AI systems
3. **Incremental Intelligence**: AI can focus on changed files for more efficient reviews
4. **Metadata Tracking**: Review iterations are tracked for context-aware suggestions
### Example AI Integration
```powershell
# Get incremental changes
$analysis = .\Get-PrIncrementalChanges.ps1 -PullRequestNumber $PR | ConvertFrom-Json
# Feed to AI review system
$reviewPrompt = @"
Review the following changed files in PR #$PR:
$($analysis.ChangedFiles | ForEach-Object { "- $($_.Filename) ($($_.Status))" } | Out-String)
Focus on incremental changes only. Previous review was at SHA $($analysis.LastReviewedSha).
"@
# Execute AI review with context
Invoke-AIReview -Prompt $reviewPrompt -Files $analysis.ChangedFiles
```
## Support and Further Information
For detailed script documentation, use PowerShell's help system:
```powershell
Get-Help .\Get-PrIncrementalChanges.ps1 -Full
Get-Help .\Test-IncrementalReview.ps1 -Detailed
```
Related documentation:
- `.github/prompts/review-pr.prompt.md` - Complete review workflow guide
- `doc/devdocs/` - PowerToys development documentation
- GitHub CLI documentation: https://cli.github.com/manual/
For issues or questions, refer to the PowerToys contribution guidelines.

View File

@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to the Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2026 Microsoft Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -1,132 +0,0 @@
---
name: release-note-generation
description: Toolkit for generating PowerToys release notes from GitHub milestone PRs or commit ranges. Use when asked to create release notes, summarize milestone PRs, generate changelog, prepare release documentation, request Copilot reviews for PRs, update README for a new release, manage PR milestones, or collect PRs between commits/tags. Supports PR collection by milestone or commit range, milestone assignment, grouping by label, summarization with external contributor attribution, and README version bumping.
license: Complete terms in LICENSE.txt
---
# Release Note Generation Skill
Generate professional release notes for PowerToys milestones by collecting merged PRs, requesting Copilot code reviews, grouping by label, and producing user-facing summaries.
## Output Directory
All generated artifacts are placed under `Generated Files/ReleaseNotes/` at the repository root (gitignored).
```
Generated Files/ReleaseNotes/
├── milestone_prs.json # Raw PR data from GitHub
├── sorted_prs.csv # Sorted PR list with Copilot summaries
├── prs_with_milestone.csv # Milestone assignment tracking
├── grouped_csv/ # PRs grouped by label (one CSV per label)
├── grouped_md/ # Generated markdown summaries per label
└── v{VERSION}-release-notes.md # Final consolidated release notes
```
## When to Use This Skill
- Generate release notes for a milestone
- Summarize PRs merged in a release
- Request Copilot reviews for milestone PRs
- Assign milestones to PRs missing them
- Collect PRs between two commits/tags
- Update README.md for a new version
## Prerequisites
- GitHub CLI (`gh`) installed and authenticated
- MCP Server: github-mcp-server installed
- GitHub Copilot code review enabled for the org/repo
## Required Variables
⚠️ **Before starting**, confirm `{{ReleaseVersion}}` with the user. If not provided, **ASK**: "What release version are we generating notes for? (e.g., 0.98)"
| Variable | Description | Example |
|----------|-------------|---------|
| `{{ReleaseVersion}}` | Target release version | `0.98` |
## Workflow Overview
```
┌────────────────────────────────┐
│ 1.1 Collect PRs (stable range) │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 1.2 Assign Milestones │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 2.12.4 Label PRs (auto+human) │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 3.1 Request Reviews (Copilot) │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 3.2 Refresh PR data │
│ (CopilotSummary) │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 3.3 Group by label │
│ (grouped_csv) │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 4.1 Summarize (grouped_md) │
└────────────────────────────────┘
┌────────────────────────────────┐
│ 4.2 Final notes (v{VERSION}.md) │
└────────────────────────────────┘
```
| Step | Action | Details |
|------|--------|---------|
| 1.1 | Collect PRs | From previous release tag on `stable` branch → `sorted_prs.csv` |
| 1.2 | Assign Milestones | Ensure all PRs have correct milestone |
| 2.12.4 | Label PRs | Auto-suggest + human label low-confidence |
| 3.13.3 | Reviews & Grouping | Request Copilot reviews → refresh → group by label |
| 4.14.2 | Summaries & Final | Generate grouped summaries, then consolidate |
## Detailed workflow docs
Do not read all steps at once—only read the step you are executing.
- [Step 1: Collection & Milestones](./references/step1-collection.md)
- [Step 2: Labeling PRs](./references/step2-labeling.md)
- [Step 3: Reviews & Grouping](./references/step3-review-grouping.md)
- [Step 4: Summarization](./references/step4-summarization.md)
## Available Scripts
| Script | Purpose |
|--------|---------|
| [dump-prs-since-commit.ps1](./scripts/dump-prs-since-commit.ps1) | Fetch PRs between commits/tags |
| [group-prs-by-label.ps1](./scripts/group-prs-by-label.ps1) | Group PRs into CSVs |
| [collect-or-apply-milestones.ps1](./scripts/collect-or-apply-milestones.ps1) | Assign milestones |
| [diff_prs.ps1](./scripts/diff_prs.ps1) | Incremental PR diff |
## References
- [Sample Output](./references/SampleOutput.md) - Example summary formatting
- [Detailed Instructions](./references/Instruction.md) - Legacy full documentation
## Conventions
- **Terminal usage**: Disabled by default; only run scripts when user explicitly requests
- **Batch generation**: Generate ALL grouped_md files in one pass, then human reviews
- **PR order**: Preserve order from `sorted_prs.csv` in all outputs
- **Label filtering**: Keeps `Product-*`, `Area-*`, `GitHub*`, `*Plugin`, `Issue-*`
## Troubleshooting
| Issue | Solution |
|-------|----------|
| `gh` command not found | Install GitHub CLI and add to PATH |
| No PRs returned | Verify milestone title matches exactly |
| Empty CopilotSummary | Request Copilot reviews first, then re-run dump |
| Many unlabeled PRs | Return to labeling step before grouping |

View File

@@ -1,9 +0,0 @@
- Added mouse button actions so you can choose what left, right, or middle click does. Thanks [@PesBandi](https://github.com/PesBandi)!
- Aligned window styling with current Windows theme for a cleaner look. Thanks [@sadirano](https://github.com/sadirano)!
- Ensured screen readers are notified when the selected item in the list changes for better accessibility.
- Implemented configurable UI test pipeline that can use pre-built official releases instead of building everything from scratch, reducing test execution time from 2+ hours.
- Fixed Alt+Left Arrow navigation not working when search box contains text. Thanks [@jiripolasek](https://github.com/jiripolasek)!

View File

@@ -1,143 +0,0 @@
# Step 1: Collection and Milestones
## 1.0 To-do
- 1.0.1 Generate MemberList.md (REQUIRED)
- 1.1 Collect PRs
- 1.2 Assign Milestones (REQUIRED)
## Required Variables
⚠️ **Before starting**, confirm these values with the user:
| Variable | Description | Example |
|----------|-------------|---------|
| `{{ReleaseVersion}}` | Target release version | `0.97` |
| `{{PreviousReleaseTag}}` | Previous release tag from releases page | `v0.96.1` |
**If user hasn't specified `{{ReleaseVersion}}`, ASK:** "What release version are we generating notes for? (e.g., 0.97)"
**`{{PreviousReleaseTag}}` is derived from the releases page, not user input.** Use the latest published release tag (top of the page). You will use its tag name and tag commit SHA in Step 1.
---
## 1.0.1 Generate MemberList.md (REQUIRED)
Create `Generated Files/ReleaseNotes/MemberList.md` from the **PowerToys core team** section in [COMMUNITY.md](../../../COMMUNITY.md).
Rules:
- One GitHub username per line, **no** `@` prefix.
- Use the usernames exactly as listed in the core team section.
- Do not include former team members or other sections.
Example (format only):
```
example-user
another-user
```
---
## 1.1 Collect PRs
### 1.1.1 Get the previous release commit
1. Open the [PowerToys releases page](https://github.com/microsoft/PowerToys/releases/)
2. Find the latest release (e.g., v0.96.1, which should be at the top)
3. Set `{{PreviousReleaseTag}}` to that tag name (e.g., `v0.96.1`)
4. Copy the full tag commit SHA as `{{SHALastRelease}}`
**If the release SHA is not in your branch history:** Use the helper script to find an equivalent commit on the target branch by matching the commit title:
```powershell
pwsh ./.github/skills/release-note-generation/scripts/find-commit-by-title.ps1 `
-Commit '{{SHALastRelease}}' `
-Branch 'stable'
```
### 1.1.2 Run collection script against stable branch
```powershell
# Collect PRs from previous release to current HEAD of stable branch
pwsh ./.github/skills/release-note-generation/scripts/dump-prs-since-commit.ps1 `
-StartCommit '{{SHALastRelease}}' `
-Branch 'stable' `
-OutputDir 'Generated Files/ReleaseNotes'
```
**Parameters:**
- `-StartCommit` - Previous release tag or commit SHA (exclusive)
- `-Branch` - Always use `stable` branch, not `main` (script uses `origin/stable` as the end ref)
- `-EndCommit` - Optional override if you need a custom end ref
- `-OutputDir` - Output directory for generated files
**Reliability check:** If the script reports “No commits found”, the stable branch has not moved since the last release. In that case, either:
- Confirm this is expected and stop (no new release notes), or
- Re-run against `main` to gather pending changes for the next release cycle.
The script detects both merge commits (`Merge pull request #12345`) and squash commits (`Feature (#12345)`).
**Output** (in `Generated Files/ReleaseNotes/`):
- `milestone_prs.json` - raw PR data
- `sorted_prs.csv` - sorted PR list with columns: Id, Title, Labels, Author, Url, Body, CopilotSummary, NeedThanks
---
## 1.2 Assign Milestones (REQUIRED)
**Before generating release notes**, ensure all collected PRs have the correct milestone assigned.
⚠️ **CRITICAL:** Do NOT proceed to labeling until all PRs have milestones assigned.
### 1.2.1 Check current milestone status (dry run)
```powershell
# Dry run first to see what would be changed:
pwsh ./.github/skills/release-note-generation/scripts/collect-or-apply-milestones.ps1 `
-InputCsv 'Generated Files/ReleaseNotes/sorted_prs.csv' `
-OutputCsv 'Generated Files/ReleaseNotes/prs_with_milestone.csv' `
-DefaultMilestone 'PowerToys {{ReleaseVersion}}' `
-ApplyMissing -WhatIf
```
This queries GitHub for each PR's current milestone and shows which PRs would be updated.
### 1.2.2 Apply milestones to PRs missing them
```powershell
# Apply for real:
pwsh ./.github/skills/release-note-generation/scripts/collect-or-apply-milestones.ps1 `
-InputCsv 'Generated Files/ReleaseNotes/sorted_prs.csv' `
-OutputCsv 'Generated Files/ReleaseNotes/prs_with_milestone.csv' `
-DefaultMilestone 'PowerToys {{ReleaseVersion}}' `
-ApplyMissing
```
**Script Behavior:**
- Queries each PR's current milestone from GitHub
- PRs that already have a milestone are **skipped** (not overwritten)
- PRs missing a milestone get the default milestone applied
- Outputs `prs_with_milestone.csv` with (Id, Milestone) columns
- Produces summary: `Updated=X Skipped=Y Failed=Z`
**Validation:** After assignment, all PRs in `prs_with_milestone.csv` should have the target milestone.
---
## Additional Commands
### Collect milestones only (no changes to GitHub)
```powershell
pwsh ./.github/skills/release-note-generation/scripts/collect-or-apply-milestones.ps1 `
-InputCsv 'Generated Files/ReleaseNotes/sorted_prs.csv' `
-OutputCsv 'Generated Files/ReleaseNotes/prs_with_milestone.csv'
```
### Local assignment only (fill blanks in CSV, no GitHub changes)
```powershell
pwsh ./.github/skills/release-note-generation/scripts/collect-or-apply-milestones.ps1 `
-InputCsv 'Generated Files/ReleaseNotes/sorted_prs.csv' `
-OutputCsv 'Generated Files/ReleaseNotes/prs_with_milestone.csv' `
-DefaultMilestone 'PowerToys {{ReleaseVersion}}' `
-LocalAssign
```

View File

@@ -1,131 +0,0 @@
# Step 2: Label Unlabeled PRs
## 2.0 To-do
- 2.1 Identify unlabeled PRs (Agent Mode)
- 2.2 Suggest labels (Agent Mode)
- 2.3 Human label low-confidence PRs
- 2.4 Recheck labels, delete Unlabeled.csv, and re-collect
**Before grouping**, ensure all PRs have appropriate labels for categorization.
⚠️ **CRITICAL:** Do NOT proceed to grouping until all PRs have labels assigned. PRs without labels will end up in `Unlabeled.csv` and won't appear in the correct release note sections.
## 2.1 Identify unlabeled PRs (Agent Mode)
Read `sorted_prs.csv` and identify PRs with empty or missing `Labels` column.
For each unlabeled PR, analyze:
- **Title** - Often contains module name or feature
- **Body** - PR description with context
- **CopilotSummary** - AI-generated summary of changes
## 2.2 Suggest labels (Agent Mode)
For each unlabeled PR, suggest an appropriate label based on the content analysis.
**Output:** Create `Generated Files/ReleaseNotes/prs_label_review.md` with the following format:
```markdown
# PR Label Review
Generated: YYYY-MM-DD HH:mm:ss
## Summary
- Total unlabeled PRs: X
- High confidence: X
- Medium confidence: X
- Low confidence: X
---
## PRs Needing Review (sorted by confidence, low first)
| PR | Title | Suggested Label | Confidence | Reason |
|----|-------|-----------------|------------|--------|
| [#12347](url) | Some generic fix | ??? | Low | Unclear from content |
| [#12346](url) | Update dependencies | `Area-Build` | Medium | Body mentions NuGet packages |
```
Sort by confidence (low first) so human reviews uncertain ones first.
After writing `prs_label_review.md`, **generate `prs_to_label.csv`, apply labels, and re-run collection** so the CSV/labels stay in sync:
```powershell
# Generate CSV from suggestions (agent)
# Apply labels
pwsh ./.github/skills/release-note-generation/scripts/apply-labels.ps1 `
-InputCsv 'Generated Files/ReleaseNotes/prs_to_label.csv'
# Refresh collection
pwsh ./.github/skills/release-note-generation/scripts/dump-prs-since-commit.ps1 `
-StartCommit '{{PreviousReleaseTag}}' -Branch 'stable' `
-OutputDir 'Generated Files/ReleaseNotes'
```
## 2.3 Human label low-confidence PRs
Ask the human to label **low-confidence** PRs directly (in GitHub). Skip any they decide not to label.
## 2.4 Recheck labels, delete Unlabeled.csv, and re-collect
Recheck that all PRs now have labels. Delete `Unlabeled.csv` (if present), then re-run the collection script to update `sorted_prs.csv`:
```powershell
# Remove stale unlabeled output if it exists
Remove-Item 'Generated Files/ReleaseNotes/Unlabeled.csv' -ErrorAction SilentlyContinue
```
```powershell
pwsh ./.github/skills/release-note-generation/scripts/dump-prs-since-commit.ps1 `
-StartCommit '{{PreviousReleaseTag}}' -Branch 'stable' `
-OutputDir 'Generated Files/ReleaseNotes'
```
---
## Common Label Mappings
| Keywords/Patterns | Suggested Label |
| ----------------- | --------------- |
| Advanced Paste, AP, clipboard, paste | `Product-Advanced Paste` |
| CmdPal, Command Palette, cmdpal | `Product-Command Palette` |
| FancyZones, zones, layout | `Product-FancyZones` |
| ZoomIt, zoom, screen annotation | `Product-ZoomIt` |
| Settings, settings-ui, Quick Access, flyout | `Product-Settings` |
| Installer, setup, MSI, MSIX, WiX | `Area-Setup/Install` |
| Build, pipeline, CI/CD, msbuild | `Area-Build` |
| Test, unit test, UI test, fuzz | `Area-Tests` |
| Localization, loc, translation, resw | `Area-Localization` |
| Foundry, AI, LLM | `Product-Advanced Paste` (AI features) |
| Mouse Without Borders, MWB | `Product-Mouse Without Borders` |
| PowerRename, rename, regex | `Product-PowerRename` |
| Peek, preview, file preview | `Product-Peek` |
| Image Resizer, resize | `Product-Image Resizer` |
| LightSwitch, theme, dark mode | `Product-LightSwitch` |
| Quick Accent, accent, diacritics | `Product-Quick Accent` |
| Awake, keep awake, caffeine | `Product-Awake` |
| ColorPicker, color picker, eyedropper | `Product-ColorPicker` |
| Hosts, hosts file | `Product-Hosts` |
| Keyboard Manager, remap | `Product-Keyboard Manager` |
| Mouse Highlighter | `Product-Mouse Highlighter` |
| Mouse Jump | `Product-Mouse Jump` |
| Find My Mouse | `Product-Find My Mouse` |
| Mouse Pointer Crosshairs | `Product-Mouse Pointer Crosshairs` |
| Shortcut Guide | `Product-Shortcut Guide` |
| Text Extractor, OCR, PowerOCR | `Product-Text Extractor` |
| Workspaces | `Product-Workspaces` |
| File Locksmith | `Product-File Locksmith` |
| Crop And Lock | `Product-CropAndLock` |
| Environment Variables | `Product-Environment Variables` |
| New+ | `Product-New+` |
## Label Filtering Rules
The grouping script keeps labels matching these patterns:
- `Product-*`
- `Area-*`
- `GitHub*`
- `*Plugin`
- `Issue-*`
Other labels are ignored for grouping purposes.

View File

@@ -1,37 +0,0 @@
# Step 3: Copilot Reviews and Grouping
## 3.0 To-do
- 3.1 Request Copilot Reviews (Agent Mode)
- 3.2 Refresh PR Data
- 3.3 Group PRs by Label
## 3.1 Request Copilot Reviews (Agent Mode)
Use MCP tools to request Copilot reviews for all PRs in `Generated Files/ReleaseNotes/sorted_prs.csv`:
- Use `mcp_github_request_copilot_review` for each PR ID
- Do NOT generate or run scripts for this step
---
## 3.2 Refresh PR Data
Re-run the collection script to capture Copilot review summaries into the `CopilotSummary` column:
```powershell
pwsh ./.github/skills/release-note-generation/scripts/dump-prs-since-commit.ps1 `
-StartCommit '{{PreviousReleaseTag}}' -Branch 'stable' `
-OutputDir 'Generated Files/ReleaseNotes'
```
---
## 3.3 Group PRs by Label
```powershell
pwsh ./.github/skills/release-note-generation/scripts/group-prs-by-label.ps1 -CsvPath 'Generated Files/ReleaseNotes/sorted_prs.csv' -OutDir 'Generated Files/ReleaseNotes/grouped_csv'
```
Creates `Generated Files/ReleaseNotes/grouped_csv/` with one CSV per label combination.
**Validation:** The `Unlabeled.csv` file should be minimal (ideally empty). If many PRs remain unlabeled, return to Step 2 (see [step2-labeling.md](./step2-labeling.md)).

View File

@@ -1,88 +0,0 @@
# Step 4: Summaries and Final Release Notes
## 4.0 To-do
- 4.1 Generate Summary Markdown (Agent Mode)
- 4.2 Produce Final Release Notes File
## 4.1 Generate Summary Markdown (Agent Mode)
For each CSV in `Generated Files/ReleaseNotes/grouped_csv/`, create a markdown file in `Generated Files/ReleaseNotes/grouped_md/`.
⚠️ **IMPORTANT:** Generate **ALL** markdown files first. Do NOT pause between files or ask for feedback during generation. Complete the entire batch, then human reviews afterwards.
### Structure per file
**1. Bullet list** - one concise, user-facing line per PR:
- Use the “Verb-ed + Scenario + Impact” sentence structure—make readers think, “Thats exactly what I need” or “Yes, thats an awesome fix.”; The "impact" can be end-user focused (written to convey user excitement) or technical (performance/stability) when user-facing impact is minimal.
- If nothing special on impact or unclear impact, mark as needing human summary
- Source from Title, Body, and CopilotSummary (prefer CopilotSummary when available)
- If the column `NeedThanks` in CSV is `True`, append: `Thanks [@Author](https://github.com/Author)!`
- Do NOT include PR numbers in bullet lines
- Do NOT mention “security” or “privacy” issues, since these are not known and could be leveraged by attackers in earlier versions. Instead, describe the user-facing scenario, usage, or impact.
- If confidence < 70%, write: `Human Summary Needed: <PR full link>`
**See [SampleOutput.md](./SampleOutput.md) for examples of well-written bullet summaries.**
**2. Three-column table** (same PR order):
- Column 1: Concise summary (same as bullet)
- Column 2: PR link `[#ID](URL)`
- Column 3: Confidence level (High/Medium/Low)
### Review Process (AFTER all files generated)
- Human reviews each `grouped_md/*.md` file and requests rewrites as needed
- Human may say "rewrite Product-X" or "combine these bullets"—apply changes to that specific file
- Do NOT interrupt generation to ask for feedback
---
## 4.2 Produce Final Release Notes File
Once all `grouped_md/*.md` files are reviewed and approved, consolidate into a single release notes file.
**Output:** `Generated Files/ReleaseNotes/v{{ReleaseVersion}}-release-notes.md`
### Structure
**1. Highlights section** (top):
- 8-12 bullets covering the most user-visible features and impactful fixes
- Pattern: `**Module**: brief description`
- Avoid internal refactors; focus on what users will notice
**2. Module sections** (alphabetical order):
- One section per product (Advanced Paste, Awake, Command Palette, etc.)
- Migrate bullet summaries from the approved `grouped_md/Product-*.md` files
- One section 'Development' for all the rest summaries from the approved `grouped_md/Area-*.md` files
- Re-review E2E, group release improvements by section, and move the most important items to the top of each section.
Some items in the Development section may overlap and should be moved to the Module section where more applicable.
### Example Final Structure
```markdown
# PowerToys v{{ReleaseVersion}} Release Notes
## Highlights
- **Command Palette**: Added theme customization and drag-and-drop support
- **Advanced Paste**: Image input for AI, color detection in clipboard history
- **FancyZones**: New CLI tool for command-line layout management
...
---
## Advanced Paste
- Wrapped paste option lists in a single ScrollViewer
- Added image input handling for AI-powered transformations
...
## Awake
- Fixed timed mode expiration. Thanks [@daverayment](https://github.com/daverayment)!
...
---
## Development
...
```

View File

@@ -1,90 +0,0 @@
<#
.SYNOPSIS
Apply labels to PRs from a CSV file.
.DESCRIPTION
Reads a CSV with Id and Label columns and applies the specified label to each PR via GitHub CLI.
Supports dry-run mode to preview changes before applying.
.PARAMETER InputCsv
CSV file with Id and Label columns. Default: prs_to_label.csv
.PARAMETER Repo
GitHub repository (owner/name). Default: microsoft/PowerToys
.PARAMETER WhatIf
Dry run - show what would be applied without making changes.
.EXAMPLE
pwsh ./apply-labels.ps1 -InputCsv 'Generated Files/ReleaseNotes/prs_to_label.csv'
.EXAMPLE
pwsh ./apply-labels.ps1 -InputCsv 'Generated Files/ReleaseNotes/prs_to_label.csv' -WhatIf
.NOTES
Requires: gh CLI authenticated with repo write access.
Input CSV format:
Id,Label
12345,Product-Advanced Paste
12346,Product-Settings
#>
[CmdletBinding()] param(
[Parameter(Mandatory=$false)][string]$InputCsv = 'prs_to_label.csv',
[Parameter(Mandatory=$false)][string]$Repo = 'microsoft/PowerToys',
[switch]$WhatIf
)
$ErrorActionPreference = 'Stop'
function Write-Info($m){ Write-Host "[info] $m" -ForegroundColor Cyan }
function Write-Warn($m){ Write-Host "[warn] $m" -ForegroundColor Yellow }
function Write-Err($m){ Write-Host "[error] $m" -ForegroundColor Red }
function Write-OK($m){ Write-Host "[ok] $m" -ForegroundColor Green }
if (-not (Get-Command gh -ErrorAction SilentlyContinue)) { Write-Err "GitHub CLI 'gh' not found in PATH"; exit 1 }
if (-not (Test-Path -LiteralPath $InputCsv)) { Write-Err "Input CSV not found: $InputCsv"; exit 1 }
$rows = Import-Csv -LiteralPath $InputCsv
if (-not $rows) { Write-Info "No rows in CSV."; exit 0 }
$firstCols = $rows[0].PSObject.Properties.Name
if (-not ($firstCols -contains 'Id' -and $firstCols -contains 'Label')) {
Write-Err "CSV must contain 'Id' and 'Label' columns"; exit 1
}
Write-Info "Processing $($rows.Count) label assignments..."
if ($WhatIf) { Write-Warn "DRY RUN - no changes will be made" }
$applied = 0
$skipped = 0
$failed = 0
foreach ($row in $rows) {
$id = $row.Id
$label = $row.Label
if ([string]::IsNullOrWhiteSpace($id) -or [string]::IsNullOrWhiteSpace($label)) {
Write-Warn "Skipping row with empty Id or Label"
$skipped++
continue
}
if ($WhatIf) {
Write-Info "Would apply label '$label' to PR #$id"
$applied++
continue
}
try {
gh pr edit $id --repo $Repo --add-label $label 2>&1 | Out-Null
Write-OK "Applied '$label' to PR #$id"
$applied++
} catch {
Write-Warn "Failed to apply label to PR #${id}: $_"
$failed++
}
}
Write-Info ""
Write-Info "Summary: Applied=$applied Skipped=$skipped Failed=$failed"

View File

@@ -1,172 +0,0 @@
<#
.SYNOPSIS
Collect existing PR milestones or (optionally) assign/apply a milestone to missing PRs in one script.
.DESCRIPTION
This unified script merges the behaviors of the previous add-milestone-column (collector) and
set-milestones-missing (remote updater) scripts.
Modes (controlled by switches):
1. Collect (default) For each PR Id in the input CSV, queries GitHub for the current milestone and
outputs a two-column CSV (Id,Milestone) leaving blanks where none are set.
2. LocalAssign Same as Collect, but for rows that end up blank assigns the value of -DefaultMilestone
in memory (does NOT touch GitHub). Useful for quickly preparing a fully populated CSV.
3. ApplyMissing After determining which PRs have no milestone, call GitHub API to set their milestone
to -DefaultMilestone. Requires milestone to already exist (open). Network + write.
You can combine LocalAssign and ApplyMissing: the remote update uses the existing live state; LocalAssign only
affects the output CSV/pipeline objects.
.PARAMETER InputCsv
Source CSV with at least an Id column. Default: sorted_prs.csv
.PARAMETER OutputCsv
Destination CSV for collected (and optionally locally assigned) milestones. Default: prs_with_milestone.csv
.PARAMETER Repo
GitHub repository (owner/name). Default: microsoft/PowerToys
.PARAMETER DefaultMilestone
Milestone title used when -LocalAssign or -ApplyMissing is specified. Default: 'PowerToys 0.97'
.PARAMETER Offline
Skip ALL GitHub lookups / updates. Implies Collect-only with all Milestone cells blank (unless LocalAssign).
.PARAMETER LocalAssign
Populate empty Milestone cells in the output with -DefaultMilestone (does not modify GitHub).
.PARAMETER ApplyMissing
For PRs which currently have no milestone (live on GitHub), set them to -DefaultMilestone via Issues API.
.PARAMETER WhatIf
Dry run for ApplyMissing: show intended remote changes without performing PATCH requests.
.EXAMPLE
# Collect only
pwsh ./collect-or-apply-milestones.ps1
.EXAMPLE
# Collect and fill blanks locally in the output only
pwsh ./collect-or-apply-milestones.ps1 -LocalAssign
.EXAMPLE
# Collect and remotely apply milestone to missing PRs
pwsh ./collect-or-apply-milestones.ps1 -ApplyMissing
.EXAMPLE
# Dry run remote application
pwsh ./collect-or-apply-milestones.ps1 -ApplyMissing -WhatIf
.EXAMPLE
# Offline local assignment
pwsh ./collect-or-apply-milestones.ps1 -Offline -LocalAssign -DefaultMilestone 'PowerToys 0.96'
.NOTES
Requires gh CLI unless -Offline AND -ApplyMissing not specified.
Remote apply path queries milestones to resolve numeric ID.
#>
[CmdletBinding()] param(
[Parameter(Mandatory=$false)][string]$InputCsv = 'sorted_prs.csv',
[Parameter(Mandatory=$false)][string]$OutputCsv = 'prs_with_milestone.csv',
[Parameter(Mandatory=$false)][string]$Repo = 'microsoft/PowerToys',
[Parameter(Mandatory=$false)][string]$DefaultMilestone = 'PowerToys 0.97',
[switch]$Offline,
[switch]$LocalAssign,
[switch]$ApplyMissing,
[switch]$WhatIf
)
$ErrorActionPreference = 'Stop'
function Write-Info($m){ Write-Host "[info] $m" -ForegroundColor Cyan }
function Write-Warn($m){ Write-Host "[warn] $m" -ForegroundColor Yellow }
function Write-Err($m){ Write-Host "[error] $m" -ForegroundColor Red }
if (-not (Test-Path -LiteralPath $InputCsv)) { Write-Err "Input CSV not found: $InputCsv"; exit 1 }
$rows = Import-Csv -LiteralPath $InputCsv
if (-not $rows) { Write-Warn "Input CSV has no rows."; @() | Export-Csv -NoTypeInformation -LiteralPath $OutputCsv; exit 0 }
if (-not ($rows[0].PSObject.Properties.Name -contains 'Id')) { Write-Err "Input CSV missing 'Id' column."; exit 1 }
$needGh = (-not $Offline) -and ($ApplyMissing -or -not $Offline)
if ($needGh -and -not (Get-Command gh -ErrorAction SilentlyContinue)) { Write-Err "GitHub CLI 'gh' not found. Use -Offline or install gh."; exit 1 }
# Step 1: Collect current milestone titles
$milestoneCache = @{}
$collected = New-Object System.Collections.Generic.List[object]
$idx = 0
foreach ($row in $rows) {
$idx++
$id = $row.Id
if (-not $id) { Write-Warn "Row $idx missing Id; skipping"; continue }
$ms = ''
if (-not $Offline) {
if ($milestoneCache.ContainsKey($id)) { $ms = $milestoneCache[$id] }
else {
try {
$json = gh pr view $id --repo $Repo --json milestone 2>$null | ConvertFrom-Json
if ($json -and $json.milestone -and $json.milestone.title) { $ms = $json.milestone.title }
} catch {
Write-Warn "Failed to fetch PR #$id milestone: $_"
}
$milestoneCache[$id] = $ms
}
}
$collected.Add([PSCustomObject]@{ Id = $id; Milestone = $ms }) | Out-Null
}
# Step 2: Remote apply (if requested)
$applySummary = @()
if ($ApplyMissing) {
if ($Offline) { Write-Err "Cannot use -ApplyMissing with -Offline."; exit 1 }
Write-Info "Resolving milestone id for '$DefaultMilestone' ..."
$milestonesRaw = gh api repos/$Repo/milestones --paginate --jq '.[] | {number,title,state}'
$msObj = $milestonesRaw | ConvertFrom-Json | Where-Object { $_.title -eq $DefaultMilestone -and $_.state -eq 'open' } | Select-Object -First 1
if (-not $msObj) { Write-Err "Milestone '$DefaultMilestone' not found/open."; exit 1 }
$msNumber = $msObj.number
$targets = $collected | Where-Object { [string]::IsNullOrWhiteSpace($_.Milestone) }
Write-Info ("ApplyMissing: {0} PR(s) without milestone." -f $targets.Count)
foreach ($t in $targets) {
$id = $t.Id
try {
# Verify still missing live
$current = gh pr view $id --repo $Repo --json milestone --jq '.milestone.title // ""'
if ($current) {
$applySummary += [PSCustomObject]@{ Id=$id; Action='Skip (already has)'; Milestone=$current; Status='OK' }
continue
}
if ($WhatIf) {
$applySummary += [PSCustomObject]@{ Id=$id; Action='Would set'; Milestone=$DefaultMilestone; Status='DRY RUN' }
continue
}
gh api -X PATCH -H 'Accept: application/vnd.github+json' repos/$Repo/issues/$id -f milestone=$msNumber | Out-Null
$applySummary += [PSCustomObject]@{ Id=$id; Action='Set'; Milestone=$DefaultMilestone; Status='OK' }
# Reflect in collected object for CSV output if not LocalAssign already doing so
$t.Milestone = $DefaultMilestone
} catch {
$errText = $_ | Out-String
$applySummary += [PSCustomObject]@{ Id=$id; Action='Failed'; Milestone=$DefaultMilestone; Status=$errText.Trim() }
Write-Warn ("Failed to set milestone for PR #{0}: {1}" -f $id, ($errText.Trim()))
}
}
}
# Step 3: Local assignment (purely for output) AFTER remote so remote actual result not overwritten accidentally
if ($LocalAssign) {
foreach ($item in $collected) {
if ([string]::IsNullOrWhiteSpace($item.Milestone)) { $item.Milestone = $DefaultMilestone }
}
}
# Step 4: Export CSV
$collected | Export-Csv -LiteralPath $OutputCsv -NoTypeInformation -Encoding UTF8
Write-Info ("Wrote collected CSV -> {0}" -f (Resolve-Path -LiteralPath $OutputCsv))
# Step 5: Summaries
if ($ApplyMissing) {
$updated = ($applySummary | Where-Object { $_.Action -eq 'Set' }).Count
$skipped = ($applySummary | Where-Object { $_.Action -like 'Skip*' }).Count
$failed = ($applySummary | Where-Object { $_.Action -eq 'Failed' }).Count
Write-Info ("ApplyMissing summary: Updated={0} Skipped={1} Failed={2}" -f $updated, $skipped, $failed)
}
# Emit objects (final collected set)
return $collected

View File

@@ -1,100 +0,0 @@
<#
.SYNOPSIS
Produce an incremental PR CSV containing rows present in a newer full export but absent from a baseline export.
.DESCRIPTION
Compares two previously generated sorted PR CSV files (same schema). Any row whose key column value
(defaults to 'Number') does not exist in the baseline file is emitted to a new incremental CSV, preserving
the original column order. If no new rows are found, an empty CSV (with headers when determinable) is written.
.PARAMETER BaseCsv
Path to the baseline (earlier) PR CSV.
.PARAMETER AllCsv
Path to the newer full PR CSV containing superset (or equal set) of rows.
.PARAMETER OutCsv
Path to write the incremental CSV containing only new rows.
.PARAMETER Key
Column name used as unique identifier (defaults to 'Number'). Must exist in both CSVs.
.EXAMPLE
pwsh ./diff_prs.ps1 -BaseCsv sorted_prs_prev.csv -AllCsv sorted_prs.csv -OutCsv sorted_prs_incremental.csv
.NOTES
Requires: PowerShell 7+, both CSVs with identical column schemas.
Exit code 0 on success (even if zero incremental rows). Throws on missing files.
#>
[CmdletBinding()] param(
[Parameter(Mandatory=$false)][string]$BaseCsv = "./sorted_prs_93_round1.csv",
[Parameter(Mandatory=$false)][string]$AllCsv = "./sorted_prs.csv",
[Parameter(Mandatory=$false)][string]$OutCsv = "./sorted_prs_93_incremental.csv",
[Parameter(Mandatory=$false)][string]$Key = "Number"
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
function Write-Info($m) { Write-Host "[info] $m" -ForegroundColor Cyan }
function Write-Warn($m) { Write-Host "[warn] $m" -ForegroundColor Yellow }
if (-not (Test-Path -LiteralPath $BaseCsv)) { throw "Base CSV not found: $BaseCsv" }
if (-not (Test-Path -LiteralPath $AllCsv)) { throw "All CSV not found: $AllCsv" }
# Load CSVs
$baseRows = Import-Csv -LiteralPath $BaseCsv
$allRows = Import-Csv -LiteralPath $AllCsv
if (-not $baseRows) { Write-Warn "Base CSV has no rows." }
if (-not $allRows) { Write-Warn "All CSV has no rows." }
# Validate key presence
if ($baseRows -and -not ($baseRows[0].PSObject.Properties.Name -contains $Key)) { throw "Key column '$Key' not found in base CSV." }
if ($allRows -and -not ($allRows[0].PSObject.Properties.Name -contains $Key)) { throw "Key column '$Key' not found in all CSV." }
# Build a set of existing keys from base
$set = New-Object 'System.Collections.Generic.HashSet[string]'
foreach ($row in $baseRows) {
$val = [string]($row.$Key)
if ($null -ne $val) { [void]$set.Add($val) }
}
# Filter rows in AllCsv whose key is not in base (these are the new / incremental rows)
$incremental = @()
foreach ($row in $allRows) {
$val = [string]($row.$Key)
if (-not $set.Contains($val)) { $incremental += $row }
}
# Preserve column order from the All CSV
$columns = @()
if ($allRows.Count -gt 0) {
$columns = $allRows[0].PSObject.Properties.Name
}
try {
if ($incremental.Count -gt 0) {
if ($columns.Count -gt 0) {
$incremental | Select-Object -Property $columns | Export-Csv -LiteralPath $OutCsv -NoTypeInformation -Encoding UTF8
} else {
$incremental | Export-Csv -LiteralPath $OutCsv -NoTypeInformation -Encoding UTF8
}
} else {
# Write an empty CSV with headers if we know them (facilitates downstream tooling expecting header row)
if ($columns.Count -gt 0) {
$obj = [PSCustomObject]@{}
foreach ($c in $columns) { $obj | Add-Member -NotePropertyName $c -NotePropertyValue $null }
$obj | Select-Object -Property $columns | Export-Csv -LiteralPath $OutCsv -NoTypeInformation -Encoding UTF8
} else {
'' | Out-File -LiteralPath $OutCsv -Encoding UTF8
}
}
Write-Info ("Incremental rows: {0}" -f $incremental.Count)
Write-Info ("Output: {0}" -f (Resolve-Path -LiteralPath $OutCsv))
}
catch {
Write-Host "[error] Failed writing output CSV: $_" -ForegroundColor Red
exit 1
}

View File

@@ -1,344 +0,0 @@
<#
.SYNOPSIS
Export merged PR metadata between two commits (exclusive start, inclusive end) to JSON and CSV.
.DESCRIPTION
Identifies merge/squash commits reachable from EndCommit but not StartCommit, extracts PR numbers,
queries GitHub for metadata plus (optionally) Copilot review/comment summaries, filters labels, then
emits a JSON artifact and a sorted CSV (first label alphabetical).
.PARAMETER StartCommit
Exclusive starting commit (SHA, tag, or ref). Commits AFTER this one are considered.
.PARAMETER EndCommit
Inclusive ending commit (SHA, tag, or ref). If not provided, uses origin/<Branch> when Branch is set; otherwise uses HEAD.
.PARAMETER Repo
GitHub repository (owner/name). Default: microsoft/PowerToys.
.PARAMETER OutputCsv
Destination CSV path. Default: sorted_prs.csv.
.PARAMETER OutputJson
Destination JSON path containing raw PR objects. Default: milestone_prs.json.
.EXAMPLE
pwsh ./dump-prs-since-commit.ps1 -StartCommit 0123abcd -Branch stable
.EXAMPLE
pwsh ./dump-prs-since-commit.ps1 -StartCommit 0123abcd -EndCommit 89ef7654 -OutputCsv delta.csv
.NOTES
Requires: git, gh (authenticated). No Set-StrictMode to keep parity with existing release scripts.
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)][string]$StartCommit, # exclusive start (commits AFTER this one)
[string]$EndCommit,
[string]$Branch,
[string]$Repo = "microsoft/PowerToys",
[string]$OutputDir,
[string]$OutputCsv = "sorted_prs.csv",
[string]$OutputJson = "milestone_prs.json"
)
<#
.SYNOPSIS
Dump merged PR information whose merge commits are reachable from EndCommit but not from StartCommit.
.DESCRIPTION
Uses git rev-list to compute commits in the (StartCommit, EndCommit] range, extracts PR numbers from merge commit messages,
queries GitHub (gh CLI) for details, then outputs a CSV.
PR merge commit messages in PowerToys generally contain patterns like:
Merge pull request #12345 from ...
.EXAMPLE
pwsh ./dump-prs-since-commit.ps1 -StartCommit 0123abcd -Branch stable
.EXAMPLE
pwsh ./dump-prs-since-commit.ps1 -StartCommit 0123abcd -EndCommit 89ef7654 -OutputCsv changes.csv
.NOTES
Requires: gh CLI authenticated; git available in working directory (must be inside PowerToys repo clone).
CopilotSummary behavior:
- Attempts to locate the latest GitHub Copilot authored review (preferred).
- If no review is found, lazily fetches PR comments to look for a Copilot-authored comment.
- Normalizes whitespace and strips newlines. Empty when no Copilot activity detected.
- Run with -Verbose to see whether the summary came from a 'review' or 'comment' source.
#>
function Write-Info($msg) { Write-Host $msg -ForegroundColor Cyan }
function Write-Warn($msg) { Write-Host $msg -ForegroundColor Yellow }
function Write-Err($msg) { Write-Host $msg -ForegroundColor Red }
function Write-DebugMsg($msg) { if ($PSBoundParameters.ContainsKey('Verbose') -or $VerbosePreference -eq 'Continue') { Write-Host "[VERBOSE] $msg" -ForegroundColor DarkGray } }
# Load member list from Generated Files/ReleaseNotes/MemberList.md (internal team - no thanks needed)
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$repoRoot = Resolve-Path (Join-Path $scriptDir "..\..\..\..")
$defaultMemberListPath = Join-Path $repoRoot "Generated Files\ReleaseNotes\MemberList.md"
$memberListPath = $defaultMemberListPath
if ($OutputDir) {
$memberListFromOutputDir = Join-Path $OutputDir "MemberList.md"
if (Test-Path $memberListFromOutputDir) {
$memberListPath = $memberListFromOutputDir
}
}
$memberList = @()
if (Test-Path $memberListPath) {
$memberListContent = Get-Content $memberListPath -Raw
# Extract usernames - skip markdown code fence lines, get all non-empty lines
$memberList = ($memberListContent -split "`n") | Where-Object { $_ -notmatch '^\s*```' -and $_.Trim() -ne '' } | ForEach-Object { $_.Trim() }
if (-not $memberList -or $memberList.Count -eq 0) {
Write-Err "MemberList.md is empty at $memberListPath"
exit 1
}
Write-DebugMsg "Loaded $($memberList.Count) members from MemberList.md"
} else {
Write-Err "MemberList.md not found at $memberListPath"
exit 1
}
# Validate we are in a git repo
#if (-not (Test-Path .git)) {
# Write-Err "Current directory does not appear to be the root of a git repository."
# exit 1
#}
# Resolve output directory (if specified)
if ($OutputDir) {
if (-not (Test-Path $OutputDir)) {
New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null
}
if (-not [System.IO.Path]::IsPathRooted($OutputCsv)) {
$OutputCsv = Join-Path $OutputDir $OutputCsv
}
if (-not [System.IO.Path]::IsPathRooted($OutputJson)) {
$OutputJson = Join-Path $OutputDir $OutputJson
}
}
# Resolve commits
try {
if ($Branch) {
Write-Info "Fetching latest '$Branch' from origin (with tags)..."
git fetch origin $Branch --tags | Out-Null
if ($LASTEXITCODE -ne 0) { throw "git fetch origin $Branch --tags failed" }
}
$startSha = (git rev-parse --verify $StartCommit) 2>$null
if (-not $startSha) { throw "StartCommit '$StartCommit' not found" }
if ($Branch) {
$branchRef = $Branch
$branchSha = (git rev-parse --verify $branchRef) 2>$null
if (-not $branchSha) {
$branchRef = "origin/$Branch"
$branchSha = (git rev-parse --verify $branchRef) 2>$null
}
if (-not $branchSha) { throw "Branch '$Branch' not found" }
if (-not $PSBoundParameters.ContainsKey('EndCommit') -or [string]::IsNullOrWhiteSpace($EndCommit)) {
$EndCommit = $branchRef
}
}
if (-not $PSBoundParameters.ContainsKey('EndCommit') -or [string]::IsNullOrWhiteSpace($EndCommit)) {
$EndCommit = "HEAD"
}
$endSha = (git rev-parse --verify $EndCommit) 2>$null
if (-not $endSha) { throw "EndCommit '$EndCommit' not found" }
}
catch {
Write-Err $_
exit 1
}
Write-Info "Collecting commits between $startSha..$endSha (excluding start, including end)."
# Get list of commits reachable from end but not from start.
# IMPORTANT: In PowerShell, the .. operator creates a numeric/char range. If $startSha and $endSha look like hex strings,
# `$startSha..$endSha` must be passed as a single string argument.
$rangeArg = "$startSha..$endSha"
$commitList = git rev-list $rangeArg
# Normalize list (filter out empty strings)
$normalizedCommits = $commitList | Where-Object { $_ -and $_.Trim() -ne '' }
$commitCount = ($normalizedCommits | Measure-Object).Count
Write-DebugMsg ("Raw commitList length (including blanks): {0}" -f (($commitList | Measure-Object).Count))
Write-DebugMsg ("Normalized commit count: {0}" -f $commitCount)
if ($commitCount -eq 0) {
Write-Warn "No commits found in specified range ($startSha..$endSha)."; exit 0
}
Write-DebugMsg ("First 5 commits: {0}" -f (($normalizedCommits | Select-Object -First 5) -join ', '))
<#
Extract PR numbers from commits.
Patterns handled:
1. Merge commits: 'Merge pull request #12345 from ...'
2. Squash commits: 'Some feature change (#12345)' (GitHub default squash format)
We collect both. If a commit matches both (unlikely), it's deduped later.
#>
# Extract PR numbers from merge or squash commits
$mergeCommits = @()
foreach ($c in $normalizedCommits) {
$subject = git show -s --format=%s $c
$matched = $false
# Pattern 1: Traditional merge commit
if ($subject -match 'Merge pull request #([0-9]+) ') {
$prNumber = [int]$matches[1]
$mergeCommits += [PSCustomObject]@{ Sha = $c; Pr = $prNumber; Subject = $subject; Pattern = 'merge' }
Write-DebugMsg "Matched merge PR #$prNumber in commit $c"
$matched = $true
}
# Pattern 2: Squash merge subject line with ' (#12345)' at end (allow possible whitespace before paren)
if ($subject -match '\(#([0-9]+)\)$') {
$prNumber2 = [int]$matches[1]
# Avoid duplicate object if pattern 1 already captured same number for same commit
if (-not ($mergeCommits | Where-Object { $_.Sha -eq $c -and $_.Pr -eq $prNumber2 })) {
$mergeCommits += [PSCustomObject]@{ Sha = $c; Pr = $prNumber2; Subject = $subject; Pattern = 'squash' }
Write-DebugMsg "Matched squash PR #$prNumber2 in commit $c"
}
$matched = $true
}
if (-not $matched) {
Write-DebugMsg "No PR pattern in commit $c : $subject"
}
}
if (-not $mergeCommits -or $mergeCommits.Count -eq 0) {
Write-Warn "No merge commits with PR numbers found in range."; exit 0
}
# Deduplicate PR numbers (in case of revert or merges across branches)
$prNumbers = $mergeCommits | Select-Object -ExpandProperty Pr -Unique | Sort-Object
Write-Info ("Found {0} unique PRs: {1}" -f $prNumbers.Count, ($prNumbers -join ', '))
Write-DebugMsg ("Total merge commits examined: {0}" -f $mergeCommits.Count)
# Query GitHub for each PR
$prDetails = @()
function Get-CopilotSummaryFromPrJson {
param(
[Parameter(Mandatory=$true)]$PrJson,
[switch]$VerboseMode
)
# Returns a hashtable with Summary and Source keys.
$result = @{ Summary = ""; Source = "" }
if (-not $PrJson) { return $result }
$candidateAuthors = @(
'github-copilot[bot]', 'github-copilot', 'copilot'
)
# 1. Reviews (preferred) pick the LONGEST valid Copilot body, not the most recent
$reviews = $PrJson.reviews
if ($reviews) {
$copilotReviews = $reviews | Where-Object {
($candidateAuthors -contains $_.author.login -or $_.author.login -like '*copilot*') -and $_.body -and $_.body.Trim() -ne ''
}
if ($copilotReviews) {
$longest = $copilotReviews | Sort-Object { $_.body.Length } -Descending | Select-Object -First 1
if ($longest) {
$body = $longest.body
$norm = ($body -replace "`r", '') -replace "`n", ' '
$norm = $norm -replace '\s+', ' '
$result.Summary = $norm
$result.Source = 'review'
if ($VerboseMode) { Write-DebugMsg "Selected Copilot review length=$($body.Length) (longest)." }
return $result
}
}
}
# 2. Comments fallback (some repos surface Copilot summaries as PR comments rather than review objects)
if ($null -eq $PrJson.comments) {
try {
# Lazy fetch comments only if needed
$commentsJson = gh pr view $PrJson.number --repo $Repo --json comments 2>$null | ConvertFrom-Json
if ($commentsJson -and $commentsJson.comments) {
$PrJson | Add-Member -NotePropertyName comments -NotePropertyValue $commentsJson.comments -Force
}
} catch {
if ($VerboseMode) { Write-DebugMsg "Failed to fetch comments for PR #$($PrJson.number): $_" }
}
}
if ($PrJson.comments) {
$copilotComments = $PrJson.comments | Where-Object {
($candidateAuthors -contains $_.author.login -or $_.author.login -like '*copilot*') -and $_.body -and $_.body.Trim() -ne ''
}
if ($copilotComments) {
$longestC = $copilotComments | Sort-Object { $_.body.Length } -Descending | Select-Object -First 1
if ($longestC) {
$body = $longestC.body
$norm = ($body -replace "`r", '') -replace "`n", ' '
$norm = $norm -replace '\s+', ' '
$result.Summary = $norm
$result.Source = 'comment'
if ($VerboseMode) { Write-DebugMsg "Selected Copilot comment length=$($body.Length) (longest)." }
return $result
}
}
}
return $result
}
foreach ($pr in $prNumbers) {
Write-Info "Fetching PR #$pr ..."
try {
# Include comments only if Verbose asked; if not, we lazily pull when reviews are missing
$fields = 'number,title,labels,author,url,body,reviews'
if ($PSBoundParameters.ContainsKey('Verbose')) { $fields += ',comments' }
$json = gh pr view $pr --repo $Repo --json $fields 2>$null | ConvertFrom-Json
if ($null -eq $json) { throw "Empty response" }
$copilot = Get-CopilotSummaryFromPrJson -PrJson $json -VerboseMode:($PSBoundParameters.ContainsKey('Verbose'))
if ($copilot.Summary -and $copilot.Source -and $PSBoundParameters.ContainsKey('Verbose')) {
Write-DebugMsg "Copilot summary source=$($copilot.Source) chars=$($copilot.Summary.Length)"
} elseif (-not $copilot.Summary) {
Write-DebugMsg "No Copilot summary found for PR #$pr"
}
# Filter labels
$filteredLabels = $json.labels | Where-Object {
($_.name -like "Product-*") -or
($_.name -like "Area-*") -or
($_.name -like "GitHub*") -or
($_.name -like "*Plugin") -or
($_.name -like "Issue-*")
}
$labelNames = ($filteredLabels | ForEach-Object { $_.name }) -join ", "
$bodyValue = if ($json.body) { ($json.body -replace "`r", '') -replace "`n", ' ' } else { '' }
$bodyValue = $bodyValue -replace '\s+', ' '
# Determine if author needs thanks (not in member list)
$authorLogin = $json.author.login
$needThanks = $true
if ($memberList.Count -gt 0 -and $authorLogin) {
$needThanks = -not ($memberList -contains $authorLogin)
}
$prDetails += [PSCustomObject]@{
Id = $json.number
Title = $json.title
Labels = $labelNames
Author = $authorLogin
Url = $json.url
Body = $bodyValue
CopilotSummary = $copilot.Summary
NeedThanks = $needThanks
}
}
catch {
$err = $_
Write-Warn ("Failed to fetch PR #{0}: {1}" -f $pr, $err)
}
}
if (-not $prDetails) { Write-Warn "No PR details fetched."; exit 0 }
# Sort by Labels like original script (first label alphabetical)
$sorted = $prDetails | Sort-Object { ($_.Labels -split ',')[0] }
# Output JSON raw (optional)
$sorted | ConvertTo-Json -Depth 6 | Out-File -Encoding UTF8 $OutputJson
Write-Info "Saving CSV to $OutputCsv ..."
$sorted | Export-Csv $OutputCsv -NoTypeInformation
Write-Host "✅ Done. Generated $($prDetails.Count) PR rows." -ForegroundColor Green

View File

@@ -1,80 +0,0 @@
<#
.SYNOPSIS
Find a commit on a branch that has the same subject line as a reference commit.
.DESCRIPTION
Given a commit SHA (often from a release tag) and a branch name, this script
resolves the reference commit's subject, then searches the branch history for
commits with the exact same subject line. Useful when the release tag commit
is not reachable from your current branch history.
.PARAMETER Commit
The reference commit SHA or ref (e.g., v0.96.1 or a full SHA).
.PARAMETER Branch
The branch to search (e.g., stable or main). Defaults to stable.
.PARAMETER RepoPath
Path to the local repo. Defaults to current directory.
.EXAMPLE
pwsh ./find-commit-by-title.ps1 -Commit b62f6421845f7e5c92b8186868d98f46720db442 -Branch stable
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)][string]$Commit,
[string]$Branch = "stable",
[string]$RepoPath = "."
)
function Write-Info($msg) { Write-Host $msg -ForegroundColor Cyan }
function Write-Err($msg) { Write-Host $msg -ForegroundColor Red }
Push-Location $RepoPath
try {
Write-Info "Fetching latest '$Branch' from origin (with tags)..."
git fetch origin $Branch --tags | Out-Null
if ($LASTEXITCODE -ne 0) { throw "git fetch origin $Branch --tags failed" }
$commitSha = (git rev-parse --verify $Commit) 2>$null
if (-not $commitSha) { throw "Commit '$Commit' not found" }
$subject = (git show -s --format=%s $commitSha) 2>$null
if (-not $subject) { throw "Unable to read subject for '$commitSha'" }
$branchRef = $Branch
$branchSha = (git rev-parse --verify $branchRef) 2>$null
if (-not $branchSha) {
$branchRef = "origin/$Branch"
$branchSha = (git rev-parse --verify $branchRef) 2>$null
}
if (-not $branchSha) { throw "Branch '$Branch' not found" }
Write-Info "Reference commit: $commitSha"
Write-Info "Reference title: $subject"
Write-Info "Searching branch: $branchRef"
$matches = git log $branchRef --format="%H|%s" | Where-Object { $_ -match '\|' }
$results = @()
foreach ($line in $matches) {
$parts = $line -split '\|', 2
if ($parts.Count -eq 2 -and $parts[1] -eq $subject) {
$results += [PSCustomObject]@{ Sha = $parts[0]; Title = $parts[1] }
}
}
if (-not $results -or $results.Count -eq 0) {
Write-Info "No matching commit found on $branchRef for the given title."
exit 0
}
Write-Info ("Found {0} matching commit(s):" -f $results.Count)
$results | ForEach-Object { Write-Host ("{0} {1}" -f $_.Sha, $_.Title) }
}
catch {
Write-Err $_
exit 1
}
finally {
Pop-Location
}

View File

@@ -1,85 +0,0 @@
<#
.SYNOPSIS
Group PR rows by their Labels column and emit per-label CSV files.
.DESCRIPTION
Reads a milestone PR CSV (usually produced by dump-prs-information / dump-prs-since-commit scripts),
splits rows by label list, normalizes/sorts individual labels, and writes one CSV per unique label combination.
Each output preserves the original row ordering within that subset and column order from the source.
.PARAMETER CsvPath
Input CSV containing PR rows with a 'Labels' column (comma-separated list).
.PARAMETER OutDir
Output directory to place grouped CSVs (created if missing). Default: 'grouped_csv'.
.NOTES
Label combinations are joined using ' | ' when multiple labels present. Filenames are sanitized (invalid characters,
whitespace collapsed) and truncated to <= 120 characters.
#>
param(
[string]$CsvPath = "sorted_prs.csv",
[string]$OutDir = "grouped_csv"
)
$ErrorActionPreference = 'Stop'
function Write-Info($msg) { Write-Host "[info] $msg" -ForegroundColor Cyan }
function Write-Warn($msg) { Write-Host "[warn] $msg" -ForegroundColor Yellow }
if (-not (Test-Path -LiteralPath $CsvPath)) { throw "CSV not found: $CsvPath" }
Write-Info "Reading CSV: $CsvPath"
$rows = Import-Csv -LiteralPath $CsvPath
Write-Info ("Loaded {0} rows" -f $rows.Count)
function ConvertTo-SafeFileName {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)][string]$Name
)
if ([string]::IsNullOrWhiteSpace($Name)) { return 'Unnamed' }
$s = $Name -replace '[<>:"/\\|?*]', '-' # invalid path chars
$s = $s -replace '\s+', '-' # spaces to dashes
$s = $s -replace '-{2,}', '-' # collapse dashes
$s = $s.Trim('-')
if ($s.Length -gt 120) { $s = $s.Substring(0,120).Trim('-') }
if ([string]::IsNullOrWhiteSpace($s)) { return 'Unnamed' }
return $s
}
# Build groups keyed by normalized, sorted label combinations. Preserve original CSV row order.
$groups = @{}
foreach ($row in $rows) {
$labelsRaw = $row.Labels
if ([string]::IsNullOrWhiteSpace($labelsRaw)) {
$labelParts = @('Unlabeled')
} else {
$parts = $labelsRaw -split ',' | ForEach-Object { $_.Trim() } | Where-Object { $_ }
if (-not $parts -or $parts.Count -eq 0) { $labelParts = @('Unlabeled') }
else { $labelParts = $parts | Sort-Object }
}
$key = ($labelParts -join ' | ')
if (-not $groups.ContainsKey($key)) { $groups[$key] = New-Object System.Collections.ArrayList }
[void]$groups[$key].Add($row)
}
if (-not (Test-Path -LiteralPath $OutDir)) {
Write-Info "Creating output directory: $OutDir"
New-Item -ItemType Directory -Path $OutDir | Out-Null
}
Write-Info ("Generating {0} grouped CSV file(s) into: {1}" -f $groups.Count, $OutDir)
foreach ($key in $groups.Keys) {
$labelParts = if ($key -eq 'Unlabeled') { @('Unlabeled') } else { $key -split '\s\|\s' }
$safeName = ($labelParts | ForEach-Object { ConvertTo-SafeFileName -Name $_ }) -join '-'
$filePath = Join-Path $OutDir ("$safeName.csv")
# Keep same columns and order
$groups[$key] | Export-Csv -LiteralPath $filePath -NoTypeInformation -Encoding UTF8
}
Write-Info "Done. Sample output files:"
Get-ChildItem -LiteralPath $OutDir | Select-Object -First 10 Name | Format-Table -HideTableHeaders

View File

@@ -1,19 +0,0 @@
name: Automatic New Issue Deduplication
on:
issues:
types: [opened, reopened]
permissions:
models: read
issues: write
concurrency:
group: ${{ github.workflow }}-${{ github.event.issue.number }}
cancel-in-progress: true
jobs:
deduplicate:
runs-on: ubuntu-latest
steps:
- name: Run Deduplicate Action
uses: pelikhan/action-genai-issue-dedup@v0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
label_as_duplicate: true

View File

@@ -1,26 +0,0 @@
# Dependency Review Action
#
# This Action will scan dependency manifest files that change as part of a Pull Request,
# surfacing known-vulnerable versions of the packages declared or updated in the PR.
# Once installed, if the workflow run is marked as required,
# PRs introducing known-vulnerable packages will be blocked from merging.
#
# As recommended by Microsoft's security guidelines (https://docs.opensource.microsoft.com/security/tsg/actions/#requirements-for-security-hardening-your-own-github-actions),
# 3rd-party actions should be pinned to a specific commit hash to prevent supply chain attacks.
# This update aligns with best practices; 1st/2nd-party actions is not required hash pinning.
#
# Source repository: https://github.com/actions/dependency-review-action
name: 'Dependency Review'
on: [pull_request]
permissions:
contents: read
jobs:
dependency-review:
runs-on: ubuntu-latest
steps:
- name: 'Checkout Repository'
uses: actions/checkout@v6
- name: 'Dependency Review'
uses: actions/dependency-review-action@v4

View File

@@ -1,38 +0,0 @@
name: Manual Batch Issue Deduplication
on:
workflow_dispatch:
inputs:
issue_numbers:
description: "JSON array of issue numbers to deduplicate (e.g. [101,102,103])"
required: true
since:
description: "Only compare against issues created after this date (ISO 8601, e.g. 2019-05-05T00:00:00Z)"
required: false
default: "2019-05-05T00:00:00Z"
label_as_duplicate:
description: "Apply duplicate label if duplicates are found (true/false)"
required: false
default: "true"
permissions:
models: read
issues: write
jobs:
deduplicate:
runs-on: ubuntu-latest
strategy:
matrix:
issue: ${{ fromJson(github.event.inputs.issue_numbers) }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Run GenAI Issue Deduplicator
uses: pelikhan/action-genai-issue-dedup@v0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
github_issue: ${{ matrix.issue }}
label_as_duplicate: ${{ github.event.inputs.label_as_duplicate }}

View File

@@ -17,7 +17,7 @@ jobs:
steps:
- name: BODGY - Set up Gnome Keyring for future Cert Auth
run: |-
sudo apt-get update && sudo apt-get install -y gnome-keyring
sudo apt-get install -y gnome-keyring
export $(dbus-launch --sh-syntax)
export $(echo 'anypass_just_to_unlock' | gnome-keyring-daemon --unlock)
export $(echo 'anypass_just_to_unlock' | gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh)
@@ -39,11 +39,6 @@ jobs:
echo powerToysInstallerX64Url=$(jq -n "$powerToysSetup" | jq -r '[.[]|select(.name | contains("x64"))][0].browser_download_url') >> $GITHUB_OUTPUT
echo powerToysInstallerArm64Url=$(jq -n "$powerToysSetup" | jq -r '[.[]|select(.name | contains("arm64"))][0].browser_download_url') >> $GITHUB_OUTPUT
- name: Setup .NET 9.0
uses: actions/setup-dotnet@v5
with:
dotnet-version: '9.0.x'
- uses: microsoft/setup-msstore-cli@v1
- name: Fetch Store Credential

View File

@@ -1,4 +1,5 @@
name: WinGet submission on release
# based off of https://github.com/nushell/nushell/blob/main/.github/workflows/winget-submission.yml
on:
workflow_dispatch:
@@ -8,31 +9,23 @@ on:
jobs:
winget:
name: Publish winget package
# winget-create is only supported on Windows
runs-on: windows-latest
# winget-create will read the following environment variable to access the GitHub token needed for submitting a PR
# See https://aka.ms/winget-create-token
env:
WINGET_CREATE_GITHUB_TOKEN: ${{ secrets.PT_WINGET }}
# Only submit stable releases
if: ${{ !github.event.release.prerelease }}
steps:
- name: Submit Microsoft.PowerToys package to Windows Package Manager Community Repository
run: |
# Get installer info from GitHub release event
$assets = '${{ toJSON(github.event.release.assets) }}' | ConvertFrom-Json
$x64UserInstallerUrl = $assets | Where-Object -Property name -match 'PowerToysUserSetup.*x64' | Select -ExpandProperty browser_download_url
$x64MachineInstallerUrl = $assets | Where-Object -Property name -match 'PowerToysSetup.*x64' | Select -ExpandProperty browser_download_url
$arm64UserInstallerUrl = $assets | Where-Object -Property name -match 'PowerToysUserSetup.*arm64' | Select -ExpandProperty browser_download_url
$arm64MachineInstallerUrl = $assets | Where-Object -Property name -match 'PowerToysSetup.*arm64' | Select -ExpandProperty browser_download_url
$packageVersion = (${{ toJSON(github.event.release.tag_name) }}).Trim('v')
# Update package using wingetcreate
curl.exe -JLO https://aka.ms/wingetcreate/latest
.\wingetcreate.exe update Microsoft.PowerToys `
--version $packageVersion `
--urls "$x64UserInstallerUrl|user" "$x64MachineInstallerUrl|machine" "$arm64UserInstallerUrl|user" "$arm64MachineInstallerUrl|machine" `
--submit
$wingetPackage = "Microsoft.PowerToys"
$gitToken = "${{ secrets.PT_WINGET }}"
$github = Invoke-RestMethod -uri "https://api.github.com/repos/Microsoft/PowerToys/releases"
$targetRelease = $github | Where-Object -Property name -match 'Release'| Select -First 1
$installerUserX64Url = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'PowerToysUserSetup.*x64' | Select -ExpandProperty browser_download_url
$installerMachineX64Url = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'PowerToysSetup.*x64' | Select -ExpandProperty browser_download_url
$installerUserArmUrl = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'PowerToysUserSetup.*arm64' | Select -ExpandProperty browser_download_url
$installerMachineArmUrl = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'PowerToysSetup.*arm64' | Select -ExpandProperty browser_download_url
$ver = $targetRelease.tag_name -ireplace '^v'
# getting latest wingetcreate file
iwr https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe
.\wingetcreate.exe update $wingetPackage -s -v $ver -u "$installerUserX64Url|user" "$installerMachineX64Url|machine" "$installerUserArmUrl|user" "$installerMachineArmUrl|machine" -t $gitToken

View File

@@ -93,7 +93,7 @@ jobs:
steps:
- name: check-spelling
id: spelling
uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25
uses: check-spelling/check-spelling@v0.0.24
with:
config: .github/actions/spell-check
suppress_push_for_open_pull_request: ${{ github.actor != 'dependabot[bot]' && 1 }}
@@ -105,7 +105,7 @@ jobs:
report-timing: 1
warnings: bad-regex,binary-file,deprecated-feature,ignored-expect-variant,large-file,limited-references,no-newline-at-eof,noisy-file,non-alpha-in-dictionary,token-is-substring,unexpected-line-ending,whitespace-in-dictionary,minified-file,unsupported-configuration,no-files-to-check,unclosed-block-ignore-begin,unclosed-block-ignore-end
experimental_apply_changes_via_bot: 1
use_sarif: 1
use_sarif: ${{ (!github.event.pull_request || (github.event.pull_request.head.repo.full_name == github.repository)) && 1 }}
check_extra_dictionaries: ""
dictionary_source_prefixes: >
{
@@ -113,28 +113,37 @@ jobs:
}
extra_dictionaries: |
cspell:software-terms/softwareTerms.txt
cspell:cpp/stdlib-c.txt
cspell:cpp/stdlib-cpp.txt
cspell:filetypes/filetypes.txt
cspell:php/php.txt
cspell:dart/dart.txt
cspell:dotnet/dotnet.txt
cspell:powershell/powershell.txt
cspell:csharp/csharp.txt
cspell:cpp/stdlib-c.txt
cspell:lorem-ipsum/dictionary.txt
cspell:python/python/python-lib.txt
cspell:node/node.txt
cspell:golang/go.txt
cspell:npm/npm.txt
cspell:php/php.txt
cspell:fullstack/fullstack.txt
cspell:css/css.txt
cspell:java/java.txt
cspell:typescript/typescript.txt
cspell:html/html.txt
cspell:r/r.txt
cspell:aws/aws.txt
cspell:dotnet/dotnet.txt
cspell:swift/swift.txt
cspell:node/node.txt
cspell:dart/dart.txt
cspell:django/django.txt
cspell:python/python/python.txt
cspell:powershell/powershell.txt
cspell:npm/npm.txt
cspell:golang/go.txt
cspell:cpp/compiler-msvc.txt
cspell:csharp/csharp.txt
cspell:html/html.txt
cspell:java/java.txt
cspell:aws/aws.txt
cspell:typescript/typescript.txt
cspell:cpp/lang-keywords.txt
cspell:python/common/extra.txt
cspell:scala/scala.txt
cspell:shell/shell-all-words.txt
cspell:css/css.txt
cspell:r/r.txt
cspell:java/java-terms.txt
cspell:cpp/stdlib-cerrno.txt
cspell:k8s/k8s.txt
comment-push:
name: Report (Push)
@@ -147,7 +156,7 @@ jobs:
if: (success() || failure()) && needs.spelling.outputs.followup && github.event_name == 'push'
steps:
- name: comment
uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25
uses: check-spelling/check-spelling@v0.0.24
with:
config: .github/actions/spell-check
checkout: true
@@ -166,7 +175,7 @@ jobs:
if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request')
steps:
- name: comment
uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25
uses: check-spelling/check-spelling@v0.0.24
with:
config: .github/actions/spell-check
checkout: true
@@ -193,7 +202,7 @@ jobs:
cancel-in-progress: false
steps:
- name: apply spelling updates
uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25
uses: check-spelling/check-spelling@v0.0.24
with:
experimental_apply_changes_via_bot: ${{ github.repository_owner != 'microsoft' && 1 }}
checkout: true

9
.gitignore vendored
View File

@@ -349,14 +349,7 @@ src/common/Telemetry/*.etl
/src/modules/powerrename/ui/RCb24464
# Generated installer file for Monaco source files.
/installer/PowerToysSetupVNext/MonacoSRC.wxs
/installer/PowerToysSetup/MonacoSRC.wxs
# MSBuildCache
/MSBuildCacheLogs/
# PowerToys Settings generated search index (legacy location) and obj outputs
/src/settings-ui/Settings.UI/Assets/Settings/search.index.json
# PowerToysInstaller Build Temp Files
installer/*/*.wxs.bk
/src/modules/awake/.claude

3
.gitmodules vendored
View File

@@ -4,3 +4,6 @@
[submodule "deps/expected-lite"]
path = deps/expected-lite
url = https://github.com/martinmoene/expected-lite.git
[submodule "deps/cziplib"]
path = deps/cziplib
url = https://github.com/kuba--/zip.git

Binary file not shown.

View File

@@ -3,265 +3,225 @@
"UseMinimatch": false,
"SignBatches": [
{
"MatchedPath": [
"*.resources.dll",
"WinUI3Apps\\Assets\\Settings\\Scripts\\*.ps1",
"MatchedPath": [
"*.resources.dll",
"WinUI3Apps\\Assets\\Settings\\Scripts\\*.ps1",
"PowerToys.ActionRunner.exe",
"PowerToys.Update.exe",
"PowerToys.BackgroundActivatorDLL.dll",
"PowerToys.ActionRunner.exe",
"PowerToys.Update.exe",
"PowerToys.BackgroundActivatorDLL.dll",
"Notifications.dll",
"os-detection.dll",
"PowerToys.exe",
"PowerToys.FilePreviewCommon.dll",
"PowerToys.Interop.dll",
"Tools\\PowerToys.BugReportTool.exe",
"StylesReportTool\\PowerToys.StylesReportTool.exe",
"Telemetry.dll",
"PowerToys.ManagedTelemetry.dll",
"PowerToys.ManagedCommon.dll",
"PowerToys.Common.UI.dll",
"PowerToys.Settings.UI.Lib.dll",
"PowerToys.GPOWrapper.dll",
"PowerToys.GPOWrapperProjection.dll",
"PowerToys.AllExperiments.dll",
"PowerToys.exe",
"PowerToys.FilePreviewCommon.dll",
"PowerToys.Interop.dll",
"Tools\\PowerToys.BugReportTool.exe",
"StylesReportTool\\PowerToys.StylesReportTool.exe",
"PowerToys.AlwaysOnTop.exe",
"PowerToys.AlwaysOnTopModuleInterface.dll",
"CalculatorEngineCommon.dll",
"PowerToys.ManagedTelemetry.dll",
"PowerToys.ManagedCommon.dll",
"PowerToys.ManagedCsWin32.dll",
"PowerToys.Common.UI.dll",
"PowerToys.Settings.UI.Lib.dll",
"PowerToys.GPOWrapper.dll",
"PowerToys.GPOWrapperProjection.dll",
"PowerToys.AllExperiments.dll",
"LanguageModelProvider.dll",
"PowerToys.CmdNotFoundModuleInterface.dll",
"PowerToys.CmdNotFound.dll",
"Common.Search.dll",
"PowerToys.ColorPicker.dll",
"PowerToys.ColorPickerUI.dll",
"PowerToys.ColorPickerUI.exe",
"PowerToys.AlwaysOnTop.exe",
"PowerToys.AlwaysOnTopModuleInterface.dll",
"PowerToys.CropAndLockModuleInterface.dll",
"PowerToys.CropAndLock.exe",
"PowerToys.CmdNotFoundModuleInterface.dll",
"PowerToys.PowerOCRModuleInterface.dll",
"PowerToys.PowerOCR.dll",
"PowerToys.PowerOCR.exe",
"PowerToys.AdvancedPasteModuleInterface.dll",
"WinUI3Apps\\PowerToys.AdvancedPaste.exe",
"WinUI3Apps\\PowerToys.AdvancedPaste.dll",
"PowerToys.ColorPicker.dll",
"PowerToys.ColorPickerUI.dll",
"PowerToys.ColorPickerUI.exe",
"PowerToys.AwakeModuleInterface.dll",
"PowerToys.Awake.exe",
"PowerToys.Awake.dll",
"PowerToys.CropAndLockModuleInterface.dll",
"PowerToys.CropAndLock.exe",
"fancyzones.dll",
"PowerToys.FancyZonesEditor.exe",
"PowerToys.FancyZonesEditor.dll",
"PowerToys.FancyZonesEditorCommon.dll",
"PowerToys.FancyZonesModuleInterface.dll",
"PowerToys.FancyZones.exe",
"PowerToys.PowerOCRModuleInterface.dll",
"PowerToys.PowerOCR.dll",
"PowerToys.PowerOCR.exe",
"PowerToys.GcodePreviewHandler.dll",
"PowerToys.GcodePreviewHandler.exe",
"PowerToys.GcodePreviewHandlerCpp.dll",
"PowerToys.GcodeThumbnailProvider.dll",
"PowerToys.GcodeThumbnailProvider.exe",
"PowerToys.GcodeThumbnailProviderCpp.dll",
"PowerToys.ManagedTelemetry.dll",
"PowerToys.MarkdownPreviewHandler.dll",
"PowerToys.MarkdownPreviewHandler.exe",
"PowerToys.MarkdownPreviewHandlerCpp.dll",
"PowerToys.MonacoPreviewHandler.dll",
"PowerToys.MonacoPreviewHandler.exe",
"PowerToys.MonacoPreviewHandlerCpp.dll",
"PowerToys.PdfPreviewHandler.dll",
"PowerToys.PdfPreviewHandler.exe",
"PowerToys.PdfPreviewHandlerCpp.dll",
"PowerToys.PdfThumbnailProvider.dll",
"PowerToys.PdfThumbnailProvider.exe",
"PowerToys.PdfThumbnailProviderCpp.dll",
"PowerToys.powerpreview.dll",
"PowerToys.PreviewHandlerCommon.dll",
"PowerToys.QoiPreviewHandler.dll",
"PowerToys.QoiPreviewHandler.exe",
"PowerToys.QoiPreviewHandlerCpp.dll",
"PowerToys.QoiThumbnailProvider.dll",
"PowerToys.QoiThumbnailProvider.exe",
"PowerToys.QoiThumbnailProviderCpp.dll",
"PowerToys.StlThumbnailProvider.dll",
"PowerToys.StlThumbnailProvider.exe",
"PowerToys.StlThumbnailProviderCpp.dll",
"PowerToys.SvgPreviewHandler.dll",
"PowerToys.SvgPreviewHandler.exe",
"PowerToys.SvgPreviewHandlerCpp.dll",
"PowerToys.SvgThumbnailProvider.dll",
"PowerToys.SvgThumbnailProvider.exe",
"PowerToys.SvgThumbnailProviderCpp.dll",
"PowerToys.AdvancedPasteModuleInterface.dll",
"WinUI3Apps\\PowerToys.AdvancedPaste.exe",
"WinUI3Apps\\PowerToys.AdvancedPaste.dll",
"WinUI3Apps\\PowerToys.HostsModuleInterface.dll",
"WinUI3Apps\\PowerToys.HostsUILib.dll",
"WinUI3Apps\\PowerToys.Hosts.dll",
"WinUI3Apps\\PowerToys.Hosts.exe",
"PowerToys.AwakeModuleInterface.dll",
"PowerToys.Awake.exe",
"PowerToys.Awake.dll",
"WinUI3Apps\\PowerToys.FileLocksmithLib.Interop.dll",
"WinUI3Apps\\PowerToys.FileLocksmithExt.dll",
"WinUI3Apps\\PowerToys.FileLocksmithUI.exe",
"WinUI3Apps\\PowerToys.FileLocksmithUI.dll",
"WinUI3Apps\\PowerToys.FileLocksmithContextMenu.dll",
"FileLocksmithContextMenuPackage.msix",
"PowerToys.FancyZonesEditor.exe",
"PowerToys.FancyZonesEditor.dll",
"PowerToys.FancyZonesEditorCommon.dll",
"PowerToys.FancyZonesModuleInterface.dll",
"PowerToys.FancyZones.exe",
"FancyZonesCLI.exe",
"FancyZonesCLI.dll",
"WinUI3Apps\\Peek.Common.dll",
"WinUI3Apps\\Peek.FilePreviewer.dll",
"WinUI3Apps\\Powertoys.Peek.UI.dll",
"WinUI3Apps\\Powertoys.Peek.UI.exe",
"WinUI3Apps\\Powertoys.Peek.dll",
"PowerToys.GcodePreviewHandler.dll",
"PowerToys.GcodePreviewHandler.exe",
"PowerToys.GcodePreviewHandlerCpp.dll",
"PowerToys.GcodeThumbnailProvider.dll",
"PowerToys.GcodeThumbnailProvider.exe",
"PowerToys.GcodeThumbnailProviderCpp.dll",
"PowerToys.BgcodePreviewHandler.dll",
"PowerToys.BgcodePreviewHandler.exe",
"PowerToys.BgcodePreviewHandlerCpp.dll",
"PowerToys.BgcodeThumbnailProvider.dll",
"PowerToys.BgcodeThumbnailProvider.exe",
"PowerToys.BgcodeThumbnailProviderCpp.dll",
"PowerToys.ManagedTelemetry.dll",
"PowerToys.MarkdownPreviewHandler.dll",
"PowerToys.MarkdownPreviewHandler.exe",
"PowerToys.MarkdownPreviewHandlerCpp.dll",
"PowerToys.MonacoPreviewHandler.dll",
"PowerToys.MonacoPreviewHandler.exe",
"PowerToys.MonacoPreviewHandlerCpp.dll",
"PowerToys.PdfPreviewHandler.dll",
"PowerToys.PdfPreviewHandler.exe",
"PowerToys.PdfPreviewHandlerCpp.dll",
"PowerToys.PdfThumbnailProvider.dll",
"PowerToys.PdfThumbnailProvider.exe",
"PowerToys.PdfThumbnailProviderCpp.dll",
"PowerToys.powerpreview.dll",
"PowerToys.PreviewHandlerCommon.dll",
"PowerToys.QoiPreviewHandler.dll",
"PowerToys.QoiPreviewHandler.exe",
"PowerToys.QoiPreviewHandlerCpp.dll",
"PowerToys.QoiThumbnailProvider.dll",
"PowerToys.QoiThumbnailProvider.exe",
"PowerToys.QoiThumbnailProviderCpp.dll",
"PowerToys.StlThumbnailProvider.dll",
"PowerToys.StlThumbnailProvider.exe",
"PowerToys.StlThumbnailProviderCpp.dll",
"PowerToys.SvgPreviewHandler.dll",
"PowerToys.SvgPreviewHandler.exe",
"PowerToys.SvgPreviewHandlerCpp.dll",
"PowerToys.SvgThumbnailProvider.dll",
"PowerToys.SvgThumbnailProvider.exe",
"PowerToys.SvgThumbnailProviderCpp.dll",
"WinUI3Apps\\PowerToys.EnvironmentVariablesModuleInterface.dll",
"WinUI3Apps\\PowerToys.EnvironmentVariablesUILib.dll",
"WinUI3Apps\\PowerToys.EnvironmentVariables.dll",
"WinUI3Apps\\PowerToys.EnvironmentVariables.exe",
"WinUI3Apps\\PowerToys.HostsModuleInterface.dll",
"WinUI3Apps\\PowerToys.HostsUILib.dll",
"WinUI3Apps\\PowerToys.Hosts.dll",
"WinUI3Apps\\PowerToys.Hosts.exe",
"PowerToys.ImageResizer.exe",
"PowerToys.ImageResizer.dll",
"PowerToys.ImageResizerExt.dll",
"PowerToys.ImageResizerContextMenu.dll",
"ImageResizerContextMenuPackage.msix",
"WinUI3Apps\\PowerToys.FileLocksmithLib.Interop.dll",
"WinUI3Apps\\PowerToys.FileLocksmithExt.dll",
"WinUI3Apps\\PowerToys.FileLocksmithUI.exe",
"WinUI3Apps\\PowerToys.FileLocksmithUI.dll",
"WinUI3Apps\\PowerToys.FileLocksmithContextMenu.dll",
"FileLocksmithContextMenuPackage.msix",
"FileLocksmithCLI.exe",
"PowerToys.KeyboardManager.dll",
"KeyboardManagerEditor\\PowerToys.KeyboardManagerEditor.exe",
"KeyboardManagerEngine\\PowerToys.KeyboardManagerEngine.exe",
"PowerToys.KeyboardManagerEditorLibraryWrapper.dll",
"WinUI3Apps\\Peek.Common.dll",
"WinUI3Apps\\Peek.FilePreviewer.dll",
"WinUI3Apps\\Powertoys.Peek.UI.dll",
"WinUI3Apps\\Powertoys.Peek.UI.exe",
"WinUI3Apps\\Powertoys.Peek.dll",
"PowerToys.Launcher.dll",
"PowerToys.PowerLauncher.dll",
"PowerToys.PowerLauncher.exe",
"PowerToys.PowerLauncher.Telemetry.dll",
"Wox.dll",
"Wox.Infrastructure.dll",
"Wox.Plugin.dll",
"RunPlugins\\Calculator\\Microsoft.PowerToys.Run.Plugin.Calculator.dll",
"RunPlugins\\Folder\\Microsoft.Plugin.Folder.dll",
"RunPlugins\\Indexer\\Microsoft.Plugin.Indexer.dll",
"RunPlugins\\OneNote\\Microsoft.PowerToys.Run.Plugin.OneNote.dll",
"RunPlugins\\History\\Microsoft.PowerToys.Run.Plugin.History.dll",
"RunPlugins\\PowerToys\\Microsoft.PowerToys.Run.Plugin.PowerToys.dll",
"RunPlugins\\Program\\Microsoft.Plugin.Program.dll",
"RunPlugins\\Registry\\Microsoft.PowerToys.Run.Plugin.Registry.dll",
"RunPlugins\\WindowsSettings\\Microsoft.PowerToys.Run.Plugin.WindowsSettings.dll",
"RunPlugins\\Shell\\Microsoft.Plugin.Shell.dll",
"RunPlugins\\Uri\\Microsoft.Plugin.Uri.dll",
"RunPlugins\\WindowWalker\\Microsoft.Plugin.WindowWalker.dll",
"RunPlugins\\UnitConverter\\Community.PowerToys.Run.Plugin.UnitConverter.dll",
"RunPlugins\\VSCodeWorkspaces\\Community.PowerToys.Run.Plugin.VSCodeWorkspaces.dll",
"RunPlugins\\Service\\Microsoft.PowerToys.Run.Plugin.Service.dll",
"RunPlugins\\System\\Microsoft.PowerToys.Run.Plugin.System.dll",
"RunPlugins\\TimeDate\\Microsoft.PowerToys.Run.Plugin.TimeDate.dll",
"RunPlugins\\ValueGenerator\\Community.PowerToys.Run.Plugin.ValueGenerator.dll",
"RunPlugins\\WebSearch\\Community.PowerToys.Run.Plugin.WebSearch.dll",
"RunPlugins\\WindowsTerminal\\Microsoft.PowerToys.Run.Plugin.WindowsTerminal.dll",
"WinUI3Apps\\PowerToys.MeasureToolModuleInterface.dll",
"WinUI3Apps\\PowerToys.MeasureToolCore.dll",
"WinUI3Apps\\PowerToys.MeasureToolUI.dll",
"WinUI3Apps\\PowerToys.MeasureToolUI.exe",
"WinUI3Apps\\PowerToys.QuickAccess.dll",
"WinUI3Apps\\PowerToys.QuickAccess.exe",
"WinUI3Apps\\PowerToys.Settings.UI.Controls.dll",
"PowerToys.FindMyMouse.dll",
"PowerToys.MouseHighlighter.dll",
"PowerToys.MouseJump.dll",
"PowerToys.MouseJump.Common.dll",
"PowerToys.MousePointerCrosshairs.dll",
"PowerToys.MouseJumpUI.dll",
"PowerToys.MouseJumpUI.exe",
"WinUI3Apps\\PowerToys.EnvironmentVariablesModuleInterface.dll",
"WinUI3Apps\\PowerToys.EnvironmentVariablesUILib.dll",
"WinUI3Apps\\PowerToys.EnvironmentVariables.dll",
"WinUI3Apps\\PowerToys.EnvironmentVariables.exe",
"PowerToys.MouseWithoutBorders.dll",
"PowerToys.MouseWithoutBorders.exe",
"PowerToys.MouseWithoutBordersModuleInterface.dll",
"PowerToys.MouseWithoutBordersService.dll",
"PowerToys.MouseWithoutBordersService.exe",
"PowerToys.MouseWithoutBordersHelper.dll",
"PowerToys.MouseWithoutBordersHelper.exe",
"PowerToys.ImageResizer.exe",
"PowerToys.ImageResizer.dll",
"WinUI3Apps\\PowerToys.ImageResizerCLI.exe",
"WinUI3Apps\\PowerToys.ImageResizerCLI.dll",
"PowerToys.ImageResizerExt.dll",
"PowerToys.ImageResizerContextMenu.dll",
"ImageResizerContextMenuPackage.msix",
"WinUI3Apps\\PowerToys.NewPlus.ShellExtension.dll",
"WinUI3Apps\\NewPlusPackage.msix",
"WinUI3Apps\\PowerToys.NewPlus.ShellExtension.win10.dll",
"PowerToys.LightSwitchModuleInterface.dll",
"LightSwitchService\\PowerToys.LightSwitchService.exe",
"PowerAccent.Core.dll",
"PowerToys.PowerAccent.dll",
"PowerToys.PowerAccent.exe",
"PowerToys.PowerAccentModuleInterface.dll",
"PowerToys.PowerAccentKeyboardService.dll",
"PowerToys.KeyboardManager.dll",
"KeyboardManagerEditor\\PowerToys.KeyboardManagerEditor.exe",
"KeyboardManagerEngine\\PowerToys.KeyboardManagerEngine.exe",
"PowerToys.KeyboardManagerEditorLibraryWrapper.dll",
"WinUI3Apps\\PowerToys.PowerRenameExt.dll",
"WinUI3Apps\\PowerToys.PowerRename.exe",
"WinUI3Apps\\PowerToys.PowerRenameContextMenu.dll",
"WinUI3Apps\\PowerRenameContextMenuPackage.msix",
"PowerToys.Launcher.dll",
"PowerToys.PowerLauncher.dll",
"PowerToys.PowerLauncher.exe",
"PowerToys.PowerLauncher.Telemetry.dll",
"PowerToys.WorkspacesSnapshotTool.exe",
"PowerToys.WorkspacesLauncher.exe",
"PowerToys.WorkspacesWindowArranger.exe",
"PowerToys.WorkspacesEditor.exe",
"PowerToys.WorkspacesEditor.dll",
"PowerToys.WorkspacesLauncherUI.exe",
"PowerToys.WorkspacesLauncherUI.dll",
"PowerToys.WorkspacesModuleInterface.dll",
"PowerToys.WorkspacesCsharpLibrary.dll",
"Wox.Infrastructure.dll",
"Wox.Plugin.dll",
"RunPlugins\\Calculator\\Microsoft.PowerToys.Run.Plugin.Calculator.dll",
"RunPlugins\\Folder\\Microsoft.Plugin.Folder.dll",
"RunPlugins\\Indexer\\Microsoft.Plugin.Indexer.dll",
"RunPlugins\\OneNote\\Microsoft.PowerToys.Run.Plugin.OneNote.dll",
"RunPlugins\\History\\Microsoft.PowerToys.Run.Plugin.History.dll",
"RunPlugins\\PowerToys\\Microsoft.PowerToys.Run.Plugin.PowerToys.dll",
"RunPlugins\\Program\\Microsoft.Plugin.Program.dll",
"RunPlugins\\Registry\\Microsoft.PowerToys.Run.Plugin.Registry.dll",
"RunPlugins\\WindowsSettings\\Microsoft.PowerToys.Run.Plugin.WindowsSettings.dll",
"RunPlugins\\Shell\\Microsoft.Plugin.Shell.dll",
"RunPlugins\\Uri\\Microsoft.Plugin.Uri.dll",
"RunPlugins\\WindowWalker\\Microsoft.Plugin.WindowWalker.dll",
"RunPlugins\\UnitConverter\\Community.PowerToys.Run.Plugin.UnitConverter.dll",
"RunPlugins\\VSCodeWorkspaces\\Community.PowerToys.Run.Plugin.VSCodeWorkspaces.dll",
"RunPlugins\\Service\\Microsoft.PowerToys.Run.Plugin.Service.dll",
"RunPlugins\\System\\Microsoft.PowerToys.Run.Plugin.System.dll",
"RunPlugins\\TimeDate\\Microsoft.PowerToys.Run.Plugin.TimeDate.dll",
"RunPlugins\\ValueGenerator\\Community.PowerToys.Run.Plugin.ValueGenerator.dll",
"RunPlugins\\WebSearch\\Community.PowerToys.Run.Plugin.WebSearch.dll",
"RunPlugins\\WindowsTerminal\\Microsoft.PowerToys.Run.Plugin.WindowsTerminal.dll",
"WinUI3Apps\\PowerToys.RegistryPreviewExt.dll",
"WinUI3Apps\\PowerToys.RegistryPreviewUILib.dll",
"WinUI3Apps\\PowerToys.RegistryPreview.dll",
"WinUI3Apps\\PowerToys.RegistryPreview.exe",
"WinUI3Apps\\PowerToys.MeasureToolModuleInterface.dll",
"WinUI3Apps\\PowerToys.MeasureToolCore.dll",
"WinUI3Apps\\PowerToys.MeasureToolUI.dll",
"WinUI3Apps\\PowerToys.MeasureToolUI.exe",
"PowerToys.ShortcutGuide.exe",
"PowerToys.ShortcutGuideModuleInterface.dll",
"PowerToys.FindMyMouse.dll",
"PowerToys.MouseHighlighter.dll",
"PowerToys.MouseJump.dll",
"PowerToys.MouseJump.Common.dll",
"PowerToys.MousePointerCrosshairs.dll",
"PowerToys.MouseJumpUI.dll",
"PowerToys.MouseJumpUI.exe",
"PowerToys.CursorWrap.dll",
"PowerToys.ZoomIt.exe",
"PowerToys.ZoomItModuleInterface.dll",
"PowerToys.ZoomItSettingsInterop.dll",
"PowerToys.MouseWithoutBorders.dll",
"PowerToys.MouseWithoutBorders.exe",
"PowerToys.MouseWithoutBordersModuleInterface.dll",
"PowerToys.MouseWithoutBordersService.dll",
"PowerToys.MouseWithoutBordersService.exe",
"PowerToys.MouseWithoutBordersHelper.dll",
"PowerToys.MouseWithoutBordersHelper.exe",
"WinUI3Apps\\PowerToys.Settings.dll",
"WinUI3Apps\\PowerToys.Settings.exe",
"WinUI3Apps\\PowerToys.NewPlus.ShellExtension.dll",
"WinUI3Apps\\NewPlusPackage.msix",
"WinUI3Apps\\PowerToys.NewPlus.ShellExtension.win10.dll",
"PowerAccent.Core.dll",
"PowerToys.PowerAccent.dll",
"PowerToys.PowerAccent.exe",
"PowerToys.PowerAccentModuleInterface.dll",
"PowerToys.PowerAccentKeyboardService.dll",
"PowerToys.PowerDisplayModuleInterface.dll",
"WinUI3Apps\\PowerToys.PowerDisplay.dll",
"WinUI3Apps\\PowerToys.PowerDisplay.exe",
"PowerDisplay.Lib.dll",
"WinUI3Apps\\PowerToys.PowerRenameExt.dll",
"WinUI3Apps\\PowerToys.PowerRename.exe",
"WinUI3Apps\\PowerToys.PowerRenameContextMenu.dll",
"WinUI3Apps\\PowerRenameContextMenuPackage.msix",
"PowerToys.WorkspacesSnapshotTool.exe",
"PowerToys.WorkspacesLauncher.exe",
"PowerToys.WorkspacesWindowArranger.exe",
"PowerToys.WorkspacesEditor.exe",
"PowerToys.WorkspacesEditor.dll",
"PowerToys.WorkspacesLauncherUI.exe",
"PowerToys.WorkspacesLauncherUI.dll",
"PowerToys.WorkspacesModuleInterface.dll",
"PowerToys.WorkspacesCsharpLibrary.dll",
"WinUI3Apps\\PowerToys.RegistryPreviewExt.dll",
"WinUI3Apps\\PowerToys.RegistryPreviewUILib.dll",
"WinUI3Apps\\PowerToys.RegistryPreview.dll",
"WinUI3Apps\\PowerToys.RegistryPreview.exe",
"PowerToys.ShortcutGuide.exe",
"PowerToys.ShortcutGuideModuleInterface.dll",
"PowerToys.ZoomIt.exe",
"PowerToys.ZoomItModuleInterface.dll",
"PowerToys.ZoomItSettingsInterop.dll",
"WinUI3Apps\\PowerToys.Settings.dll",
"WinUI3Apps\\PowerToys.Settings.exe",
"PowerToys.CmdPalModuleInterface.dll",
"CmdPalKeyboardService.dll",
"PowerToys.ModuleContracts.dll",
"Awake.ModuleServices.dll",
"ColorPicker.ModuleServices.dll",
"Workspaces.ModuleServices.dll",
"Microsoft.CommandPalette.Extensions.dll",
"Microsoft.CommandPalette.Extensions.Toolkit.dll",
"Microsoft.CmdPal.Ext.PowerToys.dll",
"Microsoft.CmdPal.Ext.PowerToys.exe",
"*Microsoft.CmdPal.UI_*.msix",
"PowerToys.DSC.dll",
"PowerToys.DSC.exe",
"PowerToysSparse.msix"
],
"PowerToys.CmdPalModuleInterface.dll",
"*Microsoft.CmdPal.UI_*.msix"
],
"SigningInfo": {
"Operations": [
{
@@ -312,32 +272,41 @@
"Mono.Cecil.Pdb.dll",
"Mono.Cecil.Rocks.dll",
"Newtonsoft.Json.dll",
"CommunityToolkit.WinUI.Controls.TitleBar.dll",
"CommunityToolkit.WinUI.Controls.OpacityMaskView.dll",
"Newtonsoft.Json.Bson.dll",
"NLog.dll",
"HtmlAgilityPack.dll",
"Markdig.Signed.dll",
"HelixToolkit.dll",
"HelixToolkit.Core.Wpf.dll",
"Mages.Core.dll",
"JetBrains.Annotations.dll",
"NLog.Extensions.Logging.dll",
"getfilesiginforedist.dll",
"concrt140_app.dll",
"msvcp140_1_app.dll",
"msvcp140_2_app.dll",
"msvcp140_app.dll",
"Namotion.Reflection.dll",
"NJsonSchema.Annotations.dll",
"NJsonSchema.dll",
"vcamp140_app.dll",
"vccorlib140_app.dll",
"vcomp140_app.dll",
"vcruntime140_1_app.dll",
"vcruntime140_app.dll",
"WinUI3Apps\\CommunityToolkit.Labs.WinUI.SettingsControls.dll",
"UnicodeInformation.dll",
"Vanara.Core.dll",
"Vanara.PInvoke.ComCtl32.dll",
"Vanara.PInvoke.Cryptography.dll",
"Vanara.PInvoke.Gdi32.dll",
"Vanara.PInvoke.Kernel32.dll",
"Vanara.PInvoke.Ole.dll",
"Vanara.PInvoke.Rpc.dll",
"Vanara.PInvoke.Security.dll",
"Vanara.PInvoke.Shared.dll",
"Vanara.PInvoke.Shell32.dll",
"Vanara.PInvoke.ShlwApi.dll",
"Vanara.PInvoke.User32.dll",
"WinUI3Apps\\clrcompression.dll",
"WinUI3Apps\\Microsoft.Graphics.Canvas.Interop.dll",
"Microsoft.Web.WebView2.Core.dll",
"Microsoft.Web.WebView2.WinForms.dll",
"Microsoft.Web.WebView2.Wpf.dll",
@@ -356,37 +325,16 @@
"WinUI3Apps\\ReverseMarkdown.dll",
"WinUI3Apps\\SharpCompress.dll",
"WinUI3Apps\\ZstdSharp.dll",
"CommunityToolkit.WinUI.Controls.MarkdownTextBlock.dll",
"WinUI3Apps\\CommunityToolkit.WinUI.Controls.MarkdownTextBlock.dll",
"Markdig.dll",
"WinUI3Apps\\Markdig.dll",
"RomanNumerals.dll",
"WinUI3Apps\\RomanNumerals.dll",
"TestableIO.System.IO.Abstractions.dll",
"WinUI3Apps\\TestableIO.System.IO.Abstractions.dll",
"TestableIO.System.IO.Abstractions.Wrappers.dll",
"WinUI3Apps\\TestableIO.System.IO.Abstractions.Wrappers.dll",
"WinUI3Apps\\OpenAI.dll",
"Testably.Abstractions.FileSystem.Interface.dll",
"WinUI3Apps\\Testably.Abstractions.FileSystem.Interface.dll",
"ColorCode.Core.dll",
"Microsoft.SemanticKernel.Connectors.Ollama.dll",
"OllamaSharp.dll",
"boost_regex-vc143-mt-gd-x32-1_87.dll",
"boost_regex-vc143-mt-gd-x64-1_87.dll",
"boost_regex-vc143-mt-x32-1_87.dll",
"boost_regex-vc143-mt-x64-1_87.dll",
"Microsoft.ML.OnnxRuntime.dll",
"ColorCode.UWP.dll",
"UnitsNet.dll",
"UtfUnknown.dll",
"Wpf.Ui.dll",
"WmiLight.dll",
"WmiLight.Native.dll",
"Shmuelie.WinRTServer.dll",
"ToolGood.Words.Pinyin.dll"
"Wpf.Ui.dll"
],
"SigningInfo": {
"Operations": [

View File

@@ -0,0 +1,52 @@
{
"Version": "1.0.0",
"UseMinimatch": false,
"SignBatches": [
{
"MatchedPath": [
"PowerToysSetupCustomActions.dll",
"PowerToys*Setup-*.exe",
"PowerToys*Setup-*.msi"
],
"SigningInfo": {
"Operations": [
{
"KeyCode": "CP-230012",
"OperationSetCode": "SigntoolSign",
"Parameters": [
{
"parameterName": "OpusName",
"parameterValue": "Microsoft"
},
{
"parameterName": "OpusInfo",
"parameterValue": "http://www.microsoft.com"
},
{
"parameterName": "FileDigest",
"parameterValue": "/fd \"SHA256\""
},
{
"parameterName": "PageHash",
"parameterValue": "/NPH"
},
{
"parameterName": "TimeStamp",
"parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
}
],
"ToolName": "sign",
"ToolVersion": "1.0"
},
{
"KeyCode": "CP-230012",
"OperationSetCode": "SigntoolVerify",
"Parameters": [],
"ToolName": "sign",
"ToolVersion": "1.0"
}
]
}
}
]
}

View File

@@ -4,66 +4,9 @@
"SignBatches": [
{
"MatchedPath": [
"Microsoft.CommandPalette.Extensions.dll",
"Microsoft.CommandPalette.Extensions.Toolkit.dll"
],
"SigningInfo": {
"Operations": [
{
"KeyCode": "CP-233904-SN",
"OperationSetCode": "StrongNameSign",
"ToolName": "sign",
"ToolVersion": "1.0",
"Parameters": []
},
{
"KeyCode": "CP-233904-SN",
"OperationSetCode": "StrongNameVerify",
"ToolName": "sign",
"ToolVersion": "1.0",
"Parameters": []
},
{
"KeyCode": "CP-230012",
"OperationSetCode": "SigntoolSign",
"Parameters": [
{
"parameterName": "OpusName",
"parameterValue": "Microsoft"
},
{
"parameterName": "OpusInfo",
"parameterValue": "http://www.microsoft.com"
},
{
"parameterName": "FileDigest",
"parameterValue": "/fd \"SHA256\""
},
{
"parameterName": "PageHash",
"parameterValue": "/NPH"
},
{
"parameterName": "TimeStamp",
"parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
}
],
"ToolName": "sign",
"ToolVersion": "1.0"
},
{
"KeyCode": "CP-230012",
"OperationSetCode": "SigntoolVerify",
"Parameters": [],
"ToolName": "sign",
"ToolVersion": "1.0"
}
]
}
},
{
"MatchedPath": [
"Microsoft.CommandPalette.Extensions.dll"
],
"SigningInfo": {
"Operations": [
{

View File

@@ -1,176 +1,41 @@
Param(
# Using the default value of 1.7 for winAppSdkVersionNumber and useExperimentalVersion as false
# Using the default value of 1.6 for winAppSdkVersionNumber and useExperimentalVersion as false
[Parameter(Mandatory=$False,Position=1)]
[string]$winAppSdkVersionNumber = "1.8",
[string]$winAppSdkVersionNumber = "1.6",
# When the pipeline calls the PS1 file, the passed parameters are converted to string type
[Parameter(Mandatory=$False,Position=2)]
[boolean]$useExperimentalVersion = $False,
# Root folder Path for processing
[Parameter(Mandatory=$False,Position=3)]
[string]$rootPath = $(Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path)),
# Root folder Path for processing
[Parameter(Mandatory=$False,Position=4)]
[string]$sourceLink = "https://microsoft.pkgs.visualstudio.com/ProjectReunion/_packaging/Project.Reunion.nuget.internal/nuget/v3/index.json"
[boolean]$useExperimentalVersion = $False
)
function Read-FileWithEncoding {
function Update-NugetConfig {
param (
[string]$Path
[string]$filePath = "nuget.config"
)
$reader = New-Object System.IO.StreamReader($Path, $true) # auto-detect encoding
$content = $reader.ReadToEnd()
$encoding = $reader.CurrentEncoding
$reader.Close()
Write-Host "Updating nuget.config file"
[xml]$xml = Get-Content -Path $filePath
return [PSCustomObject]@{
Content = $content
Encoding = $encoding
# Add localpackages source into nuget.config
$packageSourcesNode = $xml.configuration.packageSources
$addNode = $xml.CreateElement("add")
$addNode.SetAttribute("key", "localpackages")
$addNode.SetAttribute("value", "localpackages")
$packageSourcesNode.AppendChild($addNode) | Out-Null
# Remove <packageSourceMapping> tag and its content
$packageSourceMappingNode = $xml.configuration.packageSourceMapping
if ($packageSourceMappingNode) {
$xml.configuration.RemoveChild($packageSourceMappingNode) | Out-Null
}
# print nuget.config after modification
$xml.OuterXml
# Save the modified nuget.config file
$xml.Save($filePath)
}
function Write-FileWithEncoding {
param (
[string]$Path,
[string]$Content,
[System.Text.Encoding]$Encoding
)
$writer = New-Object System.IO.StreamWriter($Path, $false, $Encoding)
$writer.Write($Content)
$writer.Close()
}
function Add-NuGetSourceAndMapping {
param (
[xml]$Xml,
[string]$Key,
[string]$Value,
[string[]]$Patterns
)
# Ensure packageSources exists
if (-not $Xml.configuration.packageSources) {
$Xml.configuration.AppendChild($Xml.CreateElement("packageSources")) | Out-Null
}
$sources = $Xml.configuration.packageSources
# Add/Update Source
$sourceNode = $sources.SelectSingleNode("add[@key='$Key']")
if (-not $sourceNode) {
$sourceNode = $Xml.CreateElement("add")
$sourceNode.SetAttribute("key", $Key)
$sources.AppendChild($sourceNode) | Out-Null
}
$sourceNode.SetAttribute("value", $Value)
# Ensure packageSourceMapping exists
if (-not $Xml.configuration.packageSourceMapping) {
$Xml.configuration.AppendChild($Xml.CreateElement("packageSourceMapping")) | Out-Null
}
$mapping = $Xml.configuration.packageSourceMapping
# Remove invalid packageSource nodes (missing key or empty key)
$invalidNodes = $mapping.SelectNodes("packageSource[not(@key) or @key='']")
if ($invalidNodes) {
foreach ($node in $invalidNodes) {
$mapping.RemoveChild($node) | Out-Null
}
}
# Add/Update Mapping Source
$mappingSource = $mapping.SelectSingleNode("packageSource[@key='$Key']")
if (-not $mappingSource) {
$mappingSource = $Xml.CreateElement("packageSource")
$mappingSource.SetAttribute("key", $Key)
# Insert at top for priority
if ($mapping.HasChildNodes) {
$mapping.InsertBefore($mappingSource, $mapping.FirstChild) | Out-Null
} else {
$mapping.AppendChild($mappingSource) | Out-Null
}
}
# Double check and force attribute
if (-not $mappingSource.HasAttribute("key")) {
$mappingSource.SetAttribute("key", $Key)
}
# Update Patterns
# RemoveAll() removes all child nodes AND attributes, so we must re-set the key afterwards
$mappingSource.RemoveAll()
$mappingSource.SetAttribute("key", $Key)
foreach ($pattern in $Patterns) {
$pkg = $Xml.CreateElement("package")
$pkg.SetAttribute("pattern", $pattern)
$mappingSource.AppendChild($pkg) | Out-Null
}
}
function Resolve-WinAppSdkSplitDependencies {
Write-Host "Version $WinAppSDKVersion detected. Resolving split dependencies..."
$installDir = Join-Path $rootPath "localpackages\output"
New-Item -ItemType Directory -Path $installDir -Force | Out-Null
# Create a temporary nuget.config to avoid interference from the repo's config
$tempConfig = Join-Path $env:TEMP "nuget_$(Get-Random).config"
Set-Content -Path $tempConfig -Value "<?xml version='1.0' encoding='utf-8'?><configuration><packageSources><clear /><add key='TempSource' value='$sourceLink' /></packageSources></configuration>"
try {
# Extract BuildTools version from Directory.Packages.props to ensure we have the required version
$dirPackagesProps = Join-Path $rootPath "Directory.Packages.props"
if (Test-Path $dirPackagesProps) {
$propsContent = Get-Content $dirPackagesProps -Raw
if ($propsContent -match '<PackageVersion Include="Microsoft.Windows.SDK.BuildTools" Version="([^"]+)"') {
$buildToolsVersion = $Matches[1]
Write-Host "Downloading Microsoft.Windows.SDK.BuildTools version $buildToolsVersion..."
$nugetArgsBuildTools = "install Microsoft.Windows.SDK.BuildTools -Version $buildToolsVersion -ConfigFile $tempConfig -OutputDirectory $installDir -NonInteractive -NoCache"
Invoke-Expression "nuget $nugetArgsBuildTools" | Out-Null
}
}
# Download package to inspect nuspec and keep it for the build
$nugetArgs = "install Microsoft.WindowsAppSDK -Version $WinAppSDKVersion -ConfigFile $tempConfig -OutputDirectory $installDir -NonInteractive -NoCache"
Invoke-Expression "nuget $nugetArgs" | Out-Null
# Parse dependencies from the installed folders
# Folder structure is typically {PackageId}.{Version}
$directories = Get-ChildItem -Path $installDir -Directory
$allLocalPackages = @()
foreach ($dir in $directories) {
# Match any package pattern: PackageId.Version
if ($dir.Name -match "^(.+?)\.(\d+\..*)$") {
$pkgId = $Matches[1]
$pkgVer = $Matches[2]
$allLocalPackages += $pkgId
$packageVersions[$pkgId] = $pkgVer
Write-Host "Found dependency: $pkgId = $pkgVer"
}
}
# Update repo's nuget.config to use localpackages
$nugetConfig = Join-Path $rootPath "nuget.config"
$configData = Read-FileWithEncoding -Path $nugetConfig
[xml]$xml = $configData.Content
Add-NuGetSourceAndMapping -Xml $xml -Key "localpackages" -Value $installDir -Patterns $allLocalPackages
$xml.Save($nugetConfig)
Write-Host "Updated nuget.config with localpackages mapping."
} catch {
Write-Warning "Failed to resolve dependencies: $_"
} finally {
Remove-Item $tempConfig -Force -ErrorAction SilentlyContinue
}
}
$sourceLink = "https://microsoft.pkgs.visualstudio.com/ProjectReunion/_packaging/Project.Reunion.nuget.internal/nuget/v3/index.json"
# Execute nuget list and capture the output
if ($useExperimentalVersion) {
@@ -213,36 +78,53 @@ if ($latestVersion) {
exit 1
}
# Resolve dependencies for 1.8+
$packageVersions = @{ "Microsoft.WindowsAppSDK" = $WinAppSDKVersion }
Resolve-WinAppSdkSplitDependencies
# Update packages.config files
Get-ChildItem -Recurse packages.config | ForEach-Object {
$content = Get-Content $_.FullName -Raw
if ($content -match 'package id="Microsoft.WindowsAppSDK"') {
$newVersionString = 'package id="Microsoft.WindowsAppSDK" version="' + $WinAppSDKVersion + '"'
$oldVersionString = 'package id="Microsoft.WindowsAppSDK" version="[-.0-9a-zA-Z]*"'
$content = $content -replace $oldVersionString, $newVersionString
Set-Content -Path $_.FullName -Value $content
Write-Host "Modified " $_.FullName
}
}
# Update Directory.Packages.props file
Get-ChildItem -Path $rootPath -Recurse "Directory.Packages.props" | ForEach-Object {
$file = Read-FileWithEncoding -Path $_.FullName
$content = $file.Content
$isModified = $false
foreach ($pkgId in $packageVersions.Keys) {
$ver = $packageVersions[$pkgId]
# Escape dots in package ID for regex
$pkgIdRegex = $pkgId -replace '\.', '\.'
$newVersionString = "<PackageVersion Include=""$pkgId"" Version=""$ver"" />"
$oldVersionString = "<PackageVersion Include=""$pkgIdRegex"" Version=""[-.0-9a-zA-Z]*"" />"
if ($content -match "<PackageVersion Include=""$pkgIdRegex""") {
# Update existing package
if ($content -notmatch [regex]::Escape($newVersionString)) {
$content = $content -replace $oldVersionString, $newVersionString
$isModified = $true
}
}
$propsFile = "Directory.Packages.props"
if (Test-Path $propsFile) {
$content = Get-Content $propsFile -Raw
if ($content -match '<PackageVersion Include="Microsoft.WindowsAppSDK"') {
$newVersionString = '<PackageVersion Include="Microsoft.WindowsAppSDK" Version="' + $WinAppSDKVersion + '" />'
$oldVersionString = '<PackageVersion Include="Microsoft.WindowsAppSDK" Version="[-.0-9a-zA-Z]*" />'
$content = $content -replace $oldVersionString, $newVersionString
Set-Content -Path $propsFile -Value $content
Write-Host "Modified " $propsFile
}
}
if ($isModified) {
Write-FileWithEncoding -Path $_.FullName -Content $content -Encoding $file.encoding
# Update .vcxproj files
Get-ChildItem -Recurse *.vcxproj | ForEach-Object {
$content = Get-Content $_.FullName -Raw
if ($content -match '\\Microsoft.WindowsAppSDK.') {
$newVersionString = '\Microsoft.WindowsAppSDK.' + $WinAppSDKVersion + '\'
$oldVersionString = '\\Microsoft.WindowsAppSDK.[-.0-9a-zA-Z]*\\'
$content = $content -replace $oldVersionString, $newVersionString
Set-Content -Path $_.FullName -Value $content
Write-Host "Modified " $_.FullName
}
}
# Update .csproj files
Get-ChildItem -Recurse *.csproj | ForEach-Object {
$content = Get-Content $_.FullName -Raw
if ($content -match 'PackageReference Include="Microsoft.WindowsAppSDK"') {
$newVersionString = 'PackageReference Include="Microsoft.WindowsAppSDK" Version="'+ $WinAppSDKVersion + '"'
$oldVersionString = 'PackageReference Include="Microsoft.WindowsAppSDK" Version="[-.0-9a-zA-Z]*"'
$content = $content -replace $oldVersionString, $newVersionString
Set-Content -Path $_.FullName -Value $content
Write-Host "Modified " $_.FullName
}
}
Update-NugetConfig

View File

@@ -41,9 +41,6 @@ Write-Output ""
Write-Output "Restoring dotnet tools..."
dotnet tool restore --disable-parallel --no-cache
# Use Regex syntax
$PathExcludes = "(\\obj\\)|(\\bin\\)|(\\x64\\)|(\\Generated Files\\PowerRenameXAML\\)|(\\RegistryPreviewUILib\\Controls\\HexBox\\)"
if (-not $Passive)
{
# Look for unstaged changed files by default
@@ -90,7 +87,7 @@ if (-not $Passive)
}
Write-Output "Running Git Diff: $gitDiffCommand"
$files = Invoke-Expression $gitDiffCommand | Select-String -Pattern "\.xaml$" | Where-Object { $_ -notmatch $PathExcludes }
$files = Invoke-Expression $gitDiffCommand | Select-String -Pattern "\.xaml$"
if (-not $Passive -and -not $Main -and -not $Unstaged -and -not $Staged -and -not $LastCommit)
{
@@ -110,7 +107,7 @@ if (-not $Passive)
else
{
Write-Output "Checking all files (passively)"
$files = Get-ChildItem -Path "$PSScriptRoot\..\src\*.xaml" -Recurse | Select-Object -ExpandProperty FullName | Where-Object { $_ -notmatch $PathExcludes }
$files = Get-ChildItem -Path "$PSScriptRoot\..\src\*.xaml" -Recurse | Select-Object -ExpandProperty FullName | Where-Object { $_ -notmatch "(\\obj\\)|(\\bin\\)|(\\x64\\)|(\\Generated Files\\PowerRenameXAML\\)" }
if ($files.count -gt 0)
{

View File

@@ -1,95 +0,0 @@
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$BuildPlatform,
[Parameter(Mandatory = $true)]
[string]$BuildConfiguration,
[Parameter()]
[string]$RepoRoot = (Get-Location).Path
)
$ErrorActionPreference = 'Stop'
function Resolve-PlatformDirectory {
param(
[string]$Root,
[string]$Platform
)
$normalized = $Platform.Trim()
$candidates = @()
$candidates += Join-Path $Root $normalized
$candidates += Join-Path $Root ($normalized.ToUpperInvariant())
$candidates += Join-Path $Root ($normalized.ToLowerInvariant())
$candidates = $candidates | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | Select-Object -Unique
foreach ($candidate in $candidates) {
if (Test-Path $candidate) {
return $candidate
}
}
return $candidates[0]
}
Write-Host "Repo root: $RepoRoot"
Write-Host "Requested build platform: $BuildPlatform"
Write-Host "Requested configuration: $BuildConfiguration"
# Always use x64 PowerToys.DSC.exe since CI/CD machines are x64
$exePlatform = 'x64'
$exeRoot = Resolve-PlatformDirectory -Root $RepoRoot -Platform $exePlatform
$exeOutputDir = Join-Path $exeRoot $BuildConfiguration
$exePath = Join-Path $exeOutputDir 'PowerToys.DSC.exe'
Write-Host "Using x64 PowerToys.DSC.exe to generate DSC manifests for $BuildPlatform build"
if (-not (Test-Path $exePath)) {
throw "PowerToys.DSC.exe not found at '$exePath'. Make sure it has been built first."
}
Write-Host "Using PowerToys.DSC.exe at '$exePath'."
# Output DSC manifests to the target build platform directory (x64, ARM64, etc.)
$outputRoot = Resolve-PlatformDirectory -Root $RepoRoot -Platform $BuildPlatform
if (-not (Test-Path $outputRoot)) {
Write-Host "Creating missing platform output root at '$outputRoot'."
New-Item -Path $outputRoot -ItemType Directory -Force | Out-Null
}
$outputDir = Join-Path $outputRoot $BuildConfiguration
if (-not (Test-Path $outputDir)) {
Write-Host "Creating missing configuration output directory at '$outputDir'."
New-Item -Path $outputDir -ItemType Directory -Force | Out-Null
}
# DSC v3 manifests go to DSCModules subfolder
$dscOutputDir = Join-Path $outputDir 'DSCModules'
if (-not (Test-Path $dscOutputDir)) {
Write-Host "Creating DSCModules subfolder at '$dscOutputDir'."
New-Item -Path $dscOutputDir -ItemType Directory -Force | Out-Null
}
Write-Host "DSC manifests will be generated to: '$dscOutputDir'"
Write-Host "Cleaning previously generated DSC manifest files from '$dscOutputDir'."
Get-ChildItem -Path $dscOutputDir -Filter 'microsoft.powertoys.*.settings.dsc.resource.json' -ErrorAction SilentlyContinue | Remove-Item -Force
$arguments = @('manifest', '--resource', 'settings', '--outputDir', $dscOutputDir)
Write-Host "Invoking DSC manifest generator: '$exePath' $($arguments -join ' ')"
& $exePath @arguments
if ($LASTEXITCODE -ne 0) {
throw "PowerToys.DSC.exe exited with code $LASTEXITCODE"
}
$generatedFiles = Get-ChildItem -Path $dscOutputDir -Filter 'microsoft.powertoys.*.settings.dsc.resource.json' -ErrorAction Stop
if ($generatedFiles.Count -eq 0) {
throw "No DSC manifest files were generated in '$dscOutputDir'."
}
Write-Host "Generated $($generatedFiles.Count) DSC manifest file(s):"
foreach ($file in $generatedFiles) {
Write-Host " - $($file.FullName)"
}

View File

@@ -1,46 +0,0 @@
param(
[Parameter()]
[ValidateSet("Machine", "PerUser")]
[string]$InstallMode = "Machine"
)
$ProgressPreference = 'SilentlyContinue'
# Get artifact path
$ArtifactPath = $ENV:BUILD_ARTIFACTSTAGINGDIRECTORY
if (-not $ArtifactPath) {
throw "BUILD_ARTIFACTSTAGINGDIRECTORY environment variable not set"
}
# Since we only download PowerToysSetup-*.exe files, we can directly find it
$Installer = Get-ChildItem -Path $ArtifactPath -Filter 'PowerToys*.exe' | Select-Object -First 1
if (-not $Installer) {
throw "PowerToys installer not found"
}
Write-Host "Installing PowerToys: $($Installer.Name)"
# Install PowerToys
$Process = Start-Process -Wait -FilePath $Installer.FullName -ArgumentList "/passive", "/norestart" -PassThru -NoNewWindow
if ($Process.ExitCode -eq 0 -or $Process.ExitCode -eq 3010) {
Write-Host "✅ PowerToys installation completed successfully"
} else {
throw "PowerToys installation failed with exit code: $($Process.ExitCode)"
}
# Verify installation
if ($InstallMode -eq "PerUser") {
if (Test-Path "${env:LOCALAPPDATA}\PowerToys\PowerToys.exe") {
Write-Host "✅ PowerToys verified at: ${env:LOCALAPPDATA}\PowerToys\PowerToys.exe"
} else {
throw "PowerToys installation verification failed"
}
} else {
if (Test-Path "${env:ProgramFiles}\PowerToys\PowerToys.exe") {
Write-Host "✅ PowerToys verified at: ${env:ProgramFiles}\PowerToys\PowerToys.exe"
} else {
throw "PowerToys installation verification failed"
}
}

26
.pipelines/installWiX.ps1 Normal file
View File

@@ -0,0 +1,26 @@
$ProgressPreference = 'SilentlyContinue'
$WixDownloadUrl = "https://github.com/wixtoolset/wix3/releases/download/wix3141rtm/wix314.exe"
$WixBinariesDownloadUrl = "https://github.com/wixtoolset/wix3/releases/download/wix3141rtm/wix314-binaries.zip"
# Download WiX binaries and verify their hash sums
Invoke-WebRequest -Uri $WixDownloadUrl -OutFile "$($ENV:Temp)\wix314.exe"
$Hash = (Get-FileHash -Algorithm SHA256 "$($ENV:Temp)\wix314.exe").Hash
if ($Hash -ne '6BF6D03D6923D9EF827AE1D943B90B42B8EBB1B0F68EF6D55F868FA34C738A29')
{
Write-Error "$WixHash"
throw "wix314.exe has unexpected SHA256 hash: $Hash"
}
Invoke-WebRequest -Uri $WixBinariesDownloadUrl -OutFile "$($ENV:Temp)\wix314-binaries.zip"
$Hash = (Get-FileHash -Algorithm SHA256 "$($ENV:Temp)\wix314-binaries.zip").Hash
if($Hash -ne '6AC824E1642D6F7277D0ED7EA09411A508F6116BA6FAE0AA5F2C7DAA2FF43D31')
{
throw "wix314-binaries.zip has unexpected SHA256 hash: $Hash"
}
# Install WiX
Start-Process -Wait -FilePath "$($ENV:Temp)\wix314.exe" -ArgumentList "/install /quiet"
# Extract WiX binaries and copy wix.targets to the installed dir
Expand-Archive -Path "$($ENV:Temp)\wix314-binaries.zip" -Force -DestinationPath "$($ENV:Temp)"
Copy-Item -Path "$($ENV:Temp)\wix.targets" -Destination "C:\Program Files (x86)\WiX Toolset v3.14\"

View File

@@ -25,12 +25,12 @@ steps:
fetchDepth: 1 # Don't need a deep checkout for loc files!
persistCredentials: true
- task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@5
- task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@3
displayName: 'Touchdown Build - 37400, PRODEXT'
inputs:
teamId: 37400
FederatedIdentityTDBuildServiceConnection: $(TouchdownServiceConnection)
authType: FederatedIdentityTDBuild
TDBuildServiceConnection: $(TouchdownServiceConnection)
authType: SubjectNameIssuer
resourceFilePath: |
src\**\Resources.resx
src\**\Resource.resx

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.PowerToys.Telemetry" version="2.0.4" />
<package id="Microsoft.PowerToys.Telemetry" version="2.0.2" />
</packages>

View File

@@ -3,5 +3,5 @@
"notificationAliases": ["powertoys@microsoft.com"],
"instanceUrl": "https://microsoft.visualstudio.com",
"projectName": "OS",
"areaPath": "OS\\Windows Client and Services\\WinPD\\DFX-Developer Fundamentals and Experiences\\DEFT\\PowerToys"
"areaPath": "OS\\Windows Client and Services\\WinPD\\DEEP-Developer Experience, Ecosystem and Partnerships\\SHINE\\PowerToys"
}

View File

@@ -1,38 +0,0 @@
# .pipelines/v2/nightly-prewarm.yml
# Nightly pre-warm that reuses your existing ci.yml as-is
trigger: none
pr: none
# (18:00 UTC) — adjust as you like
schedules:
- cron: "0 18 * * *" # UTC
displayName: Nightly pre-warm (main)
branches:
include:
- main
always: true
name: $(BuildDefinitionName)_$(date:yyMM).$(date:dd)$(rev:rrr)
parameters:
- name: buildPlatforms
type: object
default:
- x64
- arm64
- name: enableMsBuildCaching
type: boolean
displayName: "Enable MSBuild Caching"
default: true
- name: msBuildCacheIsReadOnly
type: boolean
displayName: "MSBuild Cache Read Only"
default: false
extends:
template: templates/pipeline-ci-build.yml
parameters:
buildPlatforms: ${{ parameters.buildPlatforms }}
enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
msBuildCacheIsReadOnly: ${{ parameters.msBuildCacheIsReadOnly }}

View File

@@ -19,7 +19,7 @@ parameters:
- name: enableMsBuildCaching
type: boolean
displayName: "Enable MSBuild Caching"
default: true
default: false
- name: runTests
type: boolean
displayName: "Run Tests"
@@ -36,8 +36,7 @@ extends:
template: templates/pipeline-ci-build.yml
parameters:
buildPlatforms: ${{ parameters.buildPlatforms }}
${{ if eq(variables['System.PullRequest.IsFork'], 'False') }}:
enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
runTests: ${{ parameters.runTests }}
useVSPreview: ${{ parameters.useVSPreview }}
useLatestWebView2: ${{ parameters.useLatestWebView2 }}

View File

@@ -33,7 +33,7 @@ parameters:
default: true
- name: winAppSDKVersionNumber
type: string
default: 1.8
default: 1.6
- name: useExperimentalVersion
type: boolean
default: false
@@ -42,8 +42,7 @@ extends:
template: templates/pipeline-ci-build.yml
parameters:
buildPlatforms: ${{ parameters.buildPlatforms }}
${{ if eq(variables['System.PullRequest.IsFork'], 'False') }}:
enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
runTests: ${{ parameters.runTests }}
useVSPreview: ${{ parameters.useVSPreview }}
useLatestWinAppSDK: ${{ parameters.useLatestWinAppSDK }}

View File

@@ -46,7 +46,6 @@ extends:
template: templates/pipeline-ci-build.yml
parameters:
buildPlatforms: ${{ parameters.buildPlatforms }}
${{ if eq(variables['System.PullRequest.IsFork'], 'False') }}:
enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
runTests: ${{ parameters.runTests }}
useVSPreview: ${{ parameters.useVSPreview }}

View File

@@ -35,9 +35,7 @@ stages:
${{ else }}:
name: SHINE-OSS-L
${{ if eq(parameters.useVSPreview, true) }}:
demands: ImageOverride -equals SHINE-VS18-Preview
${{ else }}:
demands: ImageOverride -equals SHINE-VS18-Latest
demands: ImageOverride -equals SHINE-VS17-Preview
buildPlatforms:
- ${{ parameters.platform }}
buildConfigurations: [Release]
@@ -45,7 +43,6 @@ stages:
enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
runTests: true
useVSPreview: ${{ parameters.useVSPreview }}
timeoutInMinutes: 90
- stage: OneFuzz
displayName: Fuzz ${{ parameters.platform }}

View File

@@ -20,6 +20,16 @@ parameters:
type: string
default: '0.0.1'
- name: cmdPalVersionNumber
displayName: "Command Palette Version Number"
type: string
default: '0.0.1'
- name: cmdPalSdkVersionNumber
displayName: "Command Palette SDK Version Number"
type: string
default: '0.0.1'
- name: buildConfigurations
displayName: "Build Configurations"
type: object
@@ -40,9 +50,6 @@ parameters:
name: $(BuildDefinitionName)_$(date:yyMM).$(date:dd)$(rev:rrr)
variables:
- template: templates/variables-nuget-package-version.yml
extends:
template: v1/1ES.Official.PipelineTemplate.yml@1ESPipelineTemplates
parameters:
@@ -51,18 +58,14 @@ extends:
pool:
name: SHINE-INT-S
${{ if eq(parameters.useVSPreview, true) }}:
demands: ImageOverride -equals SHINE-VS18-Preview
demands: ImageOverride -equals SHINE-VS17-Preview
${{ else }}:
demands: ImageOverride -equals SHINE-VS18-Latest
image: SHINE-VS17-Latest
os: windows
sdl:
tsa:
enabled: true
configFile: '$(Build.SourcesDirectory)\.pipelines\tsa.json'
binskim:
enabled: true
# Exclude every dll/exe in tests/*, as well as all msdia*, covrun* and vcruntime*
analyzeTargetGlob: +:file|$(Build.ArtifactStagingDirectory)/**/*.dll;+:file|$(Build.ArtifactStagingDirectory)/**/*.exe;-:file:regex|tests.*\.(dll|exe)$;-:file:regex|(covrun.*)\.dll$;-:file:regex|(msdia.*)\.dll$;-:file:regex|(vcruntime.*)\.dll$
stages:
- stage: Build
@@ -73,12 +76,10 @@ extends:
parameters:
pool:
name: SHINE-INT-L
demands:
# Our INT agents have a large disk mounted at P:\
- ${{ if eq(parameters.useVSPreview, true) }}:
- ImageOverride -equals SHINE-VS18-Latest-Preview
- ${{ else }}:
- ImageOverride -equals SHINE-VS18-Latest
${{ if eq(parameters.useVSPreview, true) }}:
demands: ImageOverride -equals SHINE-VS17-Preview
${{ else }}:
image: SHINE-VS17-Latest
os: windows
variables:
IsPipeline: 1 # The installer uses this to detect whether it should pick up localizations
@@ -87,11 +88,10 @@ extends:
buildPlatforms: ${{ parameters.buildPlatforms }}
buildConfigurations: ${{ parameters.buildConfigurations }}
versionNumber: ${{ parameters.versionNumber }}
cmdPalVersionNumber: ${{ parameters.cmdPalVersionNumber }}
publishArtifacts: false # 1ES PT handles publication for us.
official: true
codeSign: true
runTests: false
buildTests: false
signingIdentity:
serviceName: $(SigningServiceName)
appId: $(SigningAppId)
@@ -102,22 +102,20 @@ extends:
useManagedIdentity: $(SigningUseManagedIdentity)
clientId: $(SigningOriginalClientId)
# Have msbuild use the release nuget config profile
additionalBuildOptions: /p:RestoreConfigFile="$(Build.SourcesDirectory)\.pipelines\release-nuget.config" /p:EnableCmdPalAOT=true
additionalBuildOptions: /p:RestoreConfigFile="$(Build.SourcesDirectory)\.pipelines\release-nuget.config"
beforeBuildSteps:
# Sets versions for all PowerToy created DLLs
- pwsh: |-
.pipelines/versionSetting.ps1 -versionNumber '${{ parameters.versionNumber }}' -DevEnvironment ''
.pipelines/versionSetting.ps1 -versionNumber '${{ parameters.versionNumber }}' -DevEnvironment '' -cmdPalVersionNumber '${{ parameters.cmdPalVersionNumber }}'
displayName: Prepare versioning
# Prepare the localizations and telemetry config before the release build
- template: .pipelines/v2/templates/steps-fetch-and-prepare-localizations.yml@self
- pwsh: |-
$ErrorActionPreference = 'Stop'
$PSNativeCommandUseErrorActionPreference = $true
& nuget.exe restore -configFile .pipelines/release-nuget.config -PackagesDirectory . .pipelines/packages.config
Move-Item -Force -Verbose "Microsoft.PowerToys.Telemetry.*\build\include\TraceLoggingDefines.h" "src\common\Telemetry\TraceLoggingDefines.h"
Move-Item -Force -Verbose "Microsoft.PowerToys.Telemetry.*\build\include\TelemetryBase.cs" "src\common\Telemetry\TelemetryBase.cs"
- script: |
call nuget.exe restore -configFile .pipelines/release-nuget.config -PackagesDirectory . .pipelines/packages.config || exit /b 1
move /Y "Microsoft.PowerToys.Telemetry.2.0.2\build\include\TraceLoggingDefines.h" "src\common\Telemetry\TraceLoggingDefines.h" || exit /b 1
move /Y "Microsoft.PowerToys.Telemetry.2.0.2\build\include\TelemetryBase.cs" "src\common\Telemetry\TelemetryBase.cs" || exit /b 1
displayName: Emplace telemetry files
- stage: Build_SDK
@@ -128,9 +126,10 @@ extends:
parameters:
pool:
name: SHINE-INT-L
image: SHINE-VS17-Latest
os: windows
official: true
codeSign: true
sdkVersionNumber: ${{ parameters.cmdPalSdkVersionNumber }}
signingIdentity:
serviceName: $(SigningServiceName)
appId: $(SigningAppId)
@@ -149,7 +148,5 @@ extends:
parameters:
versionNumber: ${{ parameters.versionNumber }}
includePublicSymbolServer: ${{ parameters.publishSymbolsToPublic }}
${{ if ne(parameters.publishSymbolsToPublic, true) }}:
symbolExpiryTime: 10 # For private builds, expire symbols within 10 days. The default is 100 years.
subscription: $(SymbolPublishingServiceConnection)
symbolProject: $(SymbolPublishingProject)

View File

@@ -11,9 +11,6 @@ parameters:
default:
- x64
- arm64
- name: official
type: boolean
default: false
- name: codeSign
type: boolean
default: false
@@ -50,21 +47,18 @@ parameters:
- name: enableMsBuildCaching
type: boolean
default: false
- name: msBuildCacheIsReadOnly
type: boolean
default: true
- name: runTests
type: boolean
default: true
- name: buildTests
type: boolean
default: true
- name: useVSPreview
type: boolean
default: false
- name: versionNumber
type: string
default: '0.0.1'
- name: cmdPalVersionNumber
type: string
default: '0.0.1'
- name: useLatestWinAppSDK
type: boolean
default: false
@@ -84,12 +78,6 @@ parameters:
- 'src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj'
- 'src/modules/previewpane/SvgThumbnailProvider/SvgThumbnailProvider.csproj'
- 'src/modules/FileLocksmith/FileLocksmithUI/FileLocksmithUI.csproj'
- name: timeoutInMinutes
type: number
default: 240
- name: cancelTimeoutInMinutes
type: number
default: 1
jobs:
- job: ${{ parameters.jobName }}
@@ -111,8 +99,7 @@ jobs:
${{ else }}:
OutputBuildPlatform: ${{ platform }}
variables:
NUGET_PACKAGES: 'C:\NuGetPackages' # Some of our build steps cache these here... and it was apparently part of the global environment
MakeAppxPath: 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x86\MakeAppx.exe'
MakeAppxPath: 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86\MakeAppx.exe'
# Azure DevOps abhors a vacuum
# If these are blank, expansion will fail later on... which will result in direct substitution of the variable *names*
# later on. We'll just... set them to a single space and if we need to, check IsNullOrWhiteSpace.
@@ -123,27 +110,23 @@ jobs:
JobOutputArtifactName: build-$(BuildPlatform)-$(BuildConfiguration)${{ parameters.artifactStem }}
NUGET_RESTORE_MSBUILD_ARGS: /p:Platform=$(BuildPlatform) # Required for nuget to work due to self contained
NODE_OPTIONS: --max_old_space_size=16384
${{ if or(eq(parameters.runTests, true), eq(parameters.buildTests, true)) }}:
${{ if eq(parameters.runTests, true) }}:
MSBuildMainBuildTargets: Build;Test
${{ else }}:
MSBuildMainBuildTargets: Build
${{ insert }}: ${{ parameters.variables }}
${{ if eq(parameters.useLatestWinAppSDK, true) }}:
RestoreAdditionalProjectSourcesArg: '/p:RestoreAdditionalProjectSources="$(Build.SourcesDirectory)\localpackages\NugetPackages" /p:IgnoreExperimentalWarnings=true'
RestoreAdditionalProjectSourcesArg: '/p:RestoreAdditionalProjectSources="$(Build.SourcesDirectory)\localpackages\NugetPackages"'
${{ else }}:
RestoreAdditionalProjectSourcesArg: ''
displayName: Build
timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
cancelTimeoutInMinutes: ${{ parameters.cancelTimeoutInMinutes }}
timeoutInMinutes: 240
cancelTimeoutInMinutes: 1
templateContext: # Required when this template is hosted in 1ES PT
outputs:
- output: pipelineArtifact
artifactName: $(JobOutputArtifactName)
targetPath: $(Build.ArtifactStagingDirectory)
- output: pipelineArtifact
artifactName: $(JobOutputArtifactName)-failure-$(System.JobAttempt)
targetPath: $(LogOutputDirectory)
condition: or(failed(), canceled())
steps:
- checkout: self
clean: true
@@ -159,11 +142,6 @@ jobs:
$MSBuildCacheParameters += " -reportfileaccesses"
$MSBuildCacheParameters += " -p:MSBuildCacheEnabled=true"
$MSBuildCacheParameters += " -p:MSBuildCacheLogDirectory=$(LogOutputDirectory)\MSBuildCacheLogs"
# Cache read-only policy controlled by parameter
$cacheIsReadOnly = "${{ parameters.msBuildCacheIsReadOnly }}"
if ($cacheIsReadOnly -eq "True") {
$MSBuildCacheParameters += " /p:MSBuildCacheRemoteCacheIsReadOnly=true"
}
Write-Host "MSBuildCacheParameters: $MSBuildCacheParameters"
Write-Host "##vso[task.setvariable variable=MSBuildCacheParameters]$MSBuildCacheParameters"
displayName: Prepare MSBuildCache variables
@@ -192,14 +170,14 @@ jobs:
displayName: Verify XAML formatting
- pwsh: |-
& '.pipelines/verifyNugetPackages.ps1' -solution '$(build.sourcesdirectory)\PowerToys.slnx'
displayName: Verify Nuget package versions for PowerToys.slnx
& '.pipelines/verifyNugetPackages.ps1' -solution '$(build.sourcesdirectory)\PowerToys.sln'
displayName: Verify Nuget package versions for PowerToys.sln
- pwsh: |-
& '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\PowerToys.slnx'
& '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\PowerToys.sln'
& '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\tools\BugReportTool\BugReportTool.sln'
& '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\tools\StylesReportTool\StylesReportTool.sln'
& '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\installer\PowerToysSetup.slnx'
& '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\installer\PowerToysSetup.sln'
displayName: Verify ARM64 configurations
- ${{ if eq(parameters.enablePackageCaching, true) }}:
@@ -237,12 +215,9 @@ jobs:
env:
VCWhereExtraVersionTarget: '-prerelease'
- ${{ if eq(parameters.official, true) }}:
- template: .\steps-setup-versioning.yml
parameters:
directory: $(build.sourcesdirectory)\src\modules\cmdpal
- pwsh: |-
& "$(build.sourcesdirectory)\.pipelines\installWiX.ps1"
displayName: Download and install WiX 3.14 development build
- ${{ parameters.beforeBuildSteps }}
@@ -252,13 +227,12 @@ jobs:
${{ else }}:
displayName: Build PowerToys main project
inputs:
solution: 'PowerToys.slnx'
vsVersion: 18.0
solution: 'PowerToys.sln'
vsVersion: 17.0
msbuildArgs: >-
-restore -graph
/p:RestorePackagesConfig=true
/p:CIBuild=true
/p:BuildTests=${{ parameters.buildTests }}
/bl:$(LogOutputDirectory)\build-0-main.binlog
${{ parameters.additionalBuildOptions }}
$(MSBuildCacheParameters)
@@ -272,43 +246,6 @@ jobs:
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- task: VSBuild@1
displayName: Generate DSC artifacts for ARM64
condition: and(succeeded(), eq(variables['BuildPlatform'], 'arm64'))
inputs:
solution: PowerToys.slnx
vsVersion: 18.0
msbuildArgs: >-
-restore
/p:Configuration=$(BuildConfiguration)
/p:Platform=x64
/t:DSC\PowerToys_Settings_DSC_Schema_Generator
/bl:$(LogOutputDirectory)\build-dsc-generator.binlog
${{ parameters.additionalBuildOptions }}
$(MSBuildCacheParameters)
$(RestoreAdditionalProjectSourcesArg)
platform: x64
configuration: $(BuildConfiguration)
msbuildArchitecture: x64
maximumCpuCount: true
# Build PowerToys.DSC.exe for ARM64 (x64 uses existing binary from previous build)
- task: VSBuild@1
displayName: Build PowerToys.DSC.exe (x64 for generating manifests)
condition: and(succeeded(), ne(variables['BuildPlatform'], 'x64'))
inputs:
solution: src/dsc/v3/PowerToys.DSC/PowerToys.DSC.csproj
msbuildArgs: /t:Build /m /restore
platform: x64
configuration: $(BuildConfiguration)
msbuildArchitecture: x64
maximumCpuCount: true
# Generate DSC manifests using PowerToys.DSC.exe
- pwsh: |-
& '.pipelines/generateDscManifests.ps1' -BuildPlatform '$(BuildPlatform)' -BuildConfiguration '$(BuildConfiguration)' -RepoRoot '$(Build.SourcesDirectory)'
displayName: Generate DSC manifests
- task: CopyFiles@2
displayName: Stage SDK/build
inputs:
@@ -339,7 +276,7 @@ jobs:
displayName: Build BugReportTool
inputs:
solution: '**/tools/BugReportTool/BugReportTool.sln'
vsVersion: 18.0
vsVersion: 17.0
msbuildArgs: >-
-restore -graph
/p:RestorePackagesConfig=true
@@ -360,7 +297,7 @@ jobs:
displayName: Build StylesReportTool
inputs:
solution: '**/tools/StylesReportTool/StylesReportTool.sln'
vsVersion: 18.0
vsVersion: 17.0
msbuildArgs: >-
-restore -graph
/p:RestorePackagesConfig=true
@@ -382,7 +319,7 @@ jobs:
displayName: Publish ${{ project }} for Packaging
inputs:
solution: ${{ project }}
vsVersion: 18.0
vsVersion: 17.0
msbuildArgs: >-
/target:Publish
/graph
@@ -390,7 +327,6 @@ jobs:
/p:VCRTForwarders-IncludeDebugCRT=false
/p:PowerToysRoot=$(Build.SourcesDirectory)
/p:PublishProfile=InstallationPublishProfile.pubxml
/p:TargetFramework=net9.0-windows10.0.26100.0
/bl:$(LogOutputDirectory)\publish-${{ join('_',split(project, '/')) }}.binlog
$(RestoreAdditionalProjectSourcesArg)
platform: $(BuildPlatform)
@@ -401,18 +337,13 @@ jobs:
### HACK: On ARM64 builds, building an app with Windows App SDK copies the x64 WebView2 dll instead of the ARM64 one. This task makes sure the right dll is used.
- task: CopyFiles@2
displayName: HACK Copy core WebView2 ARM64 dll to output directory
condition: and(succeeded(), eq(variables['BuildPlatform'], 'arm64'))
condition: eq(variables['BuildPlatform'],'arm64')
inputs:
contents: packages/Microsoft.Web.WebView2.1.0.2903.40/runtimes/win-ARM64/native_uap/Microsoft.Web.WebView2.Core.dll
targetFolder: $(Build.SourcesDirectory)/ARM64/Release/WinUI3Apps/
flattenFolders: True
OverWrite: True
# Check if all projects (located in src sub-folder) import common props
- pwsh: |-
& '.pipelines/verifyCommonProps.ps1' -sourceDir '$(build.sourcesdirectory)\src'
displayName: Audit shared common props for CSharp projects in src sub-folder
# Check if deps.json files don't reference different dll versions.
- pwsh: |-
& '.pipelines/verifyDepsJsonLibraryVersions.ps1' -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
@@ -440,11 +371,11 @@ jobs:
inputs:
testResultsFormat: VSTest
testResultsFiles: '**/*.trx'
condition: and(succeeded(), ne(variables['BuildPlatform'], 'arm64'))
condition: ne(variables['BuildPlatform'],'arm64')
# Native dlls
- task: VSTest@2
condition: and(succeeded(), ne(variables['BuildPlatform'], 'arm64')) # No arm64 agents to run the tests.
condition: ne(variables['BuildPlatform'],'arm64') # No arm64 agents to run the tests.
displayName: 'Native Tests'
inputs:
platform: '$(BuildPlatform)'
@@ -453,35 +384,18 @@ jobs:
testAssemblyVer2: |
**\KeyboardManagerEngineTest.dll
**\KeyboardManagerEditorTest.dll
**\*UnitTest*.dll
**\UnitTests-CommonLib.dll
**\PowerRenameUnitTests.dll
**\UnitTests-FancyZones.dll
!**\obj\**
- pwsh: |-
$Packages = Get-ChildItem -Recurse -Filter "Microsoft.CmdPal.UI_*.msix"
Write-Host "Found $($Packages.Count) CmdPal MSIX package(s):"
foreach ($pkg in $Packages) {
Write-Host " - $($pkg.FullName)"
}
if ($Packages.Count -gt 0) {
# Priority: Look for platform-specific MSIX (x64/arm64) first, then fall back to any
$PlatformPackage = $Packages | Where-Object { $_.Name -match "Microsoft\.CmdPal\.UI_.*_(x64|arm64)\.msix$" } | Select-Object -First 1
if ($PlatformPackage) {
$Package = $PlatformPackage
Write-Host "Using platform-specific package: $($Package.FullName)"
} else {
$Package = $Packages | Select-Object -First 1
Write-Host "Using first available package: $($Package.FullName)"
}
$PackageFilename = $Package.FullName
Write-Host "##vso[task.setvariable variable=CmdPalPackagePath]${PackageFilename}"
} else {
Write-Warning "No CmdPal MSIX packages found!"
}
displayName: Locate the CmdPal MSIX
- ${{ if eq(parameters.codeSign, true) }}:
- pwsh: |-
$Package = (Get-ChildItem -Recurse -Filter "Microsoft.CmdPal.UI_*.msix" | Select -First 1)
$PackageFilename = $Package.FullName
Write-Host "##vso[task.setvariable variable=CmdPalPackagePath]${PackageFilename}"
displayName: Locate the MSIX
- pwsh: |-
& "$(MakeAppxPath)" unpack /p "$(CmdPalPackagePath)" /d "$(JobOutputDirectory)/CmdPalPackageContents"
displayName: Unpack the MSIX for signing
@@ -501,18 +415,8 @@ jobs:
$PackageFilename = Join-Path $outDir.FullName (Split-Path -Leaf "$(CmdPalPackagePath)")
& "$(MakeAppxPath)" pack /h SHA256 /o /p $PackageFilename /d "$(JobOutputDirectory)/CmdPalPackageContents"
Copy-Item -Force $PackageFilename "$(CmdPalPackagePath)"
Remove-Item -Force -Recurse "$(JobOutputDirectory)/CmdPalPackageContents" -ErrorAction:Ignore
Remove-Item -Force -Recurse "$(JobOutputDirectory)/_appx" -ErrorAction:Ignore
displayName: Re-pack the new CmdPal package after signing
- pwsh: |
$testsPath = "$(Build.SourcesDirectory)/$(BuildPlatform)/$(BuildConfiguration)/tests"
if (Test-Path $testsPath) {
Remove-Item -Path $testsPath -Recurse -Force
Write-Host "Removed tests folder to reduce signing workload: $testsPath"
}
displayName: Remove tests folder before signing
- template: steps-esrp-signing.yml
parameters:
displayName: Sign Core PowerToys
@@ -533,22 +437,24 @@ jobs:
batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_DSC.json'
ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
- pwsh: |-
Copy-Item -Verbose -Force "$(CmdPalPackagePath)" "$(JobOutputDirectory)"
displayName: Stage the final CmdPal package
- template: steps-build-installer-vnext.yml
- template: steps-build-installer.yml
parameters:
codeSign: ${{ parameters.codeSign }}
signingIdentity: ${{ parameters.signingIdentity }}
versionNumber: ${{ parameters.versionNumber }}
additionalBuildOptions: ${{ parameters.additionalBuildOptions }}
- template: steps-build-installer.yml
parameters:
codeSign: ${{ parameters.codeSign }}
signingIdentity: ${{ parameters.signingIdentity }}
versionNumber: ${{ parameters.versionNumber }}
additionalBuildOptions: ${{ parameters.additionalBuildOptions }}
buildUserInstaller: true # NOTE: This is the distinction between the above and below rules
# This saves ~1GiB per architecture. We won't need these later.
# Removes:
# - All .pdb files from any static libs .libs (which were only used during linking)
# - All .pdbs from any static libs .libs (which were only used during linking)
- pwsh: |-
$binDir = '$(Build.SourcesDirectory)'
$ImportLibs = Get-ChildItem $binDir -Recurse -File -Filter '*.exp' | ForEach-Object { $_.FullName -Replace "exp$","lib" }
@@ -564,73 +470,60 @@ jobs:
- task: CopyFiles@2
displayName: Stage Installers
inputs:
contents: |-
**/PowerToys*Setup-*.exe
!**/PowerToysSetupVNext/obj/**
contents: "**/PowerToys*Setup-*.exe"
flattenFolders: True
targetFolder: $(JobOutputDirectory)
- pwsh: |-
$Symbols = Get-ChildItem "$(BuildPlatform)" -Recurse -Filter *.pdb -Exclude "vc143.pdb","*test*.pdb" |
Group-Object Name | ForEach-Object { $_.Group[0] }
$OutDir = "$(JobOutputDirectory)/symbols-$(BuildPlatform)"
New-Item -Type Directory $OutDir -EA:Ignore
Write-Host "Linking $($Symbols.Length) symbols into place at $OutDir"
ForEach($s in $Symbols) {
New-Item -Type HardLink -Target $s.FullName (Join-Path $OutDir $s.Name)
}
displayName: Stage Unique Symbols (as hard links)
- task: CopyFiles@2
displayName: Stage Symbols
inputs:
contents: |-
**\*.pdb
!**\vc143.pdb
!**\*test*.pdb
flattenFolders: True
targetFolder: $(JobOutputDirectory)/symbols-$(BuildPlatform)/
- pwsh: |-
$p = "$(JobOutputDirectory)\"
# Calculate hashes for installers
$userSetupFiles = Get-ChildItem -Path $p -Filter "PowerToysUserSetup*.exe"
$machineSetupFiles = Get-ChildItem -Path $p -Filter "PowerToysSetup*.exe" | Where-Object { $_.Name -notmatch "PowerToysUserSetup" }
if ($userSetupFiles.Count -gt 0) {
$userHash = ($userSetupFiles[0] | Get-FileHash).Hash;
$userPlat = "hash_user_$(BuildPlatform).txt";
$combinedUserPath = $p + $userPlat;
echo "User: $userHash"
$userHash | out-file -filepath $combinedUserPath
}
if ($machineSetupFiles.Count -gt 0) {
$machineHash = ($machineSetupFiles[0] | Get-FileHash).Hash;
$machinePlat = "hash_machine_$(BuildPlatform).txt";
$combinedMachinePath = $p + $machinePlat;
echo "Machine: $machineHash"
$machineHash | out-file -filepath $combinedMachinePath
}
displayName: Calculate file hashes for all installers
$userHash = ((Get-Item $p\PowerToysUserSetup*.exe | Get-FileHash).Hash);
$machineHash = ((Get-Item $p\PowerToysSetup*.exe | Get-FileHash).Hash);
$userPlat = "hash_user_$(BuildPlatform).txt";
$machinePlat = "hash_machine_$(BuildPlatform).txt";
$combinedUserPath = $p + $userPlat;
$combinedMachinePath = $p + $machinePlat;
echo $p
echo $userPlat
echo $userHash
echo $combinedUserPath
echo $machinePlat
echo $machineHash
echo $combinedMachinePath
$userHash | out-file -filepath $combinedUserPath
$machineHash | out-file -filepath $combinedMachinePath
displayName: Calculate file hashes
# Publishing the GPO files
- pwsh: |-
$GpoArchive = "$(JobOutputDirectory)\GroupPolicyObjectFiles-${{ parameters.versionNumber }}.zip"
tar -c -v --format=zip -C .\src\gpo\assets -f $GpoArchive *
New-Item "$(JobOutputDirectory)/gpo" -Type Directory
Copy-Item src\gpo\assets\* "$(JobOutputDirectory)/gpo" -Recurse
displayName: Stage GPO files
- ${{ if or(eq(parameters.runTests, true), eq(parameters.buildTests, true)) }}:
# Running the tests may result in future jobs consuming artifacts out of this build
# Instead of running an expensive file copy step, move everything over since the build is totally done.
- pwsh: |-
# It seems weird, but this is for compatibility. Our artifacts historically contained the folder x64/Release/x64/Release (for example).
$FinalOutputRoot = "$(JobOutputDirectory)\$(BuildPlatform)\$(BuildConfiguration)\$(BuildPlatform)"
$ProjectBuildRoot = "$(Build.SourcesDirectory)\$(BuildPlatform)"
$ProjectBuildDirectory = "$ProjectBuildRoot\$(BuildConfiguration)"
New-Item -Type Directory $FinalOutputRoot -EA:Ignore
Move-Item $ProjectBuildDirectory $FinalOutputRoot
displayName: Move entire output directory into artifacts
# Running the tests may result in future jobs consuming artifacts out of this build
- ${{ if eq(parameters.runTests, true) }}:
- task: CopyFiles@2
displayName: Stage entire build output
inputs:
sourceFolder: '$(Build.SourcesDirectory)'
contents: '$(BuildPlatform)/$(BuildConfiguration)/**/*'
targetFolder: '$(JobOutputDirectory)\$(BuildPlatform)\$(BuildConfiguration)'
- ${{ if eq(parameters.publishArtifacts, true) }}:
- publish: $(JobOutputDirectory)
artifact: $(JobOutputArtifactName)
displayName: Publish all outputs
condition: succeeded()
- publish: $(JobOutputDirectory)
artifact: $(JobOutputArtifactName)-failure-$(System.JobAttempt)
displayName: Publish failure logs
condition: or(failed(), canceled())
condition: always()

View File

@@ -3,9 +3,6 @@ parameters:
type: object
default:
- Release
- name: official
type: boolean
default: false
- name: codeSign
type: boolean
default: false
@@ -15,6 +12,9 @@ parameters:
- name: signingIdentity
type: object
default: {}
- name: sdkVersionNumber
type: string
default: '0.0.1'
jobs:
- job: "BuildSDK"
@@ -36,17 +36,8 @@ jobs:
fetchTags: false
fetchDepth: 1
- template: .\steps-ensure-nuget-version.yml
- task: NuGetAuthenticate@1
- ${{ if eq(parameters.official, true) }}:
- template: .\steps-setup-versioning.yml
parameters:
directory: $(build.sourcesdirectory)\src\modules\cmdpal
- pwsh: |-
& "$(build.sourcesdirectory)\src\modules\cmdpal\extensionsdk\nuget\BuildSDKHelper.ps1" -Configuration "Release" -BuildStep "build" -IsAzurePipelineBuild
& "$(build.sourcesdirectory)\src\modules\cmdpal\extensionsdk\nuget\BuildSDKHelper.ps1" -Configuration "Release" -VersionOfSDK ${{ parameters.sdkVersionNumber }} -BuildStep "build" -IsAzurePipelineBuild
displayName: Build SDK
- ${{ if eq(parameters.codeSign, true) }}:
@@ -61,7 +52,7 @@ jobs:
ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
- pwsh: |-
& "$(build.sourcesdirectory)\src\modules\cmdpal\extensionsdk\nuget\BuildSDKHelper.ps1" -Configuration "Release" -BuildStep "pack" -IsAzurePipelineBuild
& "$(build.sourcesdirectory)\src\modules\cmdpal\extensionsdk\nuget\BuildSDKHelper.ps1" -Configuration "Release" -VersionOfSDK ${{ parameters.sdkVersionNumber }} -BuildStep "pack" -IsAzurePipelineBuild
displayName: Pack SDK
- task: CopyFiles@2

View File

@@ -1,131 +0,0 @@
# Minimal UI Tests Build Template
# This template only builds UI test projects and stages their test DLLs for consumption by test pipelines
parameters:
- name: buildConfigurations
type: object
default:
- Release
- name: buildPlatforms
type: object
default:
- x64
- name: condition
type: string
default: ''
- name: dependsOn
type: object
default: []
- name: pool
type: object
default: []
- name: variables
type: object
default: {}
- name: uiTestModules
type: object
default: []
jobs:
- job: BuildUITests
${{ if ne(length(parameters.pool), 0) }}:
pool: ${{ parameters.pool }}
dependsOn: ${{ parameters.dependsOn }}
condition: ${{ parameters.condition }}
strategy:
matrix:
${{ each config in parameters.buildConfigurations }}:
${{ each platform in parameters.buildPlatforms }}:
${{ config }}_${{ platform }}:
BuildConfiguration: ${{ config }}
BuildPlatform: ${{ platform }}
variables:
JobOutputDirectory: $(Build.ArtifactStagingDirectory)
LogOutputDirectory: $(Build.ArtifactStagingDirectory)\logs
JobOutputArtifactName: build-$(BuildPlatform)-$(BuildConfiguration)
NUGET_RESTORE_MSBUILD_ARGS: /p:Platform=$(BuildPlatform)
${{ insert }}: ${{ parameters.variables }}
displayName: Build UI Tests Only
timeoutInMinutes: 60
cancelTimeoutInMinutes: 1
templateContext:
outputs:
- output: pipelineArtifact
artifactName: $(JobOutputArtifactName)
targetPath: $(Build.ArtifactStagingDirectory)
steps:
- checkout: self
clean: true
submodules: true
persistCredentials: True
fetchTags: false
fetchDepth: 1
- template: steps-ensure-dotnet-version.yml
parameters:
sdk: true
version: '9.0'
- template: .\steps-restore-nuget.yml
- task: MSBuild@1
displayName: Restore solution-level NuGet packages
inputs:
solution: PowerToys.slnx
msbuildArguments: '/t:restore /p:RestorePackagesConfig=true'
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
# Build all UI test projects if no specific modules are specified
- ${{ if eq(length(parameters.uiTestModules), 0) }}:
- task: VSBuild@1
displayName: Build UI Test Projects
inputs:
solution: '**/*UITest*.csproj'
vsVersion: 18.0
msbuildArgs: >-
-restore
-graph
/p:RestorePackagesConfig=true
/p:BuildProjectReferences=true
/p:CIBuild=true
/bl:$(LogOutputDirectory)\build-all-uitests.binlog
$(NUGET_RESTORE_MSBUILD_ARGS)
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
msbuildArchitecture: x64
maximumCpuCount: true
# Build specific UI test modules
- ${{ if ne(length(parameters.uiTestModules), 0) }}:
- ${{ each module in parameters.uiTestModules }}:
- task: VSBuild@1
displayName: 'Build UI Test Module: ${{ module }}'
inputs:
solution: '**/*${{ module }}*.csproj'
vsVersion: 18.0
msbuildArgs: >-
-restore
-graph
/p:RestorePackagesConfig=true
/p:BuildProjectReferences=true
/p:CIBuild=true
/bl:$(LogOutputDirectory)\build-${{ module }}.binlog
$(NUGET_RESTORE_MSBUILD_ARGS)
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
msbuildArchitecture: x64
maximumCpuCount: true
# Stage test project outputs with directory structure
- task: CopyFiles@2
displayName: Stage UI Test Build Outputs
inputs:
sourceFolder: '$(Build.SourcesDirectory)'
contents: '**/$(BuildPlatform)/$(BuildConfiguration)/tests/**/*'
targetFolder: '$(JobOutputDirectory)\$(BuildPlatform)\$(BuildConfiguration)'
- publish: $(JobOutputDirectory)
artifact: $(JobOutputArtifactName)
displayName: Publish UI Test artifacts
condition: always()

View File

@@ -68,7 +68,7 @@ jobs:
pwsh: true
ScriptType: InlineScript
Inline: |-
$AzToken = (Get-AzAccessToken -AsSecureString -ResourceUrl api://30471ccf-0966-45b9-a979-065dbedb24c1).Token | ConvertFrom-SecureString -AsPlainText
$AzToken = (Get-AzAccessToken -ResourceUrl api://30471ccf-0966-45b9-a979-065dbedb24c1).Token
Write-Host "##vso[task.setvariable variable=SymbolAccessToken;issecret=true]$AzToken"

View File

@@ -11,53 +11,24 @@ parameters:
- name: useLatestWebView2
type: boolean
default: false
- name: buildSource
type: string
default: "latestMainOfficialBuild"
displayName: "Build Source"
- name: specificBuildId
type: string
default: "xxxx"
displayName: "Build ID (for specific builds)"
- name: uiTestModules
type: object
default: []
- name: installMode
type: string
default: 'machine'
values:
- 'machine'
- 'peruser'
- name: jobSuffix
type: string
default: ''
jobs:
- job: Test${{ parameters.platform }}${{ parameters.configuration }}${{ parameters.jobSuffix }}
displayName: Test ${{ parameters.platform }} ${{ parameters.configuration }}${{ parameters.jobSuffix }}
timeoutInMinutes: 300
- job: Test${{ parameters.platform }}${{ parameters.configuration }}
displayName: Test ${{ parameters.platform }} ${{ parameters.configuration }}
variables:
${{ if or(eq(parameters.platform, 'x64Win10'), eq(parameters.platform, 'x64Win11')) }}:
BuildPlatform: x64
${{ else }}:
BuildPlatform: ${{ parameters.platform }}
TestPlatform: ${{ parameters.platform }}
BuildPlatform: ${{ parameters.platform }}
BuildConfiguration: ${{ parameters.configuration }}
SrcPath: $(Build.Repository.LocalPath)
TestArtifactsName: build-${{ variables.BuildPlatform }}-${{ parameters.configuration }}${{ parameters.inputArtifactStem }}
TestArtifactsName: build-${{ parameters.platform }}-${{ parameters.configuration }}${{ parameters.inputArtifactStem }}
pool:
${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
${{ if ne(parameters.platform, 'ARM64') }}:
name: SHINE-INT-Testing-x64
${{ if eq(parameters.platform, 'x64Win11') }}:
demands: ImageOverride -equals SHINE-W11-Testing
${{ else }}:
name: SHINE-INT-Testing-arm64
${{ else }}:
${{ if ne(parameters.platform, 'ARM64') }}:
name: SHINE-OSS-Testing-x64
${{ if eq(parameters.platform, 'x64Win11') }}:
demands: ImageOverride -equals SHINE-W11-Testing
${{ else }}:
name: SHINE-OSS-Testing-arm64
steps:
@@ -115,83 +86,23 @@ jobs:
& '$(build.sourcesdirectory)\.pipelines\InstallWinAppDriver.ps1'
displayName: Download and install WinAppDriver
- ${{ if ne(parameters.buildSource, 'buildNow') }}:
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'specific'
project: 'Dart'
definition: '76541'
${{ if eq(parameters.buildSource, 'specificBuildId') }}:
buildVersionToDownload: 'specific'
buildId: '${{ parameters.specificBuildId }}'
${{ else }}:
buildVersionToDownload: 'latestFromBranch'
branchName: 'refs/heads/main'
artifactName: 'build-$(BuildPlatform)-Release'
targetPath: '$(Build.ArtifactStagingDirectory)'
${{ if eq(parameters.installMode, 'peruser') }}:
patterns: |
**/PowerToysUserSetup*.exe
${{ else }}:
patterns: |
**/PowerToysSetup*.exe
- ${{ if ne(parameters.buildSource, 'buildNow') }}:
- ${{ if eq(parameters.installMode, 'peruser') }}:
- pwsh: |-
& "$(build.sourcesdirectory)\.pipelines\installPowerToys.ps1" -InstallMode "PerUser"
displayName: Install PowerToys (Per-User)
- ${{ if eq(parameters.installMode, 'machine') }}:
- pwsh: |-
& "$(build.sourcesdirectory)\.pipelines\installPowerToys.ps1" -InstallMode "Machine"
displayName: Install PowerToys (Machine-Level)
- ${{ if ne(parameters.platform, 'arm64') }}:
- task: ScreenResolutionUtility@1
inputs:
displaySettings: 'optimal'
- ${{ if eq(length(parameters.uiTestModules), 0) }}:
- task: VSTest@3
displayName: Run UI Tests
inputs:
platform: '$(BuildPlatform)'
configuration: '$(BuildConfiguration)'
testSelector: 'testAssemblies'
searchFolder: '$(Pipeline.Workspace)\$(TestArtifactsName)'
vsTestVersion: 'toolsInstaller'
uiTests: true
rerunFailedTests: true
testRunTitle: 'UITests_${{ parameters.platform }}_${{ parameters.installMode }}'
# Since UITests-FancyZonesEditor.dll is generated in both UITests-FancyZonesEditor and UITests-FancyZones, removed one to avoid duplicate test runs
testAssemblyVer2: |
**\*UITest*.dll
!**\obj\**
!**\ref\**
!**\UITests-FancyZones\**\UITests-FancyZonesEditor.dll
env:
platform: '$(TestPlatform)'
useInstallerForTest: ${{ ne(parameters.buildSource, 'buildNow') }}
- ${{ if ne(length(parameters.uiTestModules), 0) }}:
- ${{ each module in parameters.uiTestModules }}:
- task: VSTest@3
displayName: Run UI Test - ${{ module }}
inputs:
platform: '$(BuildPlatform)'
configuration: '$(BuildConfiguration)'
testSelector: 'testAssemblies'
searchFolder: '$(Pipeline.Workspace)\$(TestArtifactsName)'
vsTestVersion: 'toolsInstaller'
uiTests: true
rerunFailedTests: true
testRunTitle: 'UITests_${{ parameters.platform }}_${{ parameters.installMode }}'
testAssemblyVer2: |
**\*${{ module }}*.dll
!**\obj\**
!**\ref\**
!**\UITests-FancyZones\**\UITests-FancyZonesEditor.dll
env:
platform: '$(TestPlatform)'
useInstallerForTest: ${{ ne(parameters.buildSource, 'buildNow') }}
- task: VSTest@3
displayName: Run UI Tests
inputs:
platform: '$(BuildPlatform)'
configuration: '$(BuildConfiguration)'
testSelector: 'testAssemblies'
searchFolder: '$(Pipeline.Workspace)\$(TestArtifactsName)'
vsTestVersion: 'toolsInstaller'
uiTests: true
rerunFailedTests: true
testAssemblyVer2: |
**\UITests-FancyZones.dll
**\UITests-FancyZonesEditor.dll
!**\obj\**
!**\ref\**

View File

@@ -3,6 +3,9 @@ variables:
value: false
- name: EnablePipelineCache
value: true
- ${{ if eq(parameters.enableMsBuildCaching, true) }}:
- name: EnablePipelineCache
value: true
parameters:
- name: buildPlatforms
@@ -13,9 +16,6 @@ parameters:
- name: enableMsBuildCaching
type: boolean
default: false
- name: msBuildCacheIsReadOnly
type: boolean
default: true
- name: runTests
type: boolean
default: true
@@ -49,39 +49,27 @@ stages:
${{ else }}:
name: SHINE-OSS-L
${{ if eq(parameters.useVSPreview, true) }}:
demands: ImageOverride -equals SHINE-VS18-Preview
${{ else }}:
demands: ImageOverride -equals SHINE-VS18-Latest
demands: ImageOverride -equals SHINE-VS17-Preview
buildPlatforms:
- ${{ platform }}
buildConfigurations: [Release]
enablePackageCaching: true
enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
msBuildCacheIsReadOnly: ${{ parameters.msBuildCacheIsReadOnly }}
runTests: ${{ parameters.runTests }}
buildTests: true
useVSPreview: ${{ parameters.useVSPreview }}
useLatestWinAppSDK: ${{ parameters.useLatestWinAppSDK }}
${{ if eq(parameters.useLatestWinAppSDK, true) }}:
winAppSDKVersionNumber: ${{ parameters.winAppSDKVersionNumber }}
useExperimentalVersion: ${{ parameters.useExperimentalVersion }}
timeoutInMinutes: 90
- stage: Build_SDK
displayName: Build Command Palette Toolkit SDK
dependsOn: []
jobs:
- template: job-build-sdk.yml
parameters:
pool:
${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
name: SHINE-INT-L
${{ else }}:
name: SHINE-OSS-L
${{ if eq(parameters.useVSPreview, true) }}:
demands: ImageOverride -equals SHINE-VS18-Preview
${{ else }}:
demands: ImageOverride -equals SHINE-VS18-Latest
buildConfigurations: [Release]
official: false
codeSign: false
- ${{ if and(eq(parameters.runTests, true), not(and(eq(platform, 'arm64'), eq(variables['System.PullRequest.IsFork'], true)))) }}:
- stage: Test_${{ platform }}
displayName: Test ${{ platform }}
dependsOn:
- Build_${{platform}}
jobs:
- template: job-test-project.yml
parameters:
platform: ${{ platform }}
configuration: Release
useLatestWebView2: ${{ parameters.useLatestWebView2 }}

View File

@@ -1,58 +0,0 @@
variables:
- name: runCodesignValidationInjectionBG
value: false
- name: EnablePipelineCache
value: true
parameters:
- name: buildPlatforms
type: object
default:
- x64
- arm64
- name: enableMsBuildCaching
type: boolean
default: false
- name: useVSPreview
type: boolean
default: false
- name: useLatestWebView2
type: boolean
default: false
- name: buildSource
type: string
default: "latestMainOfficialBuild"
displayName: "Build Source"
values:
- latestMainOfficialBuild
- buildNow
- specificBuildId
- name: specificBuildId
type: string
default: 'xxxx'
displayName: "Build ID (only used when Build Source = specificBuildId)"
- name: uiTestModules
type: object
default: []
stages:
- ${{ each platform in parameters.buildPlatforms }}:
# Full build path: build PowerToys + UI tests + run tests
- ${{ if eq(parameters.buildSource, 'buildNow') }}:
- template: pipeline-ui-tests-full-build.yml
parameters:
platform: ${{ platform }}
enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
useVSPreview: ${{ parameters.useVSPreview }}
useLatestWebView2: ${{ parameters.useLatestWebView2 }}
uiTestModules: ${{ parameters.uiTestModules }}
# Official build path: build UI tests only + download official build + run tests
- ${{ if ne(parameters.buildSource, 'buildNow') }}:
- template: pipeline-ui-tests-official-build.yml
parameters:
platform: ${{ platform }}
buildSource: ${{ parameters.buildSource }}
specificBuildId: ${{ parameters.specificBuildId }}
useLatestWebView2: ${{ parameters.useLatestWebView2 }}
uiTestModules: ${{ parameters.uiTestModules }}

View File

@@ -1,82 +0,0 @@
# Template for full build path: Build PowerToys + Build UI Tests + Run Tests
parameters:
- name: platform
type: string
- name: enableMsBuildCaching
type: boolean
default: false
- name: useVSPreview
type: boolean
default: false
- name: useLatestWebView2
type: boolean
default: false
- name: uiTestModules
type: object
default: []
stages:
# Stage 1: Build full PowerToys project
- stage: Build_${{ parameters.platform }}
displayName: Build PowerToys ${{ parameters.platform }}
dependsOn: []
jobs:
- template: job-build-project.yml
parameters:
pool:
${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
name: SHINE-INT-L
${{ else }}:
name: SHINE-OSS-L
${{ if eq(parameters.useVSPreview, true) }}:
demands: ImageOverride -equals SHINE-VS18-Preview
${{ else }}:
demands: ImageOverride -equals SHINE-VS18-Latest
buildPlatforms:
- ${{ parameters.platform }}
buildConfigurations: [Release]
enablePackageCaching: true
enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
runTests: false
buildTests: true
useVSPreview: ${{ parameters.useVSPreview }}
timeoutInMinutes: 90
# Stage 2: Run UI Tests
- ${{ if eq(parameters.platform, 'x64') }}:
- stage: Test_x64Win10_FullBuild
displayName: Test x64Win10 (Full Build)
dependsOn: Build_${{ parameters.platform }}
jobs:
- template: job-test-project.yml
parameters:
platform: x64Win10
configuration: Release
useLatestWebView2: ${{ parameters.useLatestWebView2 }}
buildSource: 'buildNow'
uiTestModules: ${{ parameters.uiTestModules }}
- stage: Test_x64Win11_FullBuild
displayName: Test x64Win11 (Full Build)
dependsOn: Build_${{ parameters.platform }}
jobs:
- template: job-test-project.yml
parameters:
platform: x64Win11
configuration: Release
useLatestWebView2: ${{ parameters.useLatestWebView2 }}
buildSource: 'buildNow'
uiTestModules: ${{ parameters.uiTestModules }}
- ${{ if ne(parameters.platform, 'x64') }}:
- stage: Test_${{ parameters.platform }}_FullBuild
displayName: Test ${{ parameters.platform }} (Full Build)
dependsOn: Build_${{ parameters.platform }}
jobs:
- template: job-test-project.yml
parameters:
platform: ${{ parameters.platform }}
configuration: Release
useLatestWebView2: ${{ parameters.useLatestWebView2 }}
buildSource: 'buildNow'
uiTestModules: ${{ parameters.uiTestModules }}

View File

@@ -1,110 +0,0 @@
# Template for official build path: Download Official Build + Build UI Tests Only + Run Tests
parameters:
- name: platform
type: string
- name: buildSource
type: string
- name: specificBuildId
type: string
default: 'xxxx'
- name: useLatestWebView2
type: boolean
default: false
- name: uiTestModules
type: object
default: []
stages:
# Stage 1: Build UI Tests Only
- stage: BuildUITests_${{ parameters.platform }}
displayName: Build UI Tests Only ${{ parameters.platform }}
dependsOn: []
jobs:
- template: job-build-ui-tests.yml
parameters:
pool:
${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
name: SHINE-INT-L
${{ else }}:
name: SHINE-OSS-L
buildPlatforms:
- ${{ parameters.platform }}
uiTestModules: ${{ parameters.uiTestModules }}
# Stage 2: Run UI Tests with Official Build
- ${{ if eq(parameters.platform, 'x64') }}:
- stage: Test_x64Win10_OfficialBuild
displayName: Test x64Win10 (Official Build)
dependsOn: BuildUITests_${{ parameters.platform }}
jobs:
- template: job-test-project.yml
parameters:
platform: x64Win10
configuration: Release
useLatestWebView2: ${{ parameters.useLatestWebView2 }}
buildSource: ${{ parameters.buildSource }}
specificBuildId: ${{ parameters.specificBuildId }}
uiTestModules: ${{ parameters.uiTestModules }}
# Additional per-user installation test
- template: job-test-project.yml
parameters:
platform: x64Win10
configuration: Release
useLatestWebView2: ${{ parameters.useLatestWebView2 }}
buildSource: ${{ parameters.buildSource }}
specificBuildId: ${{ parameters.specificBuildId }}
uiTestModules: ${{ parameters.uiTestModules }}
installMode: 'peruser'
jobSuffix: '_PerUser'
- stage: Test_x64Win11_OfficialBuild
displayName: Test x64Win11 (Official Build)
dependsOn: BuildUITests_${{ parameters.platform }}
jobs:
- template: job-test-project.yml
parameters:
platform: x64Win11
configuration: Release
useLatestWebView2: ${{ parameters.useLatestWebView2 }}
buildSource: ${{ parameters.buildSource }}
specificBuildId: ${{ parameters.specificBuildId }}
uiTestModules: ${{ parameters.uiTestModules }}
# Additional per-user installation test
- template: job-test-project.yml
parameters:
platform: x64Win11
configuration: Release
useLatestWebView2: ${{ parameters.useLatestWebView2 }}
buildSource: ${{ parameters.buildSource }}
specificBuildId: ${{ parameters.specificBuildId }}
uiTestModules: ${{ parameters.uiTestModules }}
installMode: 'peruser'
jobSuffix: '_PerUser'
- ${{ if ne(parameters.platform, 'x64') }}:
- stage: Test_${{ parameters.platform }}_OfficialBuild
displayName: Test ${{ parameters.platform }} (Official Build)
dependsOn: BuildUITests_${{ parameters.platform }}
jobs:
- template: job-test-project.yml
parameters:
platform: ${{ parameters.platform }}
configuration: Release
useLatestWebView2: ${{ parameters.useLatestWebView2 }}
buildSource: ${{ parameters.buildSource }}
specificBuildId: ${{ parameters.specificBuildId }}
uiTestModules: ${{ parameters.uiTestModules }}
# Additional per-user installation test
- template: job-test-project.yml
parameters:
platform: ${{ parameters.platform }}
configuration: Release
useLatestWebView2: ${{ parameters.useLatestWebView2 }}
buildSource: ${{ parameters.buildSource }}
specificBuildId: ${{ parameters.specificBuildId }}
uiTestModules: ${{ parameters.uiTestModules }}
installMode: 'peruser'
jobSuffix: '_PerUser'

View File

@@ -1,215 +0,0 @@
parameters:
- name: versionNumber
type: string
default: "0.0.1"
- name: codeSign
type: boolean
default: false
- name: signingIdentity
type: object
default: {}
- name: additionalBuildOptions
type: string
default: ''
steps:
# Install WiX 5.0.2 tools needed for VNext installer (matching project SDK)
- task: DotNetCoreCLI@2
displayName: Install WiX 5.0.2 tools
inputs:
command: 'custom'
custom: 'tool'
arguments: 'install --global wix --version 5.0.2'
- pwsh: |-
Write-Host "##vso[task.setvariable variable=InstallerMachineRoot]installer\PowerToysSetupVNext\$(BuildPlatform)\$(BuildConfiguration)\MachineSetup"
Write-Host "##vso[task.setvariable variable=InstallerUserRoot]installer\PowerToysSetupVNext\$(BuildPlatform)\$(BuildConfiguration)\UserSetup"
Write-Host "##vso[task.setvariable variable=InstallerMachineBasename]PowerToysSetup-${{ parameters.versionNumber }}-$(BuildPlatform)"
Write-Host "##vso[task.setvariable variable=InstallerUserBasename]PowerToysUserSetup-${{ parameters.versionNumber }}-$(BuildPlatform)"
displayName: Prepare Installer variables
# This dll needs to be built and signed before building the MSI.
# The Custom Actions project contains a pre-build event that prepares the .wxs files
# by filling them out with all our components. We pass RunBuildEvents=true to force
# that logic to run.
- task: VSBuild@1
displayName: Build Shared Support DLLs
inputs:
solution: "**/installer/PowerToysSetup.slnx"
vsVersion: 18.0
msbuildArgs: >-
/t:PowerToysSetupCustomActionsVNext;SilentFilesInUseBAFunction
/p:RunBuildEvents=true;RestorePackagesConfig=true;CIBuild=true
-restore -graph
/bl:$(LogOutputDirectory)\installer-actions.binlog
${{ parameters.additionalBuildOptions }}
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
clean: true
msbuildArchitecture: x64
maximumCpuCount: true
- ${{ if eq(parameters.codeSign, true) }}:
- template: steps-esrp-sign-files-authenticode.yml
parameters:
displayName: Sign Shared Support DLLs
signingIdentity: ${{ parameters.signingIdentity }}
folder: 'installer'
pattern: |-
**/PowerToysSetupCustomActionsVNext.dll
**/SilentFilesInUseBAFunction.dll
## INSTALLER START
#### MSI BUILDING AND SIGNING
#
# The MSI build contains code that reverts the .wxs files to their in-tree versions.
# This is only supposed to happen during local builds. Since this build system is
# supposed to run side by side--machine and then user--we do NOT want to destroy
# the .wxs files. Therefore, we pass RunBuildEvents=false to suppress all of that
# logic.
#
# We pass BuildProjectReferences=false so that it does not recompile the DLLs we just built.
# We only pass -restore on the first one because the second run should already have all
# of the dependencies.
- task: VSBuild@1
displayName: 💻 Build VNext MSI
inputs:
solution: "**/installer/PowerToysSetup.slnx"
vsVersion: 18.0
msbuildArgs: >-
-restore
/t:PowerToysInstallerVNext
/p:RunBuildEvents=false;PerUser=false;BuildProjectReferences=false;CIBuild=true
/bl:$(LogOutputDirectory)\installer-machine-msi.binlog
${{ parameters.additionalBuildOptions }}
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
clean: false # don't undo our hard work above by deleting the CustomActions dll
msbuildArchitecture: x64
maximumCpuCount: true
- task: VSBuild@1
displayName: 👤 Build VNext MSI
inputs:
solution: "**/installer/PowerToysSetup.slnx"
vsVersion: 18.0
msbuildArgs: >-
/t:PowerToysInstallerVNext
/p:RunBuildEvents=false;PerUser=true;BuildProjectReferences=false;CIBuild=true
/bl:$(LogOutputDirectory)\installer-user-msi.binlog
${{ parameters.additionalBuildOptions }}
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
clean: false # don't undo our hard work above by deleting the CustomActions dll
msbuildArchitecture: x64
maximumCpuCount: true
- script: |-
wix msi decompile $(InstallerMachineRoot)\$(InstallerMachineBasename).msi -x $(build.sourcesdirectory)\extractedMachineMsi
wix msi decompile $(InstallerUserRoot)\$(InstallerUserBasename).msi -x $(build.sourcesdirectory)\extractedUserMsi
dir $(build.sourcesdirectory)\extractedMachineMsi
dir $(build.sourcesdirectory)\extractedUserMsi
displayName: "WiX5: Extract and verify MSIs"
# Check if deps.json files don't reference different dll versions.
- pwsh: |-
& '.pipelines/verifyDepsJsonLibraryVersions.ps1' -targetDir '$(build.sourcesdirectory)\extractedMachineMsi\File'
& '.pipelines/verifyDepsJsonLibraryVersions.ps1' -targetDir '$(build.sourcesdirectory)\extractedUserMsi\File'
displayName: Audit deps.json in MSI extracted files
- ${{ if eq(parameters.codeSign, true) }}:
- pwsh: |-
& .pipelines/versionAndSignCheck.ps1 -targetDir '$(build.sourcesdirectory)\extractedMachineMsi\File'
& .pipelines/versionAndSignCheck.ps1 -targetDir '$(build.sourcesdirectory)\extractedMachineMsi\Binary'
& .pipelines/versionAndSignCheck.ps1 -targetDir '$(build.sourcesdirectory)\extractedUserMsi\File'
& .pipelines/versionAndSignCheck.ps1 -targetDir '$(build.sourcesdirectory)\extractedUserMsi\Binary'
git clean -xfd ./extractedMachineMsi ./extractedUserMsi
displayName: Verify all binaries are signed and versioned
- template: steps-esrp-sign-files-authenticode.yml
parameters:
displayName: Sign VNext MSIs
signingIdentity: ${{ parameters.signingIdentity }}
folder: 'installer'
pattern: '**/PowerToys*Setup-*.msi'
#### END MSI
#### BOOTSTRAP BUILDING AND SIGNING
# We pass BuildProjectReferences=false so that it does not recompile the DLLs we just built.
# We only pass -restore on the first one because the second run should already have all
# of the dependencies.
- task: VSBuild@1
displayName: 💻 Build VNext Bootstrapper
inputs:
solution: "**/installer/PowerToysSetup.slnx"
vsVersion: 18.0
msbuildArgs: >-
-restore
/t:PowerToysBootstrapperVNext
/p:PerUser=false;BuildProjectReferences=false;CIBuild=true
/bl:$(LogOutputDirectory)\installer-machine-bootstrapper.binlog
${{ parameters.additionalBuildOptions }}
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
clean: false # don't undo our hard work above by deleting the MSI nor SilentFilesInUseBAFunction
msbuildArchitecture: x64
maximumCpuCount: true
- task: VSBuild@1
displayName: 👤 Build VNext Bootstrapper
inputs:
solution: "**/installer/PowerToysSetup.slnx"
vsVersion: 18.0
msbuildArgs: >-
/t:PowerToysBootstrapperVNext
/p:PerUser=true;BuildProjectReferences=false;CIBuild=true
/bl:$(LogOutputDirectory)\installer-user-bootstrapper.binlog
${{ parameters.additionalBuildOptions }}
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
clean: false # don't undo our hard work above by deleting the MSI nor SilentFilesInUseBAFunction
msbuildArchitecture: x64
maximumCpuCount: true
# The entirety of bundle unpacking/re-packing is unnecessary if we are not code signing it.
- ${{ if eq(parameters.codeSign, true) }}:
- script: |-
wix burn detach $(InstallerMachineRoot)\$(InstallerMachineBasename).exe -engine installer\machine-engine.exe
wix burn detach $(InstallerUserRoot)\$(InstallerUserBasename).exe -engine installer\user-engine.exe
displayName: "WiX5: Extract Engines from Bundles"
- template: steps-esrp-sign-files-authenticode.yml
parameters:
displayName: Sign WiX Engines
signingIdentity: ${{ parameters.signingIdentity }}
folder: "installer"
pattern: '*-engine.exe'
- script: |-
wix burn reattach $(InstallerMachineRoot)\$(InstallerMachineBasename).exe -engine installer\machine-engine.exe -o $(InstallerMachineRoot)\$(InstallerMachineBasename).exe
wix burn reattach $(InstallerUserRoot)\$(InstallerUserBasename).exe -engine installer\user-engine.exe -o $(InstallerUserRoot)\$(InstallerUserBasename).exe
displayName: "WiX5: Reattach Engines to Bundles"
- pwsh: |-
& wix burn extract -oba installer\ba\m "$(InstallerMachineRoot)\$(InstallerMachineBasename).exe"
& wix burn extract -oba installer\ba\u "$(InstallerUserRoot)\$(InstallerUserBasename).exe"
Get-ChildItem installer\ba -Recurse -Include *.exe,*.dll | Get-AuthenticodeSignature | ForEach-Object {
If ($_.Status -Ne "Valid") {
Write-Error $_.StatusMessage
} Else {
Write-Host $_.StatusMessage
}
}
& git clean -fdx installer\ba
displayName: "WiX5: Verify Bootstrapper content is signed"
- template: steps-esrp-sign-files-authenticode.yml
parameters:
displayName: Sign Final Bootstrappers
signingIdentity: ${{ parameters.signingIdentity }}
folder: 'installer'
pattern: '**/PowerToys*Setup-*.exe'
#### END BOOTSTRAP
## END INSTALLER

View File

@@ -0,0 +1,208 @@
parameters:
- name: versionNumber
type: string
default: "0.0.1"
- name: buildUserInstaller
type: boolean
default: false
- name: codeSign
type: boolean
default: false
- name: signingIdentity
type: object
default: {}
- name: additionalBuildOptions
type: string
default: ''
steps:
- pwsh: |-
& git clean -xfd -e *exe -- .\installer\
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Clean installer to reduce cross-contamination
- pwsh: |-
$IsPerUser = $${{ parameters.buildUserInstaller }}
$InstallerBuildSlug = "MachineSetup"
$InstallerBasename = "PowerToysSetup"
If($IsPerUser) {
$InstallerBuildSlug = "UserSetup"
$InstallerBasename = "PowerToysUserSetup"
}
$InstallerBasename += "-${{ parameters.versionNumber }}-$(BuildPlatform)"
Write-Host "##vso[task.setvariable variable=InstallerBuildSlug]$InstallerBuildSlug"
Write-Host "##vso[task.setvariable variable=InstallerRelativePath]$(BuildPlatform)\$(BuildConfiguration)\$InstallerBuildSlug"
Write-Host "##vso[task.setvariable variable=InstallerBasename]$InstallerBasename"
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Prepare Installer variables
# This dll needs to be built and signed before building the MSI.
- task: VSBuild@1
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Build PowerToysSetupCustomActions
inputs:
solution: "**/installer/PowerToysSetup.sln"
vsVersion: 17.0
msbuildArgs: >-
/t:PowerToysSetupCustomActions
/p:RunBuildEvents=true;PerUser=${{parameters.buildUserInstaller}};RestorePackagesConfig=true;CIBuild=true
-restore -graph
/bl:$(LogOutputDirectory)\installer-$(InstallerBuildSlug)-actions.binlog
${{ parameters.additionalBuildOptions }}
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
clean: true
msbuildArchitecture: x64
maximumCpuCount: true
- ${{ if eq(parameters.codeSign, true) }}:
- template: steps-esrp-signing.yml
parameters:
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign PowerToysSetupCustomActions
signingIdentity: ${{ parameters.signingIdentity }}
inputs:
FolderPath: 'installer/PowerToysSetupCustomActions/$(InstallerRelativePath)'
signType: batchSigning
batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
## INSTALLER START
#### MSI BUILDING AND SIGNING
- task: VSBuild@1
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Build MSI
inputs:
solution: "**/installer/PowerToysSetup.sln"
vsVersion: 17.0
msbuildArgs: >-
-restore
/t:PowerToysInstaller
/p:RunBuildEvents=false;PerUser=${{parameters.buildUserInstaller}};BuildProjectReferences=false;CIBuild=true
/bl:$(LogOutputDirectory)\installer-$(InstallerBuildSlug)-msi.binlog
${{ parameters.additionalBuildOptions }}
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
clean: false # don't undo our hard work above by deleting the CustomActions dll
msbuildArchitecture: x64
maximumCpuCount: true
- script: |-
"C:\Program Files (x86)\WiX Toolset v3.14\bin\dark.exe" -x $(build.sourcesdirectory)\extractedMsi installer\PowerToysSetup\$(InstallerRelativePath)\$(InstallerBasename).msi
dir $(build.sourcesdirectory)\extractedMsi
displayName: "${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Extract and verify MSI"
# Extract CmdPal msix package to check if its content is signed
- pwsh: |-
Write-Host "Extracting CmdPal MSIX package"
# Define the directory to search
$searchDir = "extractedMsi\File"
# Define the regex pattern for MSIX files
$pattern = '^Microsoft.CmdPal.UI.*\.msix$'
# Get all files in the directory and subdirectories
$msixFile = Get-ChildItem -Path $searchDir -Recurse -File | Where-Object {
$_.Name -match $pattern
}
Write-Host "MSIX file found: " $msixFile
$destinationDir = "$(build.sourcesdirectory)\extractedMsi\File\extractedCmdPalMsix"
Expand-Archive -Path $msixFile -DestinationPath $destinationDir
Get-ChildItem -Path $destinationDir -Recurse -File
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Extract CmdPal MSIX package
# Check if deps.json files don't reference different dll versions.
- pwsh: |-
& '.pipelines/verifyDepsJsonLibraryVersions.ps1' -targetDir '$(build.sourcesdirectory)\extractedMsi\File'
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Audit deps.json in MSI extracted files
- ${{ if eq(parameters.codeSign, true) }}:
- pwsh: |-
& .pipelines/versionAndSignCheck.ps1 -targetDir '$(build.sourcesdirectory)\extractedMsi\File'
& .pipelines/versionAndSignCheck.ps1 -targetDir '$(build.sourcesdirectory)\extractedMsi\Binary'
git clean -xfd ./extractedMsi
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Verify all binaries are signed and versioned
- template: steps-esrp-signing.yml
parameters:
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign MSI
signingIdentity: ${{ parameters.signingIdentity }}
inputs:
FolderPath: 'installer/PowerToysSetup/$(InstallerRelativePath)'
signType: batchSigning
batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
#### END MSI
#### BOOTSTRAP BUILDING AND SIGNING
- task: VSBuild@1
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Build Bootstrapper
inputs:
solution: "**/installer/PowerToysSetup.sln"
vsVersion: 17.0
msbuildArgs: >-
/t:PowerToysBootstrapper
/p:PerUser=${{parameters.buildUserInstaller}};CIBuild=true
/bl:$(LogOutputDirectory)\installer-$(InstallerBuildSlug)-bootstrapper.binlog
-restore -graph
${{ parameters.additionalBuildOptions }}
platform: $(BuildPlatform)
configuration: $(BuildConfiguration)
clean: false # don't undo our hard work above by deleting the MSI
msbuildArchitecture: x64
maximumCpuCount: true
# The entirety of bundle unpacking/re-packing is unnecessary if we are not code signing it.
- ${{ if eq(parameters.codeSign, true) }}:
- script: |-
"C:\Program Files (x86)\WiX Toolset v3.14\bin\insignia.exe" -ib installer\PowerToysSetup\$(InstallerRelativePath)\$(InstallerBasename).exe -o installer\engine.exe
displayName: "${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Insignia: Extract Engine from Bundle"
- template: steps-esrp-signing.yml
parameters:
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign WiX Engine
signingIdentity: ${{ parameters.signingIdentity }}
inputs:
FolderPath: "installer"
Pattern: engine.exe
signConfigType: inlineSignParams
inlineOperation: |
[
{
"KeyCode": "CP-230012",
"OperationCode": "SigntoolSign",
"Parameters": {
"OpusName": "Microsoft",
"OpusInfo": "http://www.microsoft.com",
"FileDigest": "/fd \"SHA256\"",
"PageHash": "/NPH",
"TimeStamp": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
},
"ToolName": "sign",
"ToolVersion": "1.0"
},
{
"KeyCode": "CP-230012",
"OperationCode": "SigntoolVerify",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
}
]
- script: |-
"C:\Program Files (x86)\WiX Toolset v3.14\bin\insignia.exe" -ab installer\engine.exe installer\PowerToysSetup\$(InstallerRelativePath)\$(InstallerBasename).exe -o installer\PowerToysSetup\$(InstallerRelativePath)\$(InstallerBasename).exe
displayName: "${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Insignia: Merge Engine into Bundle"
- template: steps-esrp-signing.yml
parameters:
displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign Final Bootstrapper
signingIdentity: ${{ parameters.signingIdentity }}
inputs:
FolderPath: 'installer/PowerToysSetup/$(InstallerRelativePath)'
signType: batchSigning
batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
#### END BOOTSTRAP
## END INSTALLER

View File

@@ -1,45 +0,0 @@
parameters:
- name: displayName
type: string
default: Sign Specific Files
- name: folder
type: string
- name: pattern
type: string
- name: signingIdentity
type: object
default: {}
steps:
- template: steps-esrp-signing.yml
parameters:
displayName: ${{ parameters.displayName }}
signingIdentity: ${{ parameters.signingIdentity }}
inputs:
FolderPath: ${{ parameters.folder }}
Pattern: ${{ parameters.pattern }}
UseMinimatch: true
signConfigType: inlineSignParams
inlineOperation: |-
[
{
"KeyCode": "CP-230012",
"OperationCode": "SigntoolSign",
"Parameters": {
"OpusName": "Microsoft",
"OpusInfo": "http://www.microsoft.com",
"FileDigest": "/fd \"SHA256\"",
"PageHash": "/NPH",
"TimeStamp": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
},
"ToolName": "sign",
"ToolVersion": "1.0"
},
{
"KeyCode": "CP-230012",
"OperationCode": "SigntoolVerify",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
}
]

View File

@@ -10,7 +10,7 @@ parameters:
default: {}
steps:
- task: EsrpCodeSigning@6
- task: EsrpCodeSigning@5
displayName: 🔏 ${{ parameters.displayName }}
inputs:
ConnectedServiceName: ${{ parameters.signingIdentity.serviceName }}

View File

@@ -4,12 +4,12 @@ parameters:
default: false
steps:
- task: TouchdownBuildTask@5
- task: TouchdownBuildTask@3
displayName: 'Download Localization Files -- PowerToys 37400'
inputs:
teamId: 37400
FederatedIdentityTDBuildServiceConnection: $(TouchdownServiceConnection)
authType: FederatedIdentityTDBuild
TDBuildServiceConnection: $(TouchdownServiceConnection)
authType: SubjectNameIssuer
resourceFilePath: |
**\Resources.resx
**\Resource.resx

View File

@@ -1,11 +0,0 @@
parameters:
- name: directory
type: string
default: $(Build.SourcesDirectory)
steps:
- pwsh: |-
nuget install Microsoft.Windows.Terminal.Versioning -ConfigFile "$(Build.SourcesDirectory)\.pipelines\release-nuget.config" -OutputDirectory _versioning
$VersionRoot = (Get-Item _versioning\Microsoft.Windows.*).FullName
& "$VersionRoot\build\Setup.ps1" -ProjectDirectory "${{ parameters.directory }}" -Verbose
displayName: Set up versioning for ${{ parameters.directory }} via M.W.T.V

View File

@@ -17,22 +17,40 @@ steps:
arguments: >
-winAppSdkVersionNumber ${{ parameters.versionNumber }}
-useExperimentalVersion $${{ parameters.useExperimentalVersion }}
-rootPath "$(build.sourcesdirectory)"
# - task: NuGetCommand@2
# displayName: 'Restore NuGet packages (slnx)'
# inputs:
# command: 'restore'
# feedsToUse: 'config'
# nugetConfigPath: '$(build.sourcesdirectory)\nuget.config'
# restoreSolution: '$(build.sourcesdirectory)\**\*.slnx'
# includeNuGetOrg: false
- script: echo $(WinAppSDKVersion)
displayName: 'Display WinAppSDK Version Found'
- task: DotNetCoreCLI@2
displayName: 'Restore NuGet packages (dotnet)'
- task: DownloadPipelineArtifact@2
displayName: 'Download WindowsAppSDK'
inputs:
buildType: 'specific'
project: '55e8140e-57ac-4e5f-8f9c-c7c15b51929d'
definition: '104083'
buildVersionToDownload: 'latestFromBranch'
branchName: 'refs/heads/release/${{ parameters.versionNumber }}-stable'
artifactName: 'WindowsAppSDK_Nuget_And_MSIX'
targetPath: '$(Build.SourcesDirectory)\localpackages'
- script: dir $(Build.SourcesDirectory)\localpackages\NugetPackages
displayName: 'List downloaded packages'
- task: NuGetCommand@2
displayName: 'Install WindowsAppSDK'
inputs:
command: 'custom'
arguments: >
install "Microsoft.WindowsAppSDK"
-Source "$(Build.SourcesDirectory)\localpackages\NugetPackages"
-Version "$(WinAppSDKVersion)"
-OutputDirectory "$(Build.SourcesDirectory)\localpackages\output"
-FallbackSource "https://microsoft.pkgs.visualstudio.com/ProjectReunion/_packaging/Project.Reunion.nuget.internal/nuget/v3/index.json"
- task: NuGetCommand@2
displayName: 'Restore NuGet packages'
inputs:
command: 'restore'
projects: '$(build.sourcesdirectory)\**\*.slnx'
feedsToUse: 'config'
nugetConfigPath: '$(build.sourcesdirectory)\nuget.config'
workingDirectory: '$(build.sourcesdirectory)'
restoreSolution: '$(build.sourcesdirectory)\**\*.sln'
includeNuGetOrg: false

Some files were not shown because too many files have changed in this diff Show More