From 7244d9da67e6444f684967758520e0157da0697e Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Mon, 24 Jun 2024 16:51:12 +0900 Subject: [PATCH 01/10] Update help menu --- Tunny/UI/LoadingInstruction.cs | 38 +++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/Tunny/UI/LoadingInstruction.cs b/Tunny/UI/LoadingInstruction.cs index 50c1cec..8990e11 100644 --- a/Tunny/UI/LoadingInstruction.cs +++ b/Tunny/UI/LoadingInstruction.cs @@ -16,9 +16,12 @@ namespace Tunny.UI { public class LoadingInstruction : GH_AssemblyPriority, IDisposable { + private ToolStripMenuItem _tutorialStripMenuItem; private ToolStripMenuItem _tunnyHelpStripMenuItem; private ToolStripMenuItem _optunaDashboardToolStripMenuItem; private ToolStripMenuItem _pythonInstallStripMenuItem; + private ToolStripMenuItem _ttDesignExplorerToolStripMenuItem; + private ToolStripMenuItem _aboutTunnyStripMenuItem; public override GH_LoadingInstruction PriorityLoad() { @@ -72,20 +75,28 @@ void GH_DocumentEditor_AggregateShortcutMenuItems(object sender, GH_MenuShortcut private void AddTunnyMenuItems(ToolStripItemCollection dropDownItems) { TLog.MethodStart(); - _tunnyHelpStripMenuItem = new ToolStripMenuItem("Help", null, TunnyHelpStripMenuItem_Click, "TunnyHelpStripMenuItem"); + _tunnyHelpStripMenuItem = new ToolStripMenuItem("Help", null, null, "TunnyHelpStripMenuItem"); + _tutorialStripMenuItem = new ToolStripMenuItem("Tutorial", null, null, "TutorialStripMenuItem"); _optunaDashboardToolStripMenuItem = new ToolStripMenuItem("Run optuna-dashboard...", Resource.optuna_dashboard, OptunaDashboardToolStripMenuItem_Click, "OptunaDashboardToolStripMenuItem"); _pythonInstallStripMenuItem = new ToolStripMenuItem("Install Python...", null, PythonInstallStripMenuItem_Click, "PythonInstallStripMenuItem"); - var ttDesignExplorerToolStripMenuItem = new ToolStripMenuItem("Run TT DesignExplorer...", Resource.TTDesignExplorer, TTDesignExplorerToolStripMenuItem_Click, "TTDesignExplorerToolStripMenuItem"); - var aboutTunnyStripMenuItem = new ToolStripMenuItem("About...", Resource.TunnyIcon, AboutTunnyStripMenuItem_Click, "AboutTunnyStripMenuItem"); + _ttDesignExplorerToolStripMenuItem = new ToolStripMenuItem("Run TT DesignExplorer...", Resource.TTDesignExplorer, TTDesignExplorerToolStripMenuItem_Click, "TTDesignExplorerToolStripMenuItem"); + _aboutTunnyStripMenuItem = new ToolStripMenuItem("About...", Resource.TunnyIcon, AboutTunnyStripMenuItem_Click, "AboutTunnyStripMenuItem"); + + _tunnyHelpStripMenuItem.DropDownItems.AddRange(new[]{ + new ToolStripMenuItem("Tunny document", null, TunnyDocumentPageStripMenuItem_Click, "TunnyDocumentStripMenuItem"), + new ToolStripMenuItem("Optuna sampler document", null, OptunaSamplerPageStripMenuItem_Click, "OptunaTutorialStripMenuItem") + }); dropDownItems.AddRange(new ToolStripItem[] { _tunnyHelpStripMenuItem, + _tutorialStripMenuItem, + new ToolStripSeparator(), _optunaDashboardToolStripMenuItem, - ttDesignExplorerToolStripMenuItem, + _ttDesignExplorerToolStripMenuItem, new ToolStripSeparator(), _pythonInstallStripMenuItem, new ToolStripSeparator(), - aboutTunnyStripMenuItem + _aboutTunnyStripMenuItem }); } @@ -125,16 +136,26 @@ private void PythonInstallStripMenuItem_Click(object sender, EventArgs e) settings.Serialize(TEnvVariables.OptimizeSettingsPath); } - private void TunnyHelpStripMenuItem_Click(object sender, EventArgs e) + private void TunnyDocumentPageStripMenuItem_Click(object sender, EventArgs e) { TLog.MethodStart(); - TLog.Debug("TunnyHelpStripMenuItem Clicked"); + TLog.Debug("TunnyDocumentPageStripMenuItem Clicked"); var browser = new Process(); browser.StartInfo.FileName = $@"https://tunny-docs.deno.dev/"; browser.StartInfo.UseShellExecute = true; browser.Start(); } + private void OptunaSamplerPageStripMenuItem_Click(object sender, EventArgs e) + { + TLog.MethodStart(); + TLog.Debug("OptunaSamplerPageStripMenuItem Clicked"); + var browser = new Process(); + browser.StartInfo.FileName = $@"https://optuna.readthedocs.io/en/stable/reference/samplers/index.html"; + browser.StartInfo.UseShellExecute = true; + browser.Start(); + } + private void OptunaDashboardToolStripMenuItem_Click(object sender, EventArgs e) { TLog.MethodStart(); @@ -211,8 +232,11 @@ public void Dispose() { TLog.MethodStart(); _tunnyHelpStripMenuItem.Dispose(); + _tutorialStripMenuItem.Dispose(); _optunaDashboardToolStripMenuItem.Dispose(); _pythonInstallStripMenuItem.Dispose(); + _ttDesignExplorerToolStripMenuItem.Dispose(); + _aboutTunnyStripMenuItem.Dispose(); GC.SuppressFinalize(this); } } From 3409a3b3c6bf24251b0c8e7ee8b42addbed70455 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Mon, 24 Jun 2024 22:24:56 +0900 Subject: [PATCH 02/10] Change example file path --- .../{ => Optimization}/categorical_optimization.gh | Bin .../optimization_with_constraint.gh | Bin .../optimization_with_initial_values.gh | Bin .../{ => Optimization}/optimization_without_ui.gh | Bin .../{ => Optimization}/result_handling_example.gh | Bin .../{ => Optimization}/save_artifact_to_trial.gh | Bin 6 files changed, 0 insertions(+), 0 deletions(-) rename Examples/Grasshopper/{ => Optimization}/categorical_optimization.gh (100%) rename Examples/Grasshopper/{ => Optimization}/optimization_with_constraint.gh (100%) rename Examples/Grasshopper/{ => Optimization}/optimization_with_initial_values.gh (100%) rename Examples/Grasshopper/{ => Optimization}/optimization_without_ui.gh (100%) rename Examples/Grasshopper/{ => Optimization}/result_handling_example.gh (100%) rename Examples/Grasshopper/{ => Optimization}/save_artifact_to_trial.gh (100%) diff --git a/Examples/Grasshopper/categorical_optimization.gh b/Examples/Grasshopper/Optimization/categorical_optimization.gh similarity index 100% rename from Examples/Grasshopper/categorical_optimization.gh rename to Examples/Grasshopper/Optimization/categorical_optimization.gh diff --git a/Examples/Grasshopper/optimization_with_constraint.gh b/Examples/Grasshopper/Optimization/optimization_with_constraint.gh similarity index 100% rename from Examples/Grasshopper/optimization_with_constraint.gh rename to Examples/Grasshopper/Optimization/optimization_with_constraint.gh diff --git a/Examples/Grasshopper/optimization_with_initial_values.gh b/Examples/Grasshopper/Optimization/optimization_with_initial_values.gh similarity index 100% rename from Examples/Grasshopper/optimization_with_initial_values.gh rename to Examples/Grasshopper/Optimization/optimization_with_initial_values.gh diff --git a/Examples/Grasshopper/optimization_without_ui.gh b/Examples/Grasshopper/Optimization/optimization_without_ui.gh similarity index 100% rename from Examples/Grasshopper/optimization_without_ui.gh rename to Examples/Grasshopper/Optimization/optimization_without_ui.gh diff --git a/Examples/Grasshopper/result_handling_example.gh b/Examples/Grasshopper/Optimization/result_handling_example.gh similarity index 100% rename from Examples/Grasshopper/result_handling_example.gh rename to Examples/Grasshopper/Optimization/result_handling_example.gh diff --git a/Examples/Grasshopper/save_artifact_to_trial.gh b/Examples/Grasshopper/Optimization/save_artifact_to_trial.gh similarity index 100% rename from Examples/Grasshopper/save_artifact_to_trial.gh rename to Examples/Grasshopper/Optimization/save_artifact_to_trial.gh From 1315a963794e5e40a89f01dbdd658f0d1de1a65b Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Mon, 24 Jun 2024 22:40:12 +0900 Subject: [PATCH 03/10] Add tutorial file open from gh menu --- .vscode/settings.json | 1 + Tunny.Core/Util/TEnvVariables.cs | 3 +- Tunny/UI/LoadingInstruction.cs | 48 ++++++++++++++++++++++++++++---- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 5bcf6c5..8d72c8c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,7 @@ { "dotnet.defaultSolution": "Tunny.sln", "cSpell.words": [ + "HITL", "hovertemplate", "showlegend", "yaxis", diff --git a/Tunny.Core/Util/TEnvVariables.cs b/Tunny.Core/Util/TEnvVariables.cs index 9f80759..c112cfb 100644 --- a/Tunny.Core/Util/TEnvVariables.cs +++ b/Tunny.Core/Util/TEnvVariables.cs @@ -7,13 +7,14 @@ namespace Tunny.Core.Util public static class TEnvVariables { public static Version Version { get; } = Assembly.GetExecutingAssembly().GetName().Version; + public static string DefaultStoragePath { get; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "fish.log"); public static string TunnyEnvPath { get; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".tunny_env"); public static string LogPath { get; } = Path.Combine(TunnyEnvPath, "logs"); public static string DesignExplorerPath { get; } = Path.Combine(TunnyEnvPath, "TT-DesignExplorer"); public static string OptimizeSettingsPath { get; } = Path.Combine(TunnyEnvPath, "settings.json"); - public static string DefaultStoragePath { get; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "fish.log"); public static string PythonPath { get; } = Path.Combine(TunnyEnvPath, "python"); public static string ComponentFolder { get; } = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + public static string ExampleDirPath { get; } = Path.Combine(ComponentFolder, "Examples", "Grasshopper"); public static Version OldStorageVersion { get; } = new Version("0.9.1"); public static IntPtr GrasshopperWindowHandle { get; set; } diff --git a/Tunny/UI/LoadingInstruction.cs b/Tunny/UI/LoadingInstruction.cs index 8990e11..a6e8458 100644 --- a/Tunny/UI/LoadingInstruction.cs +++ b/Tunny/UI/LoadingInstruction.cs @@ -76,16 +76,14 @@ private void AddTunnyMenuItems(ToolStripItemCollection dropDownItems) { TLog.MethodStart(); _tunnyHelpStripMenuItem = new ToolStripMenuItem("Help", null, null, "TunnyHelpStripMenuItem"); - _tutorialStripMenuItem = new ToolStripMenuItem("Tutorial", null, null, "TutorialStripMenuItem"); - _optunaDashboardToolStripMenuItem = new ToolStripMenuItem("Run optuna-dashboard...", Resource.optuna_dashboard, OptunaDashboardToolStripMenuItem_Click, "OptunaDashboardToolStripMenuItem"); + _tutorialStripMenuItem = new ToolStripMenuItem("Tutorial Files", null, null, "TutorialStripMenuItem"); + _optunaDashboardToolStripMenuItem = new ToolStripMenuItem("Run Optuna Dashboard...", Resource.optuna_dashboard, OptunaDashboardToolStripMenuItem_Click, "OptunaDashboardToolStripMenuItem"); _pythonInstallStripMenuItem = new ToolStripMenuItem("Install Python...", null, PythonInstallStripMenuItem_Click, "PythonInstallStripMenuItem"); _ttDesignExplorerToolStripMenuItem = new ToolStripMenuItem("Run TT DesignExplorer...", Resource.TTDesignExplorer, TTDesignExplorerToolStripMenuItem_Click, "TTDesignExplorerToolStripMenuItem"); _aboutTunnyStripMenuItem = new ToolStripMenuItem("About...", Resource.TunnyIcon, AboutTunnyStripMenuItem_Click, "AboutTunnyStripMenuItem"); - _tunnyHelpStripMenuItem.DropDownItems.AddRange(new[]{ - new ToolStripMenuItem("Tunny document", null, TunnyDocumentPageStripMenuItem_Click, "TunnyDocumentStripMenuItem"), - new ToolStripMenuItem("Optuna sampler document", null, OptunaSamplerPageStripMenuItem_Click, "OptunaTutorialStripMenuItem") - }); + SetHelpDropDownItems(); + SetTutorialDropDownItems(); dropDownItems.AddRange(new ToolStripItem[] { _tunnyHelpStripMenuItem, @@ -100,6 +98,44 @@ private void AddTunnyMenuItems(ToolStripItemCollection dropDownItems) }); } + private void SetTutorialDropDownItems() + { + TLog.MethodStart(); + var optExample = new ToolStripMenuItem("Optimization", null, null, "TutorialOptimizationStripMenuItem"); + var hitlExample = new ToolStripMenuItem("Human-in-the-loop", null, null, "TutorialHITLStripMenuItem"); + string[] optFiles = Directory.GetFiles(Path.Combine(TEnvVariables.ExampleDirPath, "Optimization"), "*.gh"); + string[] hitlFiles = Directory.GetFiles(Path.Combine(TEnvVariables.ExampleDirPath, "Human-in-the-loop"), "*.gh"); + + SetMenuItemsFromFilePath(optExample, optFiles); + SetMenuItemsFromFilePath(hitlExample, hitlFiles); + + _tutorialStripMenuItem.DropDownItems.AddRange(new[] { optExample, hitlExample }); + } + + private static void SetMenuItemsFromFilePath(ToolStripMenuItem menuItem, string[] filePaths) + { + TLog.MethodStart(); + for (int i = 0; i < filePaths.Length; i++) + { + string file = filePaths[i]; + string fileName = Path.GetFileNameWithoutExtension(file); + var optItem = new ToolStripMenuItem("0" + i + " " + fileName, null, (sender, e) => + { + Grasshopper.Instances.DocumentServer.AddDocument(file, makeActive: true); + }, fileName); + menuItem.DropDownItems.Add(optItem); + } + } + + private void SetHelpDropDownItems() + { + TLog.MethodStart(); + _tunnyHelpStripMenuItem.DropDownItems.AddRange(new[]{ + new ToolStripMenuItem("Tunny Document", null, TunnyDocumentPageStripMenuItem_Click, "TunnyDocumentStripMenuItem"), + new ToolStripMenuItem("Optuna Sampler Document", null, OptunaSamplerPageStripMenuItem_Click, "OptunaTutorialStripMenuItem") + }); + } + private void AboutTunnyStripMenuItem_Click(object sender, EventArgs e) { TLog.MethodStart(); From e273d92350c47e8dc93bf032cff2c326fa6016d6 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Mon, 24 Jun 2024 22:40:21 +0900 Subject: [PATCH 04/10] Update ci build settings --- .github/workflows/build-component.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-component.yml b/.github/workflows/build-component.yml index d347d1e..6f19349 100644 --- a/.github/workflows/build-component.yml +++ b/.github/workflows/build-component.yml @@ -62,10 +62,10 @@ jobs: - name: Copy items to /Release dir shell: powershell run: | - cp ./Examples ./Release/Examples -recurse cp ./LICENSE ./Release/LICENSE.txt cp ./PYTHON_PACKAGE_LICENSES ./Release/PYTHON_PACKAGE_LICENSES.txt cp ./Tunny/bin/Debug/net48 ./Release/Tunny -recurse + cp ./Examples ./Release/Tunny/Examples -recurse cp ./TT-DesignExplorer/server/bin/Debug/net48/TT-DesignExplorer.zip ./Release/Tunny/Lib/TT-DesignExplorer.zip - name: Upload release build of plugin as artefact @@ -74,5 +74,5 @@ jobs: name: Tunny path: | ./Release - retention-days: 7 + retention-days: 1 compression-level: 9 From 65f657ae8fa25a8fbc1ff6a709f73bca84862172 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Mon, 24 Jun 2024 22:42:56 +0900 Subject: [PATCH 05/10] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9f68ba..d95647a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ Please see [here](https://github.com/hrntsm/Tunny/releases) for the data release ### Added -for new features. +- Feature to open tutorial files in the menu. ### Changed From a7f6fcc990bce3baf761b02db416dc01bd037d53 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Mon, 24 Jun 2024 22:59:02 +0900 Subject: [PATCH 06/10] Clean code --- .github/workflows/build-component.yml | 1 + Tunny/UI/LoadingInstruction.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-component.yml b/.github/workflows/build-component.yml index 6f19349..8c1e475 100644 --- a/.github/workflows/build-component.yml +++ b/.github/workflows/build-component.yml @@ -62,6 +62,7 @@ jobs: - name: Copy items to /Release dir shell: powershell run: | + mkdir ./Release cp ./LICENSE ./Release/LICENSE.txt cp ./PYTHON_PACKAGE_LICENSES ./Release/PYTHON_PACKAGE_LICENSES.txt cp ./Tunny/bin/Debug/net48 ./Release/Tunny -recurse diff --git a/Tunny/UI/LoadingInstruction.cs b/Tunny/UI/LoadingInstruction.cs index a6e8458..b454cee 100644 --- a/Tunny/UI/LoadingInstruction.cs +++ b/Tunny/UI/LoadingInstruction.cs @@ -119,7 +119,7 @@ private static void SetMenuItemsFromFilePath(ToolStripMenuItem menuItem, string[ { string file = filePaths[i]; string fileName = Path.GetFileNameWithoutExtension(file); - var optItem = new ToolStripMenuItem("0" + i + " " + fileName, null, (sender, e) => + var optItem = new ToolStripMenuItem("0" + i + " " + fileName, null, (_, e) => { Grasshopper.Instances.DocumentServer.AddDocument(file, makeActive: true); }, fileName); From 3e8792704c99b0768de9ee66aa173de5af49a2a1 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Mon, 24 Jun 2024 23:05:13 +0900 Subject: [PATCH 07/10] Fix ci --- .github/workflows/build-component.yml | 3 +-- Tunny/UI/LoadingInstruction.cs | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-component.yml b/.github/workflows/build-component.yml index 8c1e475..1e199c6 100644 --- a/.github/workflows/build-component.yml +++ b/.github/workflows/build-component.yml @@ -62,11 +62,10 @@ jobs: - name: Copy items to /Release dir shell: powershell run: | - mkdir ./Release + cp ./Examples ./Release/Tunny/Examples -recurse cp ./LICENSE ./Release/LICENSE.txt cp ./PYTHON_PACKAGE_LICENSES ./Release/PYTHON_PACKAGE_LICENSES.txt cp ./Tunny/bin/Debug/net48 ./Release/Tunny -recurse - cp ./Examples ./Release/Tunny/Examples -recurse cp ./TT-DesignExplorer/server/bin/Debug/net48/TT-DesignExplorer.zip ./Release/Tunny/Lib/TT-DesignExplorer.zip - name: Upload release build of plugin as artefact diff --git a/Tunny/UI/LoadingInstruction.cs b/Tunny/UI/LoadingInstruction.cs index b454cee..a6e8458 100644 --- a/Tunny/UI/LoadingInstruction.cs +++ b/Tunny/UI/LoadingInstruction.cs @@ -119,7 +119,7 @@ private static void SetMenuItemsFromFilePath(ToolStripMenuItem menuItem, string[ { string file = filePaths[i]; string fileName = Path.GetFileNameWithoutExtension(file); - var optItem = new ToolStripMenuItem("0" + i + " " + fileName, null, (_, e) => + var optItem = new ToolStripMenuItem("0" + i + " " + fileName, null, (sender, e) => { Grasshopper.Instances.DocumentServer.AddDocument(file, makeActive: true); }, fileName); From 898b56b08cff5051cf853f972f146d2550e2b8de Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Tue, 25 Jun 2024 08:28:23 +0900 Subject: [PATCH 08/10] Update ci --- .github/workflows/build-component.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-component.yml b/.github/workflows/build-component.yml index 1e199c6..46ef8f0 100644 --- a/.github/workflows/build-component.yml +++ b/.github/workflows/build-component.yml @@ -62,7 +62,7 @@ jobs: - name: Copy items to /Release dir shell: powershell run: | - cp ./Examples ./Release/Tunny/Examples -recurse + cp ./Examples ./Release/Examples -recurse cp ./LICENSE ./Release/LICENSE.txt cp ./PYTHON_PACKAGE_LICENSES ./Release/PYTHON_PACKAGE_LICENSES.txt cp ./Tunny/bin/Debug/net48 ./Release/Tunny -recurse From 82dac4e68d07b96d31c738c12968cdffcb10ce98 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Tue, 25 Jun 2024 08:34:25 +0900 Subject: [PATCH 09/10] Fix ci --- .github/workflows/build-component.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-component.yml b/.github/workflows/build-component.yml index 46ef8f0..27517b4 100644 --- a/.github/workflows/build-component.yml +++ b/.github/workflows/build-component.yml @@ -63,6 +63,7 @@ jobs: shell: powershell run: | cp ./Examples ./Release/Examples -recurse + cp ./Examples ./Release/Tunny/Examples -recurse cp ./LICENSE ./Release/LICENSE.txt cp ./PYTHON_PACKAGE_LICENSES ./Release/PYTHON_PACKAGE_LICENSES.txt cp ./Tunny/bin/Debug/net48 ./Release/Tunny -recurse From a763b8c6464e8e043993100c08d648ce211f1dc5 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Tue, 25 Jun 2024 08:38:54 +0900 Subject: [PATCH 10/10] fix ci --- .github/workflows/build-component.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-component.yml b/.github/workflows/build-component.yml index 27517b4..c1e7e87 100644 --- a/.github/workflows/build-component.yml +++ b/.github/workflows/build-component.yml @@ -63,11 +63,11 @@ jobs: shell: powershell run: | cp ./Examples ./Release/Examples -recurse - cp ./Examples ./Release/Tunny/Examples -recurse cp ./LICENSE ./Release/LICENSE.txt cp ./PYTHON_PACKAGE_LICENSES ./Release/PYTHON_PACKAGE_LICENSES.txt cp ./Tunny/bin/Debug/net48 ./Release/Tunny -recurse cp ./TT-DesignExplorer/server/bin/Debug/net48/TT-DesignExplorer.zip ./Release/Tunny/Lib/TT-DesignExplorer.zip + cp ./Examples ./Release/Tunny/Examples -recurse - name: Upload release build of plugin as artefact uses: actions/upload-artifact@v4