Add the Command Palette module (#37908)

Windows Command Palette ("CmdPal") is the next iteration of PowerToys Run. With extensibility at its core, the Command Palette is your one-stop launcher to start _anything_.

By default, CmdPal is bound to <kbd>Win+Alt+Space</kbd>.

![cmdpal-pr-002](https://github.com/user-attachments/assets/5077ec04-1009-478a-92d6-0a30989d44ac)
![cmdpal-pr-003](https://github.com/user-attachments/assets/63b4762a-9c19-48eb-9242-18ea48240ba0)

----

This brings the current preview version of CmdPal into the upstream PowerToys repo. There are still lots of bugs to work out, but it's reached the state we're ready to start sharing it with the world. From here, we can further collaborate with the community on the features that are important, and ensuring that we've got a most robust API to enable developers to build whatever extensions they want. 

Most of the built-in PT Run modules have already been ported to CmdPal's extension API. Those include:
* Installed apps
* Shell commands
* File search (powered by the indexer)
* Windows Registry search
* Web search
* Windows Terminal Profiles
* Windows Services
* Windows settings


There are a couple new extensions built-in
* You can now search for packages on `winget` and install them right from the palette. This also powers searching for extensions for the palette
* The calculator has an entirely new implementation. This is currently less feature complete than the original PT Run one - we're looking forward to updating it to be more complete for future ingestion in Windows
* "Bookmarks" allow you to save shortcuts to files, folders, and webpages as top-level commands in the palette. 

We've got a bunch of other samples too, in this repo and elsewhere

### PowerToys specific notes

CmdPal will eventually graduate out of PowerToys to live as its own application, which is why it's implemented just a little differently than most other modules. Enabling CmdPal will install its `msix` package. 

The CI was minorly changed to support CmdPal version numbers independent of PowerToys itself. It doesn't make sense for us to start CmdPal at v0.90, and in the future, we want to be able to rev CmdPal independently of PT itself. 


Closes #3200, closes #3600, closes #7770, closes #34273, closes #36471, closes #20976, closes #14495
  
  
-----

TODOs et al


**Blocking:**
- [ ] Images and descriptions in Settings and OOBE need to be properly defined, as mentioned before
  - [ ] Niels is on it
- [x] Doesn't start properly from PowerToys unless the fix PR is merged.
  - https://github.com/zadjii-msft/PowerToys/pull/556 merged
- [x] I seem to lose focus a lot when I press on some limits, like between the search bar and the results.
  - This is https://github.com/zadjii-msft/PowerToys/issues/427
- [x] Turned off an extension like Calculator and it was still working.
  - Need to get rid of that toggle, it doesn't do anything currently
- [x] `ListViewModel.<FetchItems>` crash
  - Pretty confident that was fixed in https://github.com/zadjii-msft/PowerToys/pull/553

**Not blocking / improvements:**
- Show the shortcut through settings, as mentioned before, or create a button that would open CmdPalette settings.
- When PowerToys starts, CmdPalette is always shown if enabled. That's weird when just starting PowerToys/ logging in to the computer with PowerToys auto-start activated. I think this should at least be a setting.
- Needing to double press a result for it to do the default action seems quirky. If one is already selected, I think just pressing should be enough for it to do the action.
  - This is currently a setting, though we're thinking of changing the setting even more: https://github.com/zadjii-msft/PowerToys/issues/392
- There's no URI extension. Was surprised when typing a URL that it only proposed a web search.
- [x] There's no System commands extension. Was expecting to be able to quickly restart the computer by typing restart but it wasn't there.
  - This is in PR https://github.com/zadjii-msft/PowerToys/pull/452  
  
---------

Co-authored-by: joadoumie <98557455+joadoumie@users.noreply.github.com>
Co-authored-by: Jordi Adoumie <jordiadoumie@microsoft.com>
Co-authored-by: Mike Griese <zadjii@gmail.com>
Co-authored-by: Niels Laute <niels.laute@live.nl>
Co-authored-by: Michael Hawker <24302614+michael-hawker@users.noreply.github.com>
Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Co-authored-by: Seraphima <zykovas91@gmail.com>
Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
Co-authored-by: Kristen Schau <47155823+krschau@users.noreply.github.com>
Co-authored-by: Eric Johnson <ericjohnson327@gmail.com>
Co-authored-by: Ethan Fang <ethanfang@microsoft.com>
Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
Co-authored-by: Clint Rutkas <clint@rutkas.com>
This commit is contained in:
Mike Griese
2025-03-19 03:39:57 -05:00
committed by GitHub
parent a62acf7a71
commit f68f408be3
984 changed files with 69758 additions and 277 deletions

View File

@@ -0,0 +1,414 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Microsoft.CmdPal.UI.ViewModels.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.CmdPal.UI.ViewModels.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Create another.
/// </summary>
public static string builtin_create_extension_create_another {
get {
return ResourceManager.GetString("builtin_create_extension_create_another", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Where should the new extension be created? This path will be created if it doesn&apos;t exist.
/// </summary>
public static string builtin_create_extension_directory_description {
get {
return ResourceManager.GetString("builtin_create_extension_directory_description", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Output path.
/// </summary>
public static string builtin_create_extension_directory_header {
get {
return ResourceManager.GetString("builtin_create_extension_directory_header", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Output path.
/// </summary>
public static string builtin_create_extension_directory_label {
get {
return ResourceManager.GetString("builtin_create_extension_directory_label", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Output path is required.
/// </summary>
public static string builtin_create_extension_directory_required {
get {
return ResourceManager.GetString("builtin_create_extension_directory_required", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The name of your extension as users will see it..
/// </summary>
public static string builtin_create_extension_display_name_description {
get {
return ResourceManager.GetString("builtin_create_extension_display_name_description", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Display name.
/// </summary>
public static string builtin_create_extension_display_name_header {
get {
return ResourceManager.GetString("builtin_create_extension_display_name_header", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Display name.
/// </summary>
public static string builtin_create_extension_display_name_label {
get {
return ResourceManager.GetString("builtin_create_extension_display_name_label", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Display name is required.
/// </summary>
public static string builtin_create_extension_display_name_required {
get {
return ResourceManager.GetString("builtin_create_extension_display_name_required", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Open.
/// </summary>
public static string builtin_create_extension_name {
get {
return ResourceManager.GetString("builtin_create_extension_name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to This is the name of your new extension project. It should be a valid C# class name. Best practice is to also include the word &apos;Extension&apos; in the name..
/// </summary>
public static string builtin_create_extension_name_description {
get {
return ResourceManager.GetString("builtin_create_extension_name_description", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Extension name.
/// </summary>
public static string builtin_create_extension_name_header {
get {
return ResourceManager.GetString("builtin_create_extension_name_header", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Extension name.
/// </summary>
public static string builtin_create_extension_name_label {
get {
return ResourceManager.GetString("builtin_create_extension_name_label", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Extension name is required, without spaces.
/// </summary>
public static string builtin_create_extension_name_required {
get {
return ResourceManager.GetString("builtin_create_extension_name_required", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Open directory.
/// </summary>
public static string builtin_create_extension_open_directory {
get {
return ResourceManager.GetString("builtin_create_extension_open_directory", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Open Solution.
/// </summary>
public static string builtin_create_extension_open_solution {
get {
return ResourceManager.GetString("builtin_create_extension_open_solution", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Use this page to create a new extension project..
/// </summary>
public static string builtin_create_extension_page_text {
get {
return ResourceManager.GetString("builtin_create_extension_page_text", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Create your new extension.
/// </summary>
public static string builtin_create_extension_page_title {
get {
return ResourceManager.GetString("builtin_create_extension_page_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Create extension.
/// </summary>
public static string builtin_create_extension_submit {
get {
return ResourceManager.GetString("builtin_create_extension_submit", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Successfully created your new extension!.
/// </summary>
public static string builtin_create_extension_success {
get {
return ResourceManager.GetString("builtin_create_extension_success", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Create a new extension.
/// </summary>
public static string builtin_create_extension_title {
get {
return ResourceManager.GetString("builtin_create_extension_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Your new extension &apos;${displayName}&apos; was created in:.
/// </summary>
public static string builtin_created_in_text {
get {
return ResourceManager.GetString("builtin_created_in_text", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Now that your extension project has been created, open the solution up in Visual Studio to start writing your extension code..
/// </summary>
public static string builtin_created_next_steps {
get {
return ResourceManager.GetString("builtin_created_next_steps", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Navigate to `${name}Page.cs` to start adding items to the list, or to `${name}CommandsProvider.cs` to add new commands..
/// </summary>
public static string builtin_created_next_steps_p2 {
get {
return ResourceManager.GetString("builtin_created_next_steps_p2", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Once you&apos;re ready to test deploy the package locally with Visual Studio, then run the \&quot;Reload\&quot; command in the Command Palette to load your new extension..
/// </summary>
public static string builtin_created_next_steps_p3 {
get {
return ResourceManager.GetString("builtin_created_next_steps_p3", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Next steps.
/// </summary>
public static string builtin_created_next_steps_title {
get {
return ResourceManager.GetString("builtin_created_next_steps_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Creating new extension....
/// </summary>
public static string builtin_creating_extension_message {
get {
return ResourceManager.GetString("builtin_creating_extension_message", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Built-in commands.
/// </summary>
public static string builtin_display_name {
get {
return ResourceManager.GetString("builtin_display_name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to View log.
/// </summary>
public static string builtin_log_name {
get {
return ResourceManager.GetString("builtin_log_name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Log.
/// </summary>
public static string builtin_log_page_name {
get {
return ResourceManager.GetString("builtin_log_page_name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to View log messages.
/// </summary>
public static string builtin_log_subtitle {
get {
return ResourceManager.GetString("builtin_log_subtitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to View log.
/// </summary>
public static string builtin_log_title {
get {
return ResourceManager.GetString("builtin_log_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Creates a project for a new Command Palette extension.
/// </summary>
public static string builtin_new_extension_subtitle {
get {
return ResourceManager.GetString("builtin_new_extension_subtitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Open Settings.
/// </summary>
public static string builtin_open_settings_name {
get {
return ResourceManager.GetString("builtin_open_settings_name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Open Command Palette settings.
/// </summary>
public static string builtin_open_settings_subtitle {
get {
return ResourceManager.GetString("builtin_open_settings_subtitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Exit Command Palette.
/// </summary>
public static string builtin_quit_subtitle {
get {
return ResourceManager.GetString("builtin_quit_subtitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Reload Command Palette extensions.
/// </summary>
public static string builtin_reload_display_title {
get {
return ResourceManager.GetString("builtin_reload_display_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Reload.
/// </summary>
public static string builtin_reload_name {
get {
return ResourceManager.GetString("builtin_reload_name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Reload Command Palette extensions.
/// </summary>
public static string builtin_reload_subtitle {
get {
return ResourceManager.GetString("builtin_reload_subtitle", resourceCulture);
}
}
}
}

View File

@@ -0,0 +1,239 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="builtin_open_settings_subtitle" xml:space="preserve">
<value>Open Command Palette settings</value>
</data>
<data name="builtin_new_extension_subtitle" xml:space="preserve">
<value>Creates a project for a new Command Palette extension</value>
</data>
<data name="builtin_quit_subtitle" xml:space="preserve">
<value>Exit Command Palette</value>
</data>
<data name="builtin_display_name" xml:space="preserve">
<value>Built-in commands</value>
</data>
<data name="builtin_log_subtitle" xml:space="preserve">
<value>View log messages</value>
</data>
<data name="builtin_log_title" xml:space="preserve">
<value>View log</value>
</data>
<data name="builtin_reload_subtitle" xml:space="preserve">
<value>Reload Command Palette extensions</value>
</data>
<data name="builtin_reload_name" xml:space="preserve">
<value>Reload</value>
</data>
<data name="builtin_log_name" xml:space="preserve">
<value>View log</value>
</data>
<data name="builtin_log_page_name" xml:space="preserve">
<value>Log</value>
</data>
<data name="builtin_creating_extension_message" xml:space="preserve">
<value>Creating new extension...</value>
</data>
<data name="builtin_create_extension_name" xml:space="preserve">
<value>Open</value>
</data>
<data name="builtin_create_extension_title" xml:space="preserve">
<value>Create a new extension</value>
</data>
<data name="builtin_open_settings_name" xml:space="preserve">
<value>Open Settings</value>
</data>
<data name="builtin_create_extension_success" xml:space="preserve">
<value>Successfully created your new extension!</value>
</data>
<data name="builtin_created_in_text" xml:space="preserve">
<value>Your new extension '${displayName}' was created in:</value>
<comment>{Locked="'${displayName}'"}</comment>
</data>
<data name="builtin_created_next_steps_title" xml:space="preserve">
<value>Next steps</value>
</data>
<data name="builtin_created_next_steps" xml:space="preserve">
<value>Now that your extension project has been created, open the solution up in Visual Studio to start writing your extension code.</value>
</data>
<data name="builtin_created_next_steps_p2" xml:space="preserve">
<value>Navigate to `${name}Page.cs` to start adding items to the list, or to `${name}CommandsProvider.cs` to add new commands.</value>
<comment>{Locked="`${name}Page.cs`", "`${name}CommandsProvider.cs`"}</comment>
</data>
<data name="builtin_created_next_steps_p3" xml:space="preserve">
<value>Once you're ready to test deploy the package locally with Visual Studio, then run the \"Reload\" command in the Command Palette to load your new extension.</value>
</data>
<data name="builtin_create_extension_page_title" xml:space="preserve">
<value>Create your new extension</value>
</data>
<data name="builtin_create_extension_page_text" xml:space="preserve">
<value>Use this page to create a new extension project.</value>
</data>
<data name="builtin_create_extension_name_header" xml:space="preserve">
<value>Extension name</value>
</data>
<data name="builtin_create_extension_name_description" xml:space="preserve">
<value>This is the name of your new extension project. It should be a valid C# class name. Best practice is to also include the word 'Extension' in the name.</value>
</data>
<data name="builtin_create_extension_name_label" xml:space="preserve">
<value>Extension name</value>
</data>
<data name="builtin_create_extension_name_required" xml:space="preserve">
<value>Extension name is required, without spaces</value>
</data>
<data name="builtin_create_extension_display_name_header" xml:space="preserve">
<value>Display name</value>
</data>
<data name="builtin_create_extension_display_name_description" xml:space="preserve">
<value>The name of your extension as users will see it.</value>
</data>
<data name="builtin_create_extension_display_name_label" xml:space="preserve">
<value>Display name</value>
</data>
<data name="builtin_create_extension_display_name_required" xml:space="preserve">
<value>Display name is required</value>
</data>
<data name="builtin_create_extension_directory_header" xml:space="preserve">
<value>Output path</value>
</data>
<data name="builtin_create_extension_directory_description" xml:space="preserve">
<value>Where should the new extension be created? This path will be created if it doesn't exist</value>
</data>
<data name="builtin_create_extension_directory_label" xml:space="preserve">
<value>Output path</value>
</data>
<data name="builtin_create_extension_directory_required" xml:space="preserve">
<value>Output path is required</value>
</data>
<data name="builtin_create_extension_open_solution" xml:space="preserve">
<value>Open Solution</value>
</data>
<data name="builtin_create_extension_open_directory" xml:space="preserve">
<value>Open directory</value>
</data>
<data name="builtin_create_extension_create_another" xml:space="preserve">
<value>Create another</value>
</data>
<data name="builtin_create_extension_submit" xml:space="preserve">
<value>Create extension</value>
</data>
<data name="builtin_reload_display_title" xml:space="preserve">
<value>Reload Command Palette extensions</value>
</data>
</root>