From 14836a12671a1f19eedb5e87bd60a1a191323ff9 Mon Sep 17 00:00:00 2001 From: naipi11 <101078423+naipi11@users.noreply.github.com> Date: Tue, 25 Aug 2026 18:02:33 +0800 Subject: [PATCH 1/2] release: v2.5.9 fix setup executable upload --- .github/workflows/release.yml | 4 ++-- CHANGELOG.md | 10 ++++++++ README.md | 12 +++++----- README.zh-CN.md | 12 +++++----- package.json | 2 +- src/portable/CodexRemote.Portable.manifest | 2 +- src/trayhost/AssemblyInfo.cs | 4 ++-- src/trayhost/CodexRemote.TrayHost.manifest | 2 +- .../persistence/InstallLifecycle.SelfTest.ps1 | 4 ++-- .../persistence/ReleaseWorkflow.SelfTest.ps1 | 18 +++++++------- tests/persistence/TrayHostBuild.SelfTest.ps1 | 24 +++++++++---------- tests/trayhost/TrayHostNativeSelfTest.cs | 8 +++---- 12 files changed, 56 insertions(+), 46 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 613b0df..de23853 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -150,7 +150,7 @@ jobs: throw "Could not inspect existing release assets for $tag." } } - $assets = @(Get-ChildItem -LiteralPath (Join-Path $PWD 'build\dist') -File | Where-Object { $_.Extension -in @('.zip', '.txt', '.json') }) + $assets = @(Get-ChildItem -LiteralPath (Join-Path $PWD 'build\dist') -File | Where-Object { $_.Extension -in @('.exe', '.zip', '.txt', '.json') }) $assetNames = @($assets | ForEach-Object { $_.Name }) $unexpected = @($existingAssets | Where-Object { $assetNames -cnotcontains $_ }) if ($unexpected.Count -ne 0) { @@ -199,7 +199,7 @@ jobs: if ($tag -cnotmatch '^v\d+\.\d+\.\d+$') { throw "Release tag output is invalid: '$tag'." } - $assets = @(Get-ChildItem -LiteralPath (Join-Path $PWD 'build\dist') -File | Where-Object { $_.Extension -in @('.zip', '.txt', '.json') }) + $assets = @(Get-ChildItem -LiteralPath (Join-Path $PWD 'build\dist') -File | Where-Object { $_.Extension -in @('.exe', '.zip', '.txt', '.json') }) $assetNames = @($assets | ForEach-Object { $_.Name }) $publishedNames = @(& gh release view $tag --repo $env:GITHUB_REPOSITORY --json assets --jq '.assets[].name') if ($LASTEXITCODE -ne 0 -or ((@($publishedNames | Sort-Object) -join '|') -cne (@($assetNames | Sort-Object) -join '|'))) { diff --git a/CHANGELOG.md b/CHANGELOG.md index a64ef39..60bd566 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,16 @@ This file keeps the release record. GitHub Release bodies are generated from the No unreleased changes. +## v2.5.9 + +### English + +- Fixed release publication so the Inno Setup installer executable is uploaded alongside the portable ZIP and manifests. + +### 简体中文 + +- 修复发布上传:现在 Inno Setup 安装包可执行文件会与便携 ZIP 和清单一起上传。 + ## v2.5.8 ### English diff --git a/README.md b/README.md index ce22bd3..2f06387 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ that existing page and leaves the Codex UI, account authorization, and enrollmen ## Quick start -1. Download either `CodexRemote-fix-2.5.8-setup.exe` (recommended installer) or `CodexRemote-fix-2.5.8-windows-x64.zip` from [Releases](https://github.com/naipi11/CodexRemote-fix/releases). Download and verify the matching `.sha256.txt` before continuing. +1. Download either `CodexRemote-fix-2.5.9-setup.exe` (recommended installer) or `CodexRemote-fix-2.5.9-windows-x64.zip` from [Releases](https://github.com/naipi11/CodexRemote-fix/releases). Download and verify the matching `.sha256.txt` before continuing. 2. If you chose the setup installer, run it and follow the wizard. If you chose the portable ZIP, extract it into a new empty folder and double-click `CodexRemote-fix.exe`. Both paths validate the payload, run a Microsoft Defender custom scan, and preserve the DPAPI device-key store. @@ -83,12 +83,12 @@ The tray reports two independent, truthful status lines instead of inferring rea ## Releases -Every tagged release ships a Windows setup installer and a portable ZIP, each with its SHA-256 checksum, release manifest, and the shared payload manifest. The `.github/workflows/release.yml` workflow builds both from the tag automatically, so v2.5.8 includes: +Every tagged release ships a Windows setup installer and a portable ZIP, each with its SHA-256 checksum, release manifest, and the shared payload manifest. The `.github/workflows/release.yml` workflow builds both from the tag automatically, so v2.5.9 includes: -- `CodexRemote-fix-2.5.8-setup.exe` and its checksum -- `CodexRemote-fix-2.5.8-windows-x64.zip` and its checksum -- `CodexRemote-fix-2.5.8-payload-manifest.json` -- `CodexRemote-fix-2.5.8-release-manifest.json` and `CodexRemote-fix-2.5.8-setup-release-manifest.json` +- `CodexRemote-fix-2.5.9-setup.exe` and its checksum +- `CodexRemote-fix-2.5.9-windows-x64.zip` and its checksum +- `CodexRemote-fix-2.5.9-payload-manifest.json` +- `CodexRemote-fix-2.5.9-release-manifest.json` and `CodexRemote-fix-2.5.9-setup-release-manifest.json` Each release appends a short English change summary to the GitHub release body. The bilingual release history is kept in [CHANGELOG.md](CHANGELOG.md). diff --git a/README.zh-CN.md b/README.zh-CN.md index 4eaa4fe..9178558 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -43,7 +43,7 @@ CodexRemote-fix 在 Windows 版 Codex Desktop 中启用随应用一起打包、 ## 快速开始 -1. 从 [Releases](https://github.com/naipi11/CodexRemote-fix/releases) 下载 `CodexRemote-fix-2.5.8-setup.exe`(推荐安装包)或便携 ZIP `CodexRemote-fix-2.5.8-windows-x64.zip`;下载并核对对应的 `.sha256.txt`。 +1. 从 [Releases](https://github.com/naipi11/CodexRemote-fix/releases) 下载 `CodexRemote-fix-2.5.9-setup.exe`(推荐安装包)或便携 ZIP `CodexRemote-fix-2.5.9-windows-x64.zip`;下载并核对对应的 `.sha256.txt`。 2. 选择安装包时直接运行并跟随向导;选择便携 ZIP 时解压到新空目录,然后双击 `CodexRemote-fix.exe`。 两条路径都会校验载荷、执行 Microsoft Defender 自定义扫描,并保留 DPAPI 设备密钥。 @@ -78,12 +78,12 @@ CodexRemote-fix 在 Windows 版 Codex Desktop 中启用随应用一起打包、 ## 发布(Releases) -每个带 tag 的发布都会附带 Windows 安装包和便携 ZIP,各自带 SHA-256 校验文件、release manifest,并共享 payload manifest。`.github/workflows/release.yml` 会在 tag 上自动构建两者,因此 v2.5.8 提供: +每个带 tag 的发布都会附带 Windows 安装包和便携 ZIP,各自带 SHA-256 校验文件、release manifest,并共享 payload manifest。`.github/workflows/release.yml` 会在 tag 上自动构建两者,因此 v2.5.9 提供: -- `CodexRemote-fix-2.5.8-setup.exe` 及其校验文件 -- `CodexRemote-fix-2.5.8-windows-x64.zip` 及其校验文件 -- `CodexRemote-fix-2.5.8-payload-manifest.json` -- `CodexRemote-fix-2.5.8-release-manifest.json` 和 `CodexRemote-fix-2.5.8-setup-release-manifest.json` +- `CodexRemote-fix-2.5.9-setup.exe` 及其校验文件 +- `CodexRemote-fix-2.5.9-windows-x64.zip` 及其校验文件 +- `CodexRemote-fix-2.5.9-payload-manifest.json` +- `CodexRemote-fix-2.5.9-release-manifest.json` 和 `CodexRemote-fix-2.5.9-setup-release-manifest.json` GitHub Release 正文只发布英文更新说明;本 README 继续保留中英文使用说明。 完整历史见 [CHANGELOG.md](CHANGELOG.md)。 diff --git a/package.json b/package.json index 57d11c5..c4d45b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codexremote-fix", - "version": "2.5.8", + "version": "2.5.9", "private": true, "description": "CodexRemote-fix persistent current-user tray supervisor for Windows", "license": "MIT", diff --git a/src/portable/CodexRemote.Portable.manifest b/src/portable/CodexRemote.Portable.manifest index 3201b85..441ffce 100644 --- a/src/portable/CodexRemote.Portable.manifest +++ b/src/portable/CodexRemote.Portable.manifest @@ -1,6 +1,6 @@ - + diff --git a/src/trayhost/AssemblyInfo.cs b/src/trayhost/AssemblyInfo.cs index e338427..f4b8320 100644 --- a/src/trayhost/AssemblyInfo.cs +++ b/src/trayhost/AssemblyInfo.cs @@ -5,6 +5,6 @@ [assembly: AssemblyDescription("Persistent native tray host for CodexRemote-fix")] [assembly: AssemblyCompany("CodexRemote-fix contributors")] [assembly: AssemblyProduct("CodexRemote-fix")] -[assembly: AssemblyVersion("2.5.8.0")] -[assembly: AssemblyFileVersion("2.5.8.0")] +[assembly: AssemblyVersion("2.5.9.0")] +[assembly: AssemblyFileVersion("2.5.9.0")] [assembly: ComVisible(false)] diff --git a/src/trayhost/CodexRemote.TrayHost.manifest b/src/trayhost/CodexRemote.TrayHost.manifest index b43bf68..1b5e22d 100644 --- a/src/trayhost/CodexRemote.TrayHost.manifest +++ b/src/trayhost/CodexRemote.TrayHost.manifest @@ -1,6 +1,6 @@ - + diff --git a/tests/persistence/InstallLifecycle.SelfTest.ps1 b/tests/persistence/InstallLifecycle.SelfTest.ps1 index aeecde4..2475c8f 100644 --- a/tests/persistence/InstallLifecycle.SelfTest.ps1 +++ b/tests/persistence/InstallLifecycle.SelfTest.ps1 @@ -1979,9 +1979,9 @@ $results += Invoke-CcodTest 'installer exposes CodexRemote-fix as the searchable Assert-CcodTrue ($buildScript -cmatch '\$bundle\.sha256\.txt') 'build script writes a hash beside the public portable ZIP filename' } -$results += Invoke-CcodTest 'portable builder publishes the exact CodexRemote-fix 2.5.8 release artifact contract' { +$results += Invoke-CcodTest 'portable builder publishes the exact CodexRemote-fix 2.5.9 release artifact contract' { $package = Get-Content -LiteralPath (Join-Path $repositoryRoot 'package.json') -Raw | ConvertFrom-Json - Assert-CcodEqual '2.5.8' ([string]$package.version) 'package version is exactly 2.5.8' + Assert-CcodEqual '2.5.9' ([string]$package.version) 'package version is exactly 2.5.9' $buildScript = Get-Content -LiteralPath (Join-Path $repositoryRoot 'build\build.ps1') -Raw Assert-CcodTrue ($buildScript -cmatch 'CodexRemote-fix-\$Version-windows-x64\.zip') 'portable build resolves the exact public ZIP filename' diff --git a/tests/persistence/ReleaseWorkflow.SelfTest.ps1 b/tests/persistence/ReleaseWorkflow.SelfTest.ps1 index be4ad6a..3d4ec8f 100644 --- a/tests/persistence/ReleaseWorkflow.SelfTest.ps1 +++ b/tests/persistence/ReleaseWorkflow.SelfTest.ps1 @@ -229,22 +229,22 @@ Invoke-CcodTest 'package scripts build provenance and workflows retain the relea Assert-CcodTrue ($release -cmatch '(?ms)^ publish:\r?\n needs: build\r?\n runs-on: windows-latest\r?\n permissions:\r?\n contents: write\s*$') 'only the publish job receives release-write permission' } -Invoke-CcodTest '2.5.8 documentation matches the portable release, Defender gate, and protected uninstall contract' { +Invoke-CcodTest '2.5.9 documentation matches the portable release, Defender gate, and protected uninstall contract' { $package = Get-Content -LiteralPath (Join-Path $repositoryRoot 'package.json') -Raw | ConvertFrom-Json - Assert-CcodEqual '2.5.8' ([string]$package.version) 'package metadata is the 2.5.8 release' + Assert-CcodEqual '2.5.9' ([string]$package.version) 'package metadata is the 2.5.9 release' $changelog = Get-Content -LiteralPath (Join-Path $repositoryRoot 'CHANGELOG.md') -Raw - $releaseSection = [regex]::Match($changelog, '(?ms)^## v2\.5\.8\s*\r?\n(?.*?)(?=^## |\z)') - Assert-CcodTrue $releaseSection.Success 'v2.5.8 release section exists' - Assert-CcodTrue ($releaseSection.Groups['body'].Value.Contains('trusted logon identity adapter')) 'v2.5.8 changelog records the live supervisor startup fix' + $releaseSection = [regex]::Match($changelog, '(?ms)^## v2\.5\.9\s*\r?\n(?.*?)(?=^## |\z)') + Assert-CcodTrue $releaseSection.Success 'v2.5.9 release section exists' + Assert-CcodTrue ($releaseSection.Groups['body'].Value.Contains('Inno Setup installer executable')) 'v2.5.9 changelog records the upload release fix' $readme = Get-Content -LiteralPath (Join-Path $repositoryRoot 'README.md') -Raw $quickStart = [regex]::Match($readme, '(?ms)^## Quick start\s*\r?\n(?.*?)(?=^## |\z)').Groups['body'].Value - Assert-CcodTrue ($quickStart.Contains('CodexRemote-fix-2.5.8-setup.exe')) 'English Quick Start names the setup installer' - Assert-CcodTrue ($quickStart.Contains('CodexRemote-fix-2.5.8-windows-x64.zip')) 'English Quick Start names the portable ZIP' + Assert-CcodTrue ($quickStart.Contains('CodexRemote-fix-2.5.9-setup.exe')) 'English Quick Start names the setup installer' + Assert-CcodTrue ($quickStart.Contains('CodexRemote-fix-2.5.9-windows-x64.zip')) 'English Quick Start names the portable ZIP' Assert-CcodTrue ($quickStart.Contains('CodexRemote-fix.exe')) 'English Quick Start names the portable double-click entrypoint' Assert-CcodTrue ($quickStart.Contains('Microsoft Defender')) 'English Quick Start documents the local Defender gate' $readmeZh = Get-Content -LiteralPath (Join-Path $repositoryRoot 'README.zh-CN.md') -Raw -Encoding UTF8 - Assert-CcodTrue ($readmeZh.Contains('CodexRemote-fix-2.5.8-setup.exe')) 'Chinese Quick Start names the setup installer' - Assert-CcodTrue ($readmeZh.Contains('CodexRemote-fix-2.5.8-windows-x64.zip')) 'Chinese Quick Start names the portable ZIP' + Assert-CcodTrue ($readmeZh.Contains('CodexRemote-fix-2.5.9-setup.exe')) 'Chinese Quick Start names the setup installer' + Assert-CcodTrue ($readmeZh.Contains('CodexRemote-fix-2.5.9-windows-x64.zip')) 'Chinese Quick Start names the portable ZIP' Assert-CcodTrue ($readmeZh.Contains('CodexRemote-fix.exe')) 'Chinese Quick Start names the portable double-click entrypoint' Assert-CcodTrue ($readmeZh.Contains('Microsoft Defender')) 'Chinese Quick Start documents the local Defender gate' $technical = Get-Content -LiteralPath (Join-Path $repositoryRoot 'docs\TECHNICAL.md') -Raw diff --git a/tests/persistence/TrayHostBuild.SelfTest.ps1 b/tests/persistence/TrayHostBuild.SelfTest.ps1 index ae148e6..fe95a6f 100644 --- a/tests/persistence/TrayHostBuild.SelfTest.ps1 +++ b/tests/persistence/TrayHostBuild.SelfTest.ps1 @@ -4,14 +4,14 @@ $ErrorActionPreference='Stop' $repositoryRoot=Split-Path (Split-Path $PSScriptRoot -Parent) -Parent $lockPath=Join-Path $repositoryRoot 'build\trayhost-packages.lock.json' -Invoke-CcodTest '2.5.8 source metadata binds the package and TrayHost assembly identities' { +Invoke-CcodTest '2.5.9 source metadata binds the package and TrayHost assembly identities' { $package=Get-Content -LiteralPath (Join-Path $repositoryRoot 'package.json') -Raw|ConvertFrom-Json - Assert-CcodEqual '2.5.8' ([string]$package.version) 'package version is the 2.5.8 release version' + Assert-CcodEqual '2.5.9' ([string]$package.version) 'package version is the 2.5.9 release version' $assemblyInfo=Get-Content -LiteralPath (Join-Path $repositoryRoot 'src\trayhost\AssemblyInfo.cs') -Raw - Assert-CcodTrue ($assemblyInfo -match 'AssemblyVersion\("2\.5\.8\.0"\)') 'TrayHost assembly version is 2.5.8.0' - Assert-CcodTrue ($assemblyInfo -match 'AssemblyFileVersion\("2\.5\.8\.0"\)') 'TrayHost file version is 2.5.8.0' + Assert-CcodTrue ($assemblyInfo -match 'AssemblyVersion\("2\.5\.9\.0"\)') 'TrayHost assembly version is 2.5.9.0' + Assert-CcodTrue ($assemblyInfo -match 'AssemblyFileVersion\("2\.5\.9\.0"\)') 'TrayHost file version is 2.5.9.0' $manifest=Get-Content -LiteralPath (Join-Path $repositoryRoot 'src\trayhost\CodexRemote.TrayHost.manifest') -Raw - Assert-CcodTrue ($manifest -match ' Date: Tue, 25 Aug 2026 18:09:23 +0800 Subject: [PATCH 2/2] test: update v2.5.9 release naming regex --- tests/persistence/InstallLifecycle.SelfTest.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/persistence/InstallLifecycle.SelfTest.ps1 b/tests/persistence/InstallLifecycle.SelfTest.ps1 index 2475c8f..d818e71 100644 --- a/tests/persistence/InstallLifecycle.SelfTest.ps1 +++ b/tests/persistence/InstallLifecycle.SelfTest.ps1 @@ -2345,16 +2345,16 @@ $results += Invoke-CcodTest 'README and release workflow publish current portabl Assert-CcodTrue ($readmeChinese -cmatch '\A(?s:
.*?

CodexRemote-fix

)') 'Chinese README uses the centered public product heading' $quickStart = [regex]::Match($readme, '(?ms)^## Quick start[^\r\n]*\r?\n(.*?)(?=^## )').Groups[1].Value - Assert-CcodTrue ($quickStart -cmatch 'CodexRemote-fix-2\.5\.8-setup\.exe') 'English Quick Start names the setup installer' - Assert-CcodTrue ($quickStart -cmatch 'CodexRemote-fix-2\.5\.8-windows-x64\.zip') 'English Quick Start names the exact portable artifact' + Assert-CcodTrue ($quickStart -cmatch 'CodexRemote-fix-2\.5\.9-setup\.exe') 'English Quick Start names the setup installer' + Assert-CcodTrue ($quickStart -cmatch 'CodexRemote-fix-2\.5\.9-windows-x64\.zip') 'English Quick Start names the exact portable artifact' Assert-CcodTrue ($quickStart -cmatch 'CodexRemote-fix\.exe') 'English Quick Start names the portable double-click entrypoint' Assert-CcodTrue ($quickStart -cmatch '\.sha256\.txt') 'English Quick Start names the checksum artifact' $quickStartChineseMatch = [regex]::Match($readmeChinese, '(?ms)^## [^\r\n]+\r?\n(?:\r?\n)?(?=1\.[^\r\n]*\[Releases\])(.*?)(?=^## |\z)') Assert-CcodTrue $quickStartChineseMatch.Success 'Chinese README exposes a Quick Start section' $quickStartChinese = $quickStartChineseMatch.Groups[1].Value - Assert-CcodTrue ($quickStartChinese -cmatch 'CodexRemote-fix-2\.5\.8-setup\.exe') 'Chinese Quick Start names the setup installer' - Assert-CcodTrue ($quickStartChinese -cmatch 'CodexRemote-fix-2\.5\.8-windows-x64\.zip') 'Chinese Quick Start names the exact portable artifact' + Assert-CcodTrue ($quickStartChinese -cmatch 'CodexRemote-fix-2\.5\.9-setup\.exe') 'Chinese Quick Start names the setup installer' + Assert-CcodTrue ($quickStartChinese -cmatch 'CodexRemote-fix-2\.5\.9-windows-x64\.zip') 'Chinese Quick Start names the exact portable artifact' Assert-CcodTrue ($quickStartChinese -cmatch 'CodexRemote-fix\.exe') 'Chinese Quick Start names the portable double-click entrypoint' Assert-CcodTrue ($quickStartChinese -cmatch '\.sha256\.txt') 'Chinese Quick Start names the checksum artifact'