From 9432ade89a86190538284abd44d61e3e3715821e Mon Sep 17 00:00:00 2001 From: PrimeBuild-pc Date: Sun, 7 Jun 2026 12:19:44 +0200 Subject: [PATCH] Prepare v1.4.0 release --- Installer/Installer.iss | 2 +- Installer/ThreadPilot.wxs | 2 +- Installer/setup.iss | 2 +- .../PackagingMetadataTests.cs | 36 ++++++------ ThreadPilot.csproj | 8 +-- app.manifest | 2 +- build/build-installer.ps1 | 2 +- build/build-release.ps1 | 2 +- build/package-release-zips.ps1 | 2 +- chocolatey/threadpilot.nuspec | 4 +- docs/CHANGELOG.md | 38 ++++++++++++ docs/release/PACKAGING.md | 18 +++--- docs/release/RELEASE_NOTES.md | 58 +++++++++---------- docs/releases/v1.4.0.md | 37 ++++++++++++ sonar-project.properties | 2 +- 15 files changed, 143 insertions(+), 72 deletions(-) create mode 100644 docs/releases/v1.4.0.md diff --git a/Installer/Installer.iss b/Installer/Installer.iss index 9505e78..a17973c 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.3.1" +#define MyAppVersion "1.4.0" #ifndef MyWizardStyle #define MyWizardStyle "modern dynamic windows11" diff --git a/Installer/ThreadPilot.wxs b/Installer/ThreadPilot.wxs index 3306343..8bcf6f1 100644 --- a/Installer/ThreadPilot.wxs +++ b/Installer/ThreadPilot.wxs @@ -7,7 +7,7 @@ diff --git a/Installer/setup.iss b/Installer/setup.iss index 48135e4..7fbed61 100644 --- a/Installer/setup.iss +++ b/Installer/setup.iss @@ -11,7 +11,7 @@ #endif #ifndef MyAppVersion - #define MyAppVersion "1.3.1" + #define MyAppVersion "1.4.0" #endif #ifndef MyAppSourceDir diff --git a/Tests/ThreadPilot.Core.Tests/PackagingMetadataTests.cs b/Tests/ThreadPilot.Core.Tests/PackagingMetadataTests.cs index 5d72a1a..d28b98f 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 HotfixVersion = "1.3.1"; - private const string HotfixAssemblyVersion = "1.3.1.0"; + private const string ReleaseVersion = "1.4.0"; + private const string ReleaseAssemblyVersion = "1.4.0.0"; [Fact] public void InnoInstallers_UseStableDisplayNameAndSeparateVersionMetadata() @@ -57,24 +57,24 @@ public void PrimaryInstaller_CleansOnlyRecognizedLegacyBetaUninstallRegistryEntr } [Fact] - public void VersionMetadata_IsBumpedToHotfixVersion() + public void VersionMetadata_IsBumpedToReleaseVersion() { var root = FindRepositoryRoot(); - AssertFileContains(Path.Combine(root, "ThreadPilot.csproj"), $"{HotfixVersion}"); - AssertFileContains(Path.Combine(root, "ThreadPilot.csproj"), $"{HotfixAssemblyVersion}"); - AssertFileContains(Path.Combine(root, "ThreadPilot.csproj"), $"{HotfixAssemblyVersion}"); - AssertFileContains(Path.Combine(root, "ThreadPilot.csproj"), $"{HotfixVersion}"); - AssertFileContains(Path.Combine(root, "app.manifest"), $"version=\"{HotfixAssemblyVersion}\""); - AssertFileContains(Path.Combine(root, "Installer", "ThreadPilot.wxs"), $"Version=\"{HotfixAssemblyVersion}\""); - AssertFileContains(Path.Combine(root, "chocolatey", "threadpilot.nuspec"), $"{HotfixVersion}"); - AssertFileContains(Path.Combine(root, "chocolatey", "threadpilot.nuspec"), $"releases/tag/v{HotfixVersion}"); - AssertFileContains(Path.Combine(root, "sonar-project.properties"), $"sonar.projectVersion={HotfixVersion}"); - AssertFileContains(Path.Combine(root, "build", "build-release.ps1"), $"[string]$Version = \"{HotfixVersion}\""); - AssertFileContains(Path.Combine(root, "build", "build-installer.ps1"), $"[string]$Version = \"{HotfixVersion}\""); - AssertFileContains(Path.Combine(root, "build", "package-release-zips.ps1"), $"[string]$Version = \"{HotfixVersion}\""); - Assert.True(File.Exists(Path.Combine(root, "docs", "releases", $"v{HotfixVersion}.md"))); - AssertFileContains(Path.Combine(root, "docs", "release", "RELEASE_NOTES.md"), $"v{HotfixVersion}"); + AssertFileContains(Path.Combine(root, "ThreadPilot.csproj"), $"{ReleaseVersion}"); + AssertFileContains(Path.Combine(root, "ThreadPilot.csproj"), $"{ReleaseAssemblyVersion}"); + AssertFileContains(Path.Combine(root, "ThreadPilot.csproj"), $"{ReleaseAssemblyVersion}"); + AssertFileContains(Path.Combine(root, "ThreadPilot.csproj"), $"{ReleaseVersion}"); + AssertFileContains(Path.Combine(root, "app.manifest"), $"version=\"{ReleaseAssemblyVersion}\""); + AssertFileContains(Path.Combine(root, "Installer", "ThreadPilot.wxs"), $"Version=\"{ReleaseAssemblyVersion}\""); + AssertFileContains(Path.Combine(root, "chocolatey", "threadpilot.nuspec"), $"{ReleaseVersion}"); + AssertFileContains(Path.Combine(root, "chocolatey", "threadpilot.nuspec"), $"releases/tag/v{ReleaseVersion}"); + AssertFileContains(Path.Combine(root, "sonar-project.properties"), $"sonar.projectVersion={ReleaseVersion}"); + AssertFileContains(Path.Combine(root, "build", "build-release.ps1"), $"[string]$Version = \"{ReleaseVersion}\""); + AssertFileContains(Path.Combine(root, "build", "build-installer.ps1"), $"[string]$Version = \"{ReleaseVersion}\""); + AssertFileContains(Path.Combine(root, "build", "package-release-zips.ps1"), $"[string]$Version = \"{ReleaseVersion}\""); + Assert.True(File.Exists(Path.Combine(root, "docs", "releases", $"v{ReleaseVersion}.md"))); + AssertFileContains(Path.Combine(root, "docs", "release", "RELEASE_NOTES.md"), $"v{ReleaseVersion}"); } private static void AssertFileContains(string path, string expected) @@ -100,7 +100,7 @@ private static string FindRepositoryRoot() throw new InvalidOperationException("Repository root could not be located."); } - [GeneratedRegex("#define MyAppVersion \"1\\.3\\.1\"", RegexOptions.CultureInvariant)] + [GeneratedRegex("#define MyAppVersion \"1\\.4\\.0\"", RegexOptions.CultureInvariant)] private static partial Regex MyAppVersionRegex(); } } diff --git a/ThreadPilot.csproj b/ThreadPilot.csproj index 72fc3e8..b244865 100644 --- a/ThreadPilot.csproj +++ b/ThreadPilot.csproj @@ -16,10 +16,10 @@ link true CS1998;CS0067;CS0414;WFAC010;IL3000;MVVMTK0034 - 1.3.1 - 1.3.1.0 - 1.3.1.0 - 1.3.1 + 1.4.0 + 1.4.0.0 + 1.4.0.0 + 1.4.0 diff --git a/app.manifest b/app.manifest index 22b403e..59561ee 100644 --- a/app.manifest +++ b/app.manifest @@ -1,6 +1,6 @@ - + diff --git a/build/build-installer.ps1 b/build/build-installer.ps1 index c5ad8c8..68818be 100644 --- a/build/build-installer.ps1 +++ b/build/build-installer.ps1 @@ -1,5 +1,5 @@ param( - [string]$Version = "1.3.1", + [string]$Version = "1.4.0", [string]$Configuration = "Release", [switch]$SkipPublish ) diff --git a/build/build-release.ps1 b/build/build-release.ps1 index cd6db20..35430d8 100644 --- a/build/build-release.ps1 +++ b/build/build-release.ps1 @@ -1,5 +1,5 @@ param( - [string]$Version = "1.3.1", + [string]$Version = "1.4.0", [string]$Configuration = "Release", [string]$Runtime = "win-x64" ) diff --git a/build/package-release-zips.ps1 b/build/package-release-zips.ps1 index 85125a0..214aec3 100644 --- a/build/package-release-zips.ps1 +++ b/build/package-release-zips.ps1 @@ -1,5 +1,5 @@ param( - [string]$Version = "1.3.1" + [string]$Version = "1.4.0" ) $ErrorActionPreference = "Stop" diff --git a/chocolatey/threadpilot.nuspec b/chocolatey/threadpilot.nuspec index 7048d8d..8ca6856 100644 --- a/chocolatey/threadpilot.nuspec +++ b/chocolatey/threadpilot.nuspec @@ -2,7 +2,7 @@ threadpilot - 1.3.1 + 1.4.0 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.3.1 + https://github.com/PrimeBuild-pc/ThreadPilot/releases/tag/v1.4.0 threadpilot process powerplan performance windows diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index dd4979b..587ad60 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,44 @@ All notable changes to this project are documented in this file. +## v1.4.0 - Safe in-app updater + +### Added + +- Added safe in-app updater support. +- Added manual update checks from Settings. +- Added optional background update checks with a default 7-day interval. +- Added latest/current version display in Settings. +- Added update download and install flow with explicit user confirmation. +- Added updater documentation. + +### Security + +- Update metadata is fetched only from the official PrimeBuild-pc/ThreadPilot GitHub repository. +- Prereleases are excluded by default. +- Installer assets are selected from GitHub HTTPS release assets. +- SHA256 checksums are verified when SHA256SUMS.txt is available. +- Checksum mismatches are rejected. +- Authenticode signature verification is performed on a best-effort basis, rejecting explicitly invalid signatures. +- Installer launch uses ProcessStartInfo without shell command construction. +- Concurrent update attempts are prevented. + +### User data preservation + +- Updates preserve AppData, settings, profiles, CPU masks, rules, custom/imported power plans, and logs. +- Only updater temporary files are cleaned by the update flow. +- Full uninstall behavior remains separate. + +### Changed + +- Project version updated to 1.4.0. +- Installer, packaging, Chocolatey, and release metadata updated to v1.4.0. + +### Verification + +- Build passed. +- Automated tests passed. + ## v1.3.1 - Localization and installer metadata hotfix ### Fixed diff --git a/docs/release/PACKAGING.md b/docs/release/PACKAGING.md index 5df81e1..a61fe1e 100644 --- a/docs/release/PACKAGING.md +++ b/docs/release/PACKAGING.md @@ -178,9 +178,9 @@ Generate manifests locally with: ```powershell ./build/generate-winget-manifests.ps1 ` - -Version "1.3.0" ` - -Tag "v1.3.0" ` - -InstallerUrl "https://github.com/PrimeBuild-pc/ThreadPilot/releases/download/v1.3.0/ThreadPilot_v1.3.0_Setup.exe" ` + -Version "1.4.0" ` + -Tag "v1.4.0" ` + -InstallerUrl "https://github.com/PrimeBuild-pc/ThreadPilot/releases/download/v1.4.0/ThreadPilot_v1.4.0_Setup.exe" ` -InstallerSha256 "" ` -OutputRoot "winget-manifests" ``` @@ -224,9 +224,9 @@ Local packaging-only validation: ```powershell ./build/publish-chocolatey.ps1 ` - -Version "1.3.0" ` - -Tag "v1.3.0" ` - -InstallerPath ".\artifacts\release\installer\ThreadPilot_v1.3.0_Setup.exe" ` + -Version "1.4.0" ` + -Tag "v1.4.0" ` + -InstallerPath ".\artifacts\release\installer\ThreadPilot_v1.4.0_Setup.exe" ` -DryRun ` -PackageOutputDirectory ".\artifacts\choco-dryrun" ` -MetadataOutputPath ".\artifacts\choco-dryrun\chocolatey-package-metadata.json" @@ -250,9 +250,9 @@ Public publish path: ```powershell ./build/publish-chocolatey.ps1 ` - -Version "1.3.0" ` - -Tag "v1.3.0" ` - -InstallerPath ".\artifacts\release\installer\ThreadPilot_v1.3.0_Setup.exe" ` + -Version "1.4.0" ` + -Tag "v1.4.0" ` + -InstallerPath ".\artifacts\release\installer\ThreadPilot_v1.4.0_Setup.exe" ` -ApiKey "" ``` diff --git a/docs/release/RELEASE_NOTES.md b/docs/release/RELEASE_NOTES.md index c186a41..358b482 100644 --- a/docs/release/RELEASE_NOTES.md +++ b/docs/release/RELEASE_NOTES.md @@ -1,41 +1,37 @@ -# ThreadPilot v1.3.1 Release Notes Draft +## ThreadPilot v1.4.0 -## Highlights +### Added -- Completed the Simplified Chinese localization pass for the main WPF views, dialogs, context menus, tray menu, tooltips, accessibility text, status text, and user-facing service notifications. -- Kept English as the default startup language and Simplified Chinese as an optional Settings choice. -- Changed installer display metadata so installed apps list ThreadPilot as `ThreadPilot` while preserving version metadata separately as `1.3.1`. -- Improved uninstall cleanup for ThreadPilot-owned application files, shortcuts, startup entries, and per-user AppData/settings when the uninstaller runs. +- Added safe in-app updater support. +- Added manual update checks from Settings. +- Added optional background update checks with a default 7-day interval. +- Added latest/current version display in Settings. +- Added update download and install flow with explicit user confirmation. +- Added updater documentation. -## Fixed +### Security -- Fixed incomplete zh-CN coverage that left many v1.3.0 UI surfaces in English. -- Fixed Inno Setup `AppVerName` so uninstall tools do not show versioned names such as `ThreadPilot 1.3.1`. -- Added guarded cleanup for the obsolete `ThreadPilot 0.1.0-beta` uninstall registry entry only when it exactly matches the legacy ThreadPilot display name and Program Files install location. +- Update metadata is fetched only from the official PrimeBuild-pc/ThreadPilot GitHub repository. +- Prereleases are excluded by default. +- Installer assets are selected from GitHub HTTPS release assets. +- SHA256 checksums are verified when SHA256SUMS.txt is available. +- Checksum mismatches are rejected. +- Authenticode signature verification is performed on a best-effort basis, rejecting explicitly invalid signatures. +- Installer launch uses ProcessStartInfo without shell command construction. +- Concurrent update attempts are prevented. -## Safety +### User data preservation -- No automatic in-app updater was added. -- No elevation, affinity, process control, power plan, or system tweak behavior was changed. -- Normal install/update preserves existing user settings and data. -- Full uninstall removes only ThreadPilot-owned AppData for the uninstalling user account; elevated uninstall contexts may not be able to clean another Windows user's per-user AppData. +- Updates preserve AppData, settings, profiles, CPU masks, rules, custom/imported power plans, and logs. +- Only updater temporary files are cleaned by the update flow. +- Full uninstall behavior remains separate. -## Testing +### Changed -- Added resource key parity coverage for `Locales/en-US.xaml` and `Locales/zh-CN.xaml`. -- Added hardcoded-English checks for important WPF views with brand and technical terms whitelisted. -- Added release metadata tests for installer display name, uninstall cleanup scope, legacy beta uninstall-entry cleanup, and v1.3.1 version surfaces. +- Project version updated to 1.4.0. +- Installer, packaging, Chocolatey, and release metadata updated to v1.4.0. -## Compatibility and Upgrade Notes +### Verification -- Requires Windows 11 build 22000 or newer. -- Existing settings, profiles, masks, persistent rules, imported power plans, and logs continue to load after update. -- Existing process, affinity, power plan, automation, and system tweak behavior is unchanged. - -## Known Non-Goals - -- No GitHub release or tag is created by this hotfix branch. -- No automatic in-app updating. -- No anti-cheat bypass. -- No Windows Service. -- No registry or IFEO persistence. +- Build passed. +- Automated tests passed. diff --git a/docs/releases/v1.4.0.md b/docs/releases/v1.4.0.md new file mode 100644 index 0000000..358b482 --- /dev/null +++ b/docs/releases/v1.4.0.md @@ -0,0 +1,37 @@ +## ThreadPilot v1.4.0 + +### Added + +- Added safe in-app updater support. +- Added manual update checks from Settings. +- Added optional background update checks with a default 7-day interval. +- Added latest/current version display in Settings. +- Added update download and install flow with explicit user confirmation. +- Added updater documentation. + +### Security + +- Update metadata is fetched only from the official PrimeBuild-pc/ThreadPilot GitHub repository. +- Prereleases are excluded by default. +- Installer assets are selected from GitHub HTTPS release assets. +- SHA256 checksums are verified when SHA256SUMS.txt is available. +- Checksum mismatches are rejected. +- Authenticode signature verification is performed on a best-effort basis, rejecting explicitly invalid signatures. +- Installer launch uses ProcessStartInfo without shell command construction. +- Concurrent update attempts are prevented. + +### User data preservation + +- Updates preserve AppData, settings, profiles, CPU masks, rules, custom/imported power plans, and logs. +- Only updater temporary files are cleaned by the update flow. +- Full uninstall behavior remains separate. + +### Changed + +- Project version updated to 1.4.0. +- Installer, packaging, Chocolatey, and release metadata updated to v1.4.0. + +### Verification + +- Build passed. +- Automated tests passed. diff --git a/sonar-project.properties b/sonar-project.properties index fb3dab0..3294c87 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,6 +1,6 @@ sonar.projectKey=threadpilot sonar.projectName=ThreadPilot -sonar.projectVersion=1.3.1 +sonar.projectVersion=1.4.0 sonar.sourceEncoding=UTF-8 sonar.sources=.