diff --git a/Flow.Launcher.sln b/Flow.Launcher.sln
index 6196aa5df..22086b0bd 100644
--- a/Flow.Launcher.sln
+++ b/Flow.Launcher.sln
@@ -20,6 +20,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher", "Flow.Launc
{59BD9891-3837-438A-958D-ADC7F91F6F7E} = {59BD9891-3837-438A-958D-ADC7F91F6F7E}
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} = {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}
{F35190AA-4758-4D9E-A193-E3BDF6AD3567} = {F35190AA-4758-4D9E-A193-E3BDF6AD3567}
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE} = {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}
{9B130CC5-14FB-41FF-B310-0A95B6894C37} = {9B130CC5-14FB-41FF-B310-0A95B6894C37}
{FDED22C8-B637-42E8-824A-63B5B6E05A3A} = {FDED22C8-B637-42E8-824A-63B5B6E05A3A}
{A3DCCBCA-ACC1-421D-B16E-210896234C26} = {A3DCCBCA-ACC1-421D-B16E-210896234C26}
@@ -71,6 +72,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Explor
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.ProcessKiller", "Plugins\Flow.Launcher.Plugin.ProcessKiller\Flow.Launcher.Plugin.ProcessKiller.csproj", "{588088F4-3262-4F9F-9663-A05DE12534C3}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flow.Launcher.Plugin.PluginsManager", "Plugins\Flow.Launcher.Plugin.PluginManager\Flow.Launcher.Plugin.PluginsManager.csproj", "{70CB72BC-1CD6-453D-9CA5-F7E2441426FE}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -298,6 +301,18 @@ Global
{588088F4-3262-4F9F-9663-A05DE12534C3}.Release|x64.Build.0 = Release|Any CPU
{588088F4-3262-4F9F-9663-A05DE12534C3}.Release|x86.ActiveCfg = Release|Any CPU
{588088F4-3262-4F9F-9663-A05DE12534C3}.Release|x86.Build.0 = Release|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Debug|x64.Build.0 = Debug|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Debug|x86.Build.0 = Debug|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Release|x64.ActiveCfg = Release|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Release|x64.Build.0 = Release|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Release|x86.ActiveCfg = Release|Any CPU
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -316,6 +331,7 @@ Global
{59BD9891-3837-438A-958D-ADC7F91F6F7E} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
{F9C4C081-4CC3-4146-95F1-E102B4E10A5F} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
{588088F4-3262-4F9F-9663-A05DE12534C3} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
+ {70CB72BC-1CD6-453D-9CA5-F7E2441426FE} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F26ACB50-3F6C-4907-B0C9-1ADACC1D0DED}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginManager/Flow.Launcher.Plugin.PluginsManager.csproj b/Plugins/Flow.Launcher.Plugin.PluginManager/Flow.Launcher.Plugin.PluginsManager.csproj
new file mode 100644
index 000000000..b1d0c6f68
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.PluginManager/Flow.Launcher.Plugin.PluginsManager.csproj
@@ -0,0 +1,30 @@
+
+
+
+ Library
+ netcoreapp3.1
+ true
+ true
+ true
+ false
+
+
+
+ ..\..\Output\Debug\Plugins\Flow.Launcher.Plugin.PluginsManager
+
+
+
+ ..\..\Output\Release\Plugins\Flow.Launcher.Plugin.PluginsManager
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.PluginManager/Main.cs b/Plugins/Flow.Launcher.Plugin.PluginManager/Main.cs
new file mode 100644
index 000000000..36e40bf1b
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.PluginManager/Main.cs
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Flow.Launcher.Plugin.PluginsManager
+{
+ class Main
+ {
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginManager/Plugins.cs b/Plugins/Flow.Launcher.Plugin.PluginManager/Plugins.cs
new file mode 100644
index 000000000..f6538b7ef
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.PluginManager/Plugins.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Flow.Launcher.Plugin.PluginsManager
+{
+ internal class Plugin
+ {
+ public string Name { get; set; }
+ public string Url { get; set; }
+ public string Version { get; set; }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginManager/PluginsManager.cs
new file mode 100644
index 000000000..055e027ad
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.PluginManager/PluginsManager.cs
@@ -0,0 +1,46 @@
+using Flow.Launcher.Infrastructure.Http;
+using System;
+using System.Collections.Generic;
+using System.Net;
+using System.Text;
+
+namespace Flow.Launcher.Plugin.PluginsManager
+{
+ internal class PluginsManager
+ {
+ internal void PluginInstall(Plugin plugin)
+ {
+ if (PluginExists())
+ {
+ //prompt user if want to install
+
+ return;
+ }
+
+ PluginDowload(plugin.Url, "");
+ }
+
+ private void PluginDowload(string downloadUrl, string toFilePath)
+ {
+ using (var wc = new WebClient { Proxy = Http.WebProxy() })
+ {
+ wc.DownloadFile(downloadUrl, toFilePath);
+ }
+ }
+
+ internal void PluginUpdate()
+ {
+
+ }
+
+ internal bool PluginExists()
+ {
+ return false;
+ }
+
+ internal void PluginsManifestSiteOpen()
+ {
+
+ }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginManager/PluginsManifest.cs b/Plugins/Flow.Launcher.Plugin.PluginManager/PluginsManifest.cs
new file mode 100644
index 000000000..d470a996c
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.PluginManager/PluginsManifest.cs
@@ -0,0 +1,35 @@
+using Flow.Launcher.Infrastructure.Http;
+using Flow.Launcher.Infrastructure.Logger;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Net;
+using System.Text;
+
+namespace Flow.Launcher.Plugin.PluginsManager
+{
+ class PluginsManifest
+ {
+ public List Plugins { get; private set; }
+ public PluginsManifest()
+ {
+ var json = string.Empty;
+
+ using (var wc = new WebClient { Proxy = Http.WebProxy() })
+ {
+ try
+ {
+ json = wc.DownloadString("https://raw.githubusercontent.com/Flow-Launcher/Flow.Launcher.PluginsManifest/main/plugins.json");
+ }
+ catch (Exception e)
+ {
+ Log.Exception("|PluginManagement.GetManifest|Encountered error trying to download plugins manifest", e);
+
+ Plugins = new List();
+ }
+ }
+
+ Plugins = !string.IsNullOrEmpty(json) ? JsonConvert.DeserializeObject>(json) : new List();
+ }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginManager/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginManager/plugin.json
new file mode 100644
index 000000000..327011ac3
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.PluginManager/plugin.json
@@ -0,0 +1,14 @@
+{
+ "ID": "9f8f9b14-2518-4907-b211-35ab6290dee7",
+ "ActionKeywords": [
+ "pm"
+ ],
+ "Name": "Plugins Manager",
+ "Description": "Management of installing, uninstalling or updating Flow Launcher plugins",
+ "Author": "Jeremy Wu",
+ "Version": "1.0.0",
+ "Language": "csharp",
+ "Website": "https://github.com/Flow-Launcher/Flow.Launcher",
+ "ExecuteFileName": "Flow.Launcher.Plugin.PluginsManager.dll",
+ "IcoPath": "Images\\pluginsmanager.png"
+}