diff --git a/Installer/Installer.iss b/Installer/Installer.iss index 9d35794..7a3b598 100644 --- a/Installer/Installer.iss +++ b/Installer/Installer.iss @@ -5,7 +5,7 @@ #define MyAppPublisher "ThreadPilot" #define MyAppURL "https://github.com/" #define MyAppExeName "ThreadPilot.exe" -#define MyAppVersion "1.4.2" +#define MyAppVersion "1.4.3" #ifndef MyWizardStyle #define MyWizardStyle "modern dynamic windows11" diff --git a/Installer/ThreadPilot.wxs b/Installer/ThreadPilot.wxs index 8c4f753..2169298 100644 --- a/Installer/ThreadPilot.wxs +++ b/Installer/ThreadPilot.wxs @@ -7,7 +7,7 @@ diff --git a/Installer/setup.iss b/Installer/setup.iss index 0576d29..d4af198 100644 --- a/Installer/setup.iss +++ b/Installer/setup.iss @@ -11,7 +11,7 @@ #endif #ifndef MyAppVersion - #define MyAppVersion "1.4.2" + #define MyAppVersion "1.4.3" #endif #ifndef MyAppSourceDir diff --git a/Services/PowerPlanService.cs b/Services/PowerPlanService.cs index 422f606..e823a4b 100644 --- a/Services/PowerPlanService.cs +++ b/Services/PowerPlanService.cs @@ -16,7 +16,7 @@ public class PowerPlanService : IPowerPlanService private static readonly Lazy powerPlansPath = new(GetPowerPlansPath); private static readonly string powerCfgExecutablePath = Path.Combine(Environment.SystemDirectory, "powercfg.exe"); private static readonly TimeSpan powerCfgTimeout = TimeSpan.FromSeconds(20); - private static readonly Regex powerSchemeRegex = new(@"Power Scheme GUID: (.*?) \((.*?)\)", RegexOptions.Multiline | RegexOptions.Compiled); + private static readonly Regex powerSchemeRegex = new(@"^Power Scheme GUID: (.*?) \((.*)\)(?:\s+\*)?$", RegexOptions.Multiline | RegexOptions.Compiled); private static readonly Regex pathTraversalRegex = new(@"(^|[\\/])\.\.([\\/]|$)", RegexOptions.Compiled); private static string PowerPlansPath => powerPlansPath.Value; @@ -517,6 +517,12 @@ private bool TryNormalizePowerPlanPath(string filePath, out string normalizedPat } var fileInfo = new FileInfo(normalizedPath); + if (fileInfo.Length == 0) + { + error = "Power plan file is empty."; + return false; + } + if (fileInfo.Length > 10 * 1024 * 1024) { error = "Power plan file size exceeds 10 MB limit."; diff --git a/Tests/ThreadPilot.Core.Tests/BundledPowerPlanAssetTests.cs b/Tests/ThreadPilot.Core.Tests/BundledPowerPlanAssetTests.cs new file mode 100644 index 0000000..a9de865 --- /dev/null +++ b/Tests/ThreadPilot.Core.Tests/BundledPowerPlanAssetTests.cs @@ -0,0 +1,127 @@ +namespace ThreadPilot.Core.Tests +{ + using System.Security.Cryptography; + using System.Text; + using Microsoft.Extensions.Logging.Abstractions; + using Moq; + using ThreadPilot.Services; + using ThreadPilot.Services.Abstractions; + + public sealed class BundledPowerPlanAssetTests + { + private static readonly string[] NewPlanFiles = + [ + "0 Synez_Public_Power.pow", + "arsenza low latency (INTEL FIX THREAD-DIRECTOR).pow", + "arsenza low latency.pow", + "AutoOS.pow", + "BEYOND-PERFORMANCE-AMD+INTEL.pow", + "Bitsum Highest Performance.pow", + "cactusOS.pow", + "FPSHEAVEN2026.pow", + "GALA's ultimate performance(AMD).pow", + "Gavot Performance.pow", + "GTweaks Power Plan V3.pow", + "imribiy2026.pow", + "IrisFixed.pow", + "J o k r O S P o w e r P l a n.pow", + "Jackpot2026.pow", + "Kizzimo's Extreme Low Latency.pow", + "KSOS11.pow", + "melody LowestLatency.pow", + "Microsoft High performance.pow", + "Microsoft Ultimate Performance.pow", + "Mitstas IDLE ENABLED.pow", + "n1kobg GPU_Booster_Power_Plan.pow", + "Prodazin Power Plan.pow", + "Reticle v2.pow", + "RevisionPowerPlanV2.8.pow", + "RIP Tweaks Power Plan.pow", + "Rosca Tweaks v2.pow", + "Velo's Power Plan.pow", + "VTRL Optimized.pow", + "XNRL Pro Plan.pow", + ]; + + [Fact] + public void BundledPlans_AreValidUniqueRegistryHives() + { + var directory = GetPowerPlansDirectory(); + var files = Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly); + + Assert.All(files, file => Assert.Equal(".pow", Path.GetExtension(file), ignoreCase: true)); + Assert.Equal(files.Length, files.Select(Path.GetFileNameWithoutExtension).Distinct(StringComparer.OrdinalIgnoreCase).Count()); + + foreach (var file in files) + { + var info = new FileInfo(file); + Assert.InRange(info.Length, 4, 10 * 1024 * 1024); + Assert.Equal("regf", Encoding.ASCII.GetString(File.ReadAllBytes(file), 0, 4)); + Assert.DoesNotContain(Path.GetFileName(file), character => Path.GetInvalidFileNameChars().Contains(character)); + Assert.DoesNotContain("#U", Path.GetFileName(file), StringComparison.OrdinalIgnoreCase); + } + } + + [Fact] + public async Task NewAndExistingPlans_ArePresentDiscoverableAndNotBinaryDuplicates() + { + var directory = GetPowerPlansDirectory(); + var files = Directory.GetFiles(directory, "*.pow", SearchOption.TopDirectoryOnly); + var newPaths = NewPlanFiles.Select(file => Path.Combine(directory, file)).ToArray(); + + Assert.All(newPaths, path => Assert.True(File.Exists(path), $"Missing bundled power plan: {Path.GetFileName(path)}")); + Assert.All(["Amit.pow", "Beyond.pow", "L1 Final Version.pow"], file => Assert.True(File.Exists(Path.Combine(directory, file)))); + + var newHashes = newPaths.ToDictionary(path => path, GetSha256); + Assert.Equal(newHashes.Count, newHashes.Values.Distinct(StringComparer.Ordinal).Count()); + Assert.All( + newHashes, + entry => Assert.DoesNotContain(files, file => !newPaths.Contains(file, StringComparer.OrdinalIgnoreCase) && GetSha256(file) == entry.Value)); + + var logger = new Mock(MockBehavior.Loose); + var runner = new Mock(MockBehavior.Strict); + var service = new PowerPlanService( + NullLogger.Instance, + logger.Object, + runner.Object, + () => directory); + + var discovered = await service.GetCustomPowerPlansAsync(); + Assert.All(NewPlanFiles, file => Assert.Contains(discovered, plan => plan.Name == Path.GetFileNameWithoutExtension(file))); + Assert.Equal(files.Length, discovered.Count); + } + + [Fact] + public void Project_ConfiguresAllPowerPlansForBuildAndPublish() + { + var project = File.ReadAllText(Path.Combine(FindRepositoryRoot(), "ThreadPilot.csproj")); + + Assert.Contains(@"assets\Powerplans\**\*.pow", project, StringComparison.Ordinal); + Assert.Contains(@"Powerplans\%(RecursiveDir)%(Filename)%(Extension)", project, StringComparison.Ordinal); + Assert.Contains("PreserveNewest", project, StringComparison.Ordinal); + Assert.Contains("PreserveNewest", project, StringComparison.Ordinal); + } + + private static string GetPowerPlansDirectory() => + Path.Combine(FindRepositoryRoot(), "assets", "Powerplans"); + + private static string GetSha256(string path) => + Convert.ToHexString(SHA256.HashData(File.ReadAllBytes(path))); + + private static string FindRepositoryRoot() + { + var directory = new DirectoryInfo(AppContext.BaseDirectory); + while (directory != null) + { + if (File.Exists(Path.Combine(directory.FullName, "ThreadPilot.csproj"))) + { + return directory.FullName; + } + + directory = directory.Parent; + } + + throw new InvalidOperationException("Repository root could not be located."); + } + } +} diff --git a/Tests/ThreadPilot.Core.Tests/PackagingMetadataTests.cs b/Tests/ThreadPilot.Core.Tests/PackagingMetadataTests.cs index f659ffb..d44bc2d 100644 --- a/Tests/ThreadPilot.Core.Tests/PackagingMetadataTests.cs +++ b/Tests/ThreadPilot.Core.Tests/PackagingMetadataTests.cs @@ -4,8 +4,8 @@ namespace ThreadPilot.Core.Tests public sealed partial class PackagingMetadataTests { - private const string ReleaseVersion = "1.4.2"; - private const string ReleaseAssemblyVersion = "1.4.2.0"; + private const string ReleaseVersion = "1.4.3"; + private const string ReleaseAssemblyVersion = "1.4.3.0"; [Fact] public void InnoInstallers_UseStableDisplayNameAndSeparateVersionMetadata() @@ -100,7 +100,7 @@ private static string FindRepositoryRoot() throw new InvalidOperationException("Repository root could not be located."); } - [GeneratedRegex("#define MyAppVersion \"1\\.4\\.2\"", RegexOptions.CultureInvariant)] + [GeneratedRegex("#define MyAppVersion \"1\\.4\\.3\"", RegexOptions.CultureInvariant)] private static partial Regex MyAppVersionRegex(); } } diff --git a/Tests/ThreadPilot.Core.Tests/PowerPlanServiceSecurityTests.cs b/Tests/ThreadPilot.Core.Tests/PowerPlanServiceSecurityTests.cs index 770cad0..2bea449 100644 --- a/Tests/ThreadPilot.Core.Tests/PowerPlanServiceSecurityTests.cs +++ b/Tests/ThreadPilot.Core.Tests/PowerPlanServiceSecurityTests.cs @@ -40,6 +40,32 @@ public async Task ImportCustomPowerPlan_ReturnsFalse_ForInvalidExtension() } } + [Fact] + public async Task ImportCustomPowerPlan_ReturnsFalse_ForEmptyFile() + { + var service = CreateService(); + var filePath = Path.Combine(Path.GetTempPath(), $"threadpilot-empty-{Guid.NewGuid():N}.pow"); + await File.WriteAllBytesAsync(filePath, []); + + try + { + Assert.False(await service.ImportCustomPowerPlan(filePath)); + } + finally + { + File.Delete(filePath); + } + } + + [Fact] + public async Task ImportCustomPowerPlan_ReturnsFalse_ForMissingFile() + { + var service = CreateService(); + var filePath = Path.Combine(Path.GetTempPath(), $"threadpilot-missing-{Guid.NewGuid():N}.pow"); + + Assert.False(await service.ImportCustomPowerPlan(filePath)); + } + [Theory] [InlineData("")] [InlineData("invalid-guid")] diff --git a/Tests/ThreadPilot.Core.Tests/PowerPlanServiceTests.cs b/Tests/ThreadPilot.Core.Tests/PowerPlanServiceTests.cs index 67bc6d1..9982d06 100644 --- a/Tests/ThreadPilot.Core.Tests/PowerPlanServiceTests.cs +++ b/Tests/ThreadPilot.Core.Tests/PowerPlanServiceTests.cs @@ -31,6 +31,25 @@ public async Task GetActivePowerPlan_ParsesPowerCfgOutput() Assert.True(result.IsActive); } + [Fact] + public async Task GetActivePowerPlan_PreservesParenthesesInDisplayName() + { + const string guid = "381b4222-f694-41f0-9685-ff5bb260df2e"; + var runner = new RecordingProcessRunner + { + ResultFactory = _ => new ProcessRunResult( + 0, + $"Power Scheme GUID: {guid} (Ultimate Performance (AMD)) *", + string.Empty), + }; + var service = CreateService(runner); + + var result = await service.GetActivePowerPlan(); + + Assert.NotNull(result); + Assert.Equal("Ultimate Performance (AMD)", result.Name); + } + [Fact] public async Task SetActivePowerPlanByGuidAsync_SkipsChange_WhenAlreadyActive() { diff --git a/ThreadPilot.csproj b/ThreadPilot.csproj index c2897b2..1cf32eb 100644 --- a/ThreadPilot.csproj +++ b/ThreadPilot.csproj @@ -16,10 +16,10 @@ link true CS1998;CS0067;CS0414;WFAC010;IL3000;MVVMTK0034 - 1.4.2 - 1.4.2.0 - 1.4.2.0 - 1.4.2 + 1.4.3 + 1.4.3.0 + 1.4.3.0 + 1.4.3 diff --git a/app.manifest b/app.manifest index 4f1c660..e069943 100644 --- a/app.manifest +++ b/app.manifest @@ -1,6 +1,6 @@ - + diff --git a/assets/Powerplans/0 Synez_Public_Power.pow b/assets/Powerplans/0 Synez_Public_Power.pow new file mode 100644 index 0000000..3b6eab3 Binary files /dev/null and b/assets/Powerplans/0 Synez_Public_Power.pow differ diff --git a/assets/Powerplans/AutoOS.pow b/assets/Powerplans/AutoOS.pow new file mode 100644 index 0000000..08e1882 Binary files /dev/null and b/assets/Powerplans/AutoOS.pow differ diff --git a/assets/Powerplans/BEYOND-PERFORMANCE-AMD+INTEL.pow b/assets/Powerplans/BEYOND-PERFORMANCE-AMD+INTEL.pow new file mode 100644 index 0000000..1a20bbd Binary files /dev/null and b/assets/Powerplans/BEYOND-PERFORMANCE-AMD+INTEL.pow differ diff --git a/assets/Powerplans/Bitsum Highest Performance.pow b/assets/Powerplans/Bitsum Highest Performance.pow new file mode 100644 index 0000000..93e1577 Binary files /dev/null and b/assets/Powerplans/Bitsum Highest Performance.pow differ diff --git a/assets/Powerplans/FPSHEAVEN2026.pow b/assets/Powerplans/FPSHEAVEN2026.pow new file mode 100644 index 0000000..87b2642 Binary files /dev/null and b/assets/Powerplans/FPSHEAVEN2026.pow differ diff --git a/assets/Powerplans/GALA's ultimate performance(AMD).pow b/assets/Powerplans/GALA's ultimate performance(AMD).pow new file mode 100644 index 0000000..80e4748 Binary files /dev/null and b/assets/Powerplans/GALA's ultimate performance(AMD).pow differ diff --git a/assets/Powerplans/GTweaks Power Plan V3.pow b/assets/Powerplans/GTweaks Power Plan V3.pow new file mode 100644 index 0000000..6865cc5 Binary files /dev/null and b/assets/Powerplans/GTweaks Power Plan V3.pow differ diff --git a/assets/Powerplans/Gavot Performance.pow b/assets/Powerplans/Gavot Performance.pow new file mode 100644 index 0000000..27412a3 Binary files /dev/null and b/assets/Powerplans/Gavot Performance.pow differ diff --git a/assets/Powerplans/IIIEXOIII_LOW_LATENCY.pow b/assets/Powerplans/IIIEXOIII_LOW_LATENCY.pow index 46a79c1..f79f6bb 100644 Binary files a/assets/Powerplans/IIIEXOIII_LOW_LATENCY.pow and b/assets/Powerplans/IIIEXOIII_LOW_LATENCY.pow differ diff --git a/assets/Powerplans/IrisFixed.pow b/assets/Powerplans/IrisFixed.pow new file mode 100644 index 0000000..94a195d Binary files /dev/null and b/assets/Powerplans/IrisFixed.pow differ diff --git a/assets/Powerplans/J o k r O S P o w e r P l a n.pow b/assets/Powerplans/J o k r O S P o w e r P l a n.pow new file mode 100644 index 0000000..7dad1a3 Binary files /dev/null and b/assets/Powerplans/J o k r O S P o w e r P l a n.pow differ diff --git a/assets/Powerplans/Jackpot2026.pow b/assets/Powerplans/Jackpot2026.pow new file mode 100644 index 0000000..3b62603 Binary files /dev/null and b/assets/Powerplans/Jackpot2026.pow differ diff --git a/assets/Powerplans/KSOS11.pow b/assets/Powerplans/KSOS11.pow new file mode 100644 index 0000000..5a81393 Binary files /dev/null and b/assets/Powerplans/KSOS11.pow differ diff --git a/assets/Powerplans/Kizzimo's Extreme Low Latency.pow b/assets/Powerplans/Kizzimo's Extreme Low Latency.pow new file mode 100644 index 0000000..a41dad9 Binary files /dev/null and b/assets/Powerplans/Kizzimo's Extreme Low Latency.pow differ diff --git "a/assets/Powerplans/LLG-C\316\236RT1F1\316\236D-FOR-PARKING+E-CORES-FIX.pow" "b/assets/Powerplans/LLG-C\316\236RT1F1\316\236D-FOR-PARKING+E-CORES-FIX.pow" index 2d229b8..577f301 100644 Binary files "a/assets/Powerplans/LLG-C\316\236RT1F1\316\236D-FOR-PARKING+E-CORES-FIX.pow" and "b/assets/Powerplans/LLG-C\316\236RT1F1\316\236D-FOR-PARKING+E-CORES-FIX.pow" differ diff --git a/assets/Powerplans/Microsoft High performance.pow b/assets/Powerplans/Microsoft High performance.pow new file mode 100644 index 0000000..6225a5c Binary files /dev/null and b/assets/Powerplans/Microsoft High performance.pow differ diff --git a/assets/Powerplans/Microsoft Ultimate Performance.pow b/assets/Powerplans/Microsoft Ultimate Performance.pow new file mode 100644 index 0000000..ed6ebc0 Binary files /dev/null and b/assets/Powerplans/Microsoft Ultimate Performance.pow differ diff --git a/assets/Powerplans/Mitstas IDLE ENABLED.pow b/assets/Powerplans/Mitstas IDLE ENABLED.pow new file mode 100644 index 0000000..3556f58 Binary files /dev/null and b/assets/Powerplans/Mitstas IDLE ENABLED.pow differ diff --git a/assets/Powerplans/Prodazin Power Plan.pow b/assets/Powerplans/Prodazin Power Plan.pow new file mode 100644 index 0000000..b92ec9e Binary files /dev/null and b/assets/Powerplans/Prodazin Power Plan.pow differ diff --git a/assets/Powerplans/RIP Tweaks Power Plan.pow b/assets/Powerplans/RIP Tweaks Power Plan.pow new file mode 100644 index 0000000..c7ea89d Binary files /dev/null and b/assets/Powerplans/RIP Tweaks Power Plan.pow differ diff --git a/assets/Powerplans/Reticle v2.pow b/assets/Powerplans/Reticle v2.pow new file mode 100644 index 0000000..21f71ed Binary files /dev/null and b/assets/Powerplans/Reticle v2.pow differ diff --git a/assets/Powerplans/RevisionPowerPlanV2.8.pow b/assets/Powerplans/RevisionPowerPlanV2.8.pow new file mode 100644 index 0000000..f0b6a90 Binary files /dev/null and b/assets/Powerplans/RevisionPowerPlanV2.8.pow differ diff --git a/assets/Powerplans/Rosca Tweaks v2.pow b/assets/Powerplans/Rosca Tweaks v2.pow new file mode 100644 index 0000000..61c1aa0 Binary files /dev/null and b/assets/Powerplans/Rosca Tweaks v2.pow differ diff --git a/assets/Powerplans/Sazinho-Idle-OFF (1).pow b/assets/Powerplans/Sazinho-Idle-OFF (1).pow deleted file mode 100644 index d430e1e..0000000 Binary files a/assets/Powerplans/Sazinho-Idle-OFF (1).pow and /dev/null differ diff --git a/assets/Powerplans/Slower.pow b/assets/Powerplans/Slower.pow index 7f398fe..132b910 100644 Binary files a/assets/Powerplans/Slower.pow and b/assets/Powerplans/Slower.pow differ diff --git a/assets/Powerplans/VTRL Optimized.pow b/assets/Powerplans/VTRL Optimized.pow new file mode 100644 index 0000000..c72f68b Binary files /dev/null and b/assets/Powerplans/VTRL Optimized.pow differ diff --git a/assets/Powerplans/Velo's Power Plan.pow b/assets/Powerplans/Velo's Power Plan.pow new file mode 100644 index 0000000..39dcba4 Binary files /dev/null and b/assets/Powerplans/Velo's Power Plan.pow differ diff --git a/assets/Powerplans/XNRL Pro Plan.pow b/assets/Powerplans/XNRL Pro Plan.pow new file mode 100644 index 0000000..685453f Binary files /dev/null and b/assets/Powerplans/XNRL Pro Plan.pow differ diff --git a/assets/Powerplans/arsenza low latency (INTEL FIX THREAD-DIRECTOR).pow b/assets/Powerplans/arsenza low latency (INTEL FIX THREAD-DIRECTOR).pow new file mode 100644 index 0000000..1f9b9b2 Binary files /dev/null and b/assets/Powerplans/arsenza low latency (INTEL FIX THREAD-DIRECTOR).pow differ diff --git a/assets/Powerplans/arsenza low latency.pow b/assets/Powerplans/arsenza low latency.pow new file mode 100644 index 0000000..c11d5b0 Binary files /dev/null and b/assets/Powerplans/arsenza low latency.pow differ diff --git a/assets/Powerplans/cactusOS.pow b/assets/Powerplans/cactusOS.pow new file mode 100644 index 0000000..956373b Binary files /dev/null and b/assets/Powerplans/cactusOS.pow differ diff --git a/assets/Powerplans/imribiy2026.pow b/assets/Powerplans/imribiy2026.pow new file mode 100644 index 0000000..c3ed95c Binary files /dev/null and b/assets/Powerplans/imribiy2026.pow differ diff --git a/assets/Powerplans/melody LowestLatency.pow b/assets/Powerplans/melody LowestLatency.pow new file mode 100644 index 0000000..1614e0a Binary files /dev/null and b/assets/Powerplans/melody LowestLatency.pow differ diff --git a/assets/Powerplans/n1kobg GPU_Booster_Power_Plan.pow b/assets/Powerplans/n1kobg GPU_Booster_Power_Plan.pow new file mode 100644 index 0000000..d3814ac Binary files /dev/null and b/assets/Powerplans/n1kobg GPU_Booster_Power_Plan.pow differ diff --git a/assets/Powerplans/xilly.pow b/assets/Powerplans/xilly.pow index c7a7650..1c04dc7 100644 Binary files a/assets/Powerplans/xilly.pow and b/assets/Powerplans/xilly.pow differ diff --git a/build/build-installer.ps1 b/build/build-installer.ps1 index 3ccddcb..cfd7cd4 100644 --- a/build/build-installer.ps1 +++ b/build/build-installer.ps1 @@ -1,5 +1,5 @@ param( - [string]$Version = "1.4.2", + [string]$Version = "1.4.3", [string]$Configuration = "Release", [switch]$SkipPublish ) diff --git a/build/build-release.ps1 b/build/build-release.ps1 index 5e3ecd9..237b4e3 100644 --- a/build/build-release.ps1 +++ b/build/build-release.ps1 @@ -1,5 +1,5 @@ param( - [string]$Version = "1.4.2", + [string]$Version = "1.4.3", [string]$Configuration = "Release", [string]$Runtime = "win-x64" ) diff --git a/build/package-release-zips.ps1 b/build/package-release-zips.ps1 index 722d81f..28a8463 100644 --- a/build/package-release-zips.ps1 +++ b/build/package-release-zips.ps1 @@ -1,5 +1,5 @@ param( - [string]$Version = "1.4.2" + [string]$Version = "1.4.3" ) $ErrorActionPreference = "Stop" diff --git a/chocolatey/threadpilot.nuspec b/chocolatey/threadpilot.nuspec index 1dd6aa0..bdb898b 100644 --- a/chocolatey/threadpilot.nuspec +++ b/chocolatey/threadpilot.nuspec @@ -2,7 +2,7 @@ threadpilot - 1.4.2 + 1.4.3 ThreadPilot Prime Build https://github.com/PrimeBuild-pc/ThreadPilot @@ -15,7 +15,7 @@ false Advanced Windows process and power plan manager with rules automation and performance controls. ThreadPilot process and power plan manager. - https://github.com/PrimeBuild-pc/ThreadPilot/releases/tag/v1.4.2 + https://github.com/PrimeBuild-pc/ThreadPilot/releases/tag/v1.4.3 threadpilot process powerplan performance windows diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1d80328..b5693a7 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,19 @@ All notable changes to this project are documented in this file. +## v1.4.3 - Expanded bundled power-plan catalog + +### Added + +- Added 30 new bundled Windows power plans. +- Added structural, discovery, duplicate, packaging, and invalid-file tests for bundled power plans. + +### Changed + +- Updated four existing bundled power plans and removed one redundant duplicate asset. +- Fixed parsing of power-plan display names containing parentheses. +- Confirmed automatic inclusion in build, publish, installer, and portable ZIP output. + ## v1.4.2 - Persistent CPU-priority rule verification and retry ### Fixed diff --git a/docs/release/RELEASE_NOTES.md b/docs/release/RELEASE_NOTES.md index 1c44518..7ea8209 100644 --- a/docs/release/RELEASE_NOTES.md +++ b/docs/release/RELEASE_NOTES.md @@ -1,19 +1,19 @@ -## ThreadPilot v1.4.2 +## ThreadPilot v1.4.3 -Patch release fixing persistent CPU-priority rules that are reverted shortly after process startup. Fixes #32. +Patch release expanding and validating ThreadPilot's bundled Windows power-plan catalog. -### Fixed +### Added -- Persistent CPU-priority rules now verify the applied priority. -- ThreadPilot detects when a process resets its CPU priority shortly after startup. -- A single bounded retry is performed when a verified priority is reverted. -- Retry state is cleared when the process exits. -- Improved activity logging distinguishes initial apply, reversion, retry, verification, and final failure. -- Added attribution for internal CPU-priority writes. -- Fixed misleading success reporting when the requested priority did not remain applied. +- Added 30 new bundled Windows power plans: 0 Synez Public Power, arsenha low latency, arsenha low latency (Intel Thread Director fix), AutoOS, BEYOND PERFORMANCE AMD+INTEL, Bitsum Highest Performance, cactusOS, FPSHEAVEN2026, GALA's ultimate performance (AMD), Gavot Performance, GTweaks Power Plan V3, imribiy2026, IrisFixed, JokrOS Power Plan, Jackpot2026, Kizzimo's Extreme Low Latency, KSOS11, melody LowestLatency, Microsoft High performance, Microsoft Ultimate Performance, Mitstas IDLE ENABLED, n1kobg GPU Booster Power Plan, Prodazin Power Plan, Reticle v2, RevisionPowerPlanV2.8, RIP Tweaks Power Plan, Rosca Tweaks v2, Velo's Power Plan, VTRL Optimized, and XNRL Pro Plan. +- Added structural, discovery, duplicate, packaging, and invalid-file tests for bundled power plans. + +### Changed + +- Updated four existing bundled plans: IIIEXOIII LOW LATENCY, LLG parking/E-core fix, Slower, and xilly. +- Removed a redundant duplicate Sazinho power-plan file. +- Power-plan display-name parsing now preserves names containing parentheses. ### Validation -- 555 automated tests passed with no failures. -- The general apply → verify → detect revert → one retry → final verify lifecycle was validated with a real process that resets its priority after startup. -- No executable-specific retry logic or continuous polling was added. +- Every changed `.pow` file was imported successfully with `powercfg` using a temporary GUID and then removed; the active Windows power plan remained unchanged. +- Bundled assets are discovered automatically and copied to build, publish, portable ZIP, and installer output through the existing project and release workflow. diff --git a/docs/releases/v1.4.3.md b/docs/releases/v1.4.3.md new file mode 100644 index 0000000..0c28b5c --- /dev/null +++ b/docs/releases/v1.4.3.md @@ -0,0 +1,20 @@ +# ThreadPilot v1.4.3 + +Patch release expanding and validating ThreadPilot's bundled Windows power-plan catalog. + +## Added + +- Added 30 new bundled Windows power plans. +- Added tests covering bundled asset structure, names, duplicates, discovery, build/publish configuration, and invalid files. + +## Changed + +- Updated IIIEXOIII LOW LATENCY, LLG parking/E-core fix, Slower, and xilly. +- Removed a redundant duplicate Sazinho power-plan file. +- Preserved parentheses in power-plan display names returned by `powercfg`. + +## Validation + +- Every changed `.pow` file was imported successfully with `powercfg` using a temporary GUID and removed immediately afterward. +- The active Windows power plan remained unchanged. +- Existing MSBuild, installer, portable ZIP, and GitHub Actions globs include the complete `Powerplans` directory without a separate manifest. diff --git a/sonar-project.properties b/sonar-project.properties index fcff330..e7335af 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,6 +1,6 @@ sonar.projectKey=threadpilot sonar.projectName=ThreadPilot -sonar.projectVersion=1.4.2 +sonar.projectVersion=1.4.3 sonar.sourceEncoding=UTF-8 sonar.sources=.