From c0320810af65ce06b9bd96d84d740766103d7a03 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:41:01 +0000 Subject: [PATCH 01/10] Initial plan From 6e7a9b752d90b940695b4f6bcad8808eb52001a0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:43:00 +0000 Subject: [PATCH 02/10] Add automatic release CI workflow with patch version bumping Co-authored-by: supervoidcoder <88671013+supervoidcoder@users.noreply.github.com> --- .github/workflows/release.yml | 137 ++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..15a337a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,137 @@ +name: Release Build + +on: + push: + branches: + - main + +permissions: + contents: write + +jobs: + build-and-release: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch all history for proper versioning + + - name: Setup MSVC + uses: ilammy/msvc-dev-cmd@v1 + + - name: Get latest release tag + id: get_latest_tag + shell: pwsh + run: | + # Get the latest tag that matches semantic versioning pattern + $tags = git tag -l "v*.*.*" | Sort-Object -Descending + if ($tags) { + $latestTag = $tags[0] + Write-Output "Latest tag: $latestTag" + Write-Output "latest_tag=$latestTag" >> $env:GITHUB_OUTPUT + } else { + Write-Output "No existing tags found, starting from v0.0.0" + Write-Output "latest_tag=v0.0.0" >> $env:GITHUB_OUTPUT + } + + - name: Determine next version + id: next_version + shell: pwsh + run: | + $latestTag = "${{ steps.get_latest_tag.outputs.latest_tag }}" + + # Parse version (remove 'v' prefix) + if ($latestTag -match 'v?(\d+)\.(\d+)\.(\d+)') { + $major = [int]$Matches[1] + $minor = [int]$Matches[2] + $patch = [int]$Matches[3] + + # Increment patch version + $patch = $patch + 1 + + $newVersion = "v$major.$minor.$patch" + Write-Output "Next version: $newVersion" + Write-Output "version=$newVersion" >> $env:GITHUB_OUTPUT + Write-Output "version_number=$major.$minor.$patch" >> $env:GITHUB_OUTPUT + } else { + Write-Output "Could not parse version, defaulting to v0.0.1" + Write-Output "version=v0.0.1" >> $env:GITHUB_OUTPUT + Write-Output "version_number=0.0.1" >> $env:GITHUB_OUTPUT + } + + - name: Parse commit message for release notes + id: parse_commit + shell: pwsh + run: | + $commitMsg = git log -1 --pretty=%B + $commitSubject = git log -1 --pretty=%s + $commitBody = git log -1 --pretty=%b + + # Create release notes + $releaseNotes = "## Changes`n`n" + + # Parse commit type (fix, feat, docs, etc.) + if ($commitSubject -match '^(fix|feat|docs|style|refactor|test|chore|perf|ci|build|revert)(\(.+\))?:\s*(.+)$') { + $type = $Matches[1] + $description = $Matches[3] + + $typeLabel = switch ($type) { + 'fix' { '🐛 Fix' } + 'feat' { '✨ Feature' } + 'docs' { '📚 Documentation' } + 'style' { '💄 Style' } + 'refactor' { '♻️ Refactor' } + 'test' { '✅ Test' } + 'chore' { '🔧 Chore' } + 'perf' { '⚡ Performance' } + 'ci' { '👷 CI' } + 'build' { '📦 Build' } + 'revert' { '⏪ Revert' } + default { '📝 Update' } + } + + $releaseNotes += "**$typeLabel**: $description`n" + } else { + # If not following conventional commits, just use the subject + $releaseNotes += "$commitSubject`n" + } + + # Add commit body if present + if ($commitBody.Trim() -ne "") { + $releaseNotes += "`n$commitBody`n" + } + + # Add commit SHA + $commitSha = git rev-parse --short HEAD + $releaseNotes += "`n---`n*Commit: $commitSha*" + + # Save to output (escape for GitHub Actions) + $releaseNotes = $releaseNotes -replace '"', '\"' + $releaseNotes = $releaseNotes -replace "`n", "\n" + Write-Output "notes=$releaseNotes" >> $env:GITHUB_OUTPUT + + - name: Compile with MSVC + run: | + cl /O2 /Ot /GL /std:c++20 /EHsc main.cpp /DUNICODE /D_UNICODE /Fe:win-witr.exe + + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ steps.next_version.outputs.version }} + release_name: Release ${{ steps.next_version.outputs.version }} + body: ${{ steps.parse_commit.outputs.notes }} + draft: false + prerelease: false + + - name: Upload Release Asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./win-witr.exe + asset_name: win-witr.exe + asset_content_type: application/x-msdownload From 94e6c2acdb055ed3a208012f7332060f743d2cbf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:44:10 +0000 Subject: [PATCH 03/10] Update release workflow to use modern GitHub release action Co-authored-by: supervoidcoder <88671013+supervoidcoder@users.noreply.github.com> --- .github/workflows/release.yml | 42 +++++++++++++---------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 15a337a..0881f8c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch all history for proper versioning - + - name: Setup MSVC uses: ilammy/msvc-dev-cmd@v1 @@ -39,16 +39,16 @@ jobs: shell: pwsh run: | $latestTag = "${{ steps.get_latest_tag.outputs.latest_tag }}" - + # Parse version (remove 'v' prefix) if ($latestTag -match 'v?(\d+)\.(\d+)\.(\d+)') { $major = [int]$Matches[1] $minor = [int]$Matches[2] $patch = [int]$Matches[3] - + # Increment patch version $patch = $patch + 1 - + $newVersion = "v$major.$minor.$patch" Write-Output "Next version: $newVersion" Write-Output "version=$newVersion" >> $env:GITHUB_OUTPUT @@ -66,15 +66,15 @@ jobs: $commitMsg = git log -1 --pretty=%B $commitSubject = git log -1 --pretty=%s $commitBody = git log -1 --pretty=%b - + # Create release notes $releaseNotes = "## Changes`n`n" - + # Parse commit type (fix, feat, docs, etc.) if ($commitSubject -match '^(fix|feat|docs|style|refactor|test|chore|perf|ci|build|revert)(\(.+\))?:\s*(.+)$') { $type = $Matches[1] $description = $Matches[3] - + $typeLabel = switch ($type) { 'fix' { '🐛 Fix' } 'feat' { '✨ Feature' } @@ -89,22 +89,22 @@ jobs: 'revert' { '⏪ Revert' } default { '📝 Update' } } - + $releaseNotes += "**$typeLabel**: $description`n" } else { # If not following conventional commits, just use the subject $releaseNotes += "$commitSubject`n" } - + # Add commit body if present if ($commitBody.Trim() -ne "") { $releaseNotes += "`n$commitBody`n" } - + # Add commit SHA $commitSha = git rev-parse --short HEAD $releaseNotes += "`n---`n*Commit: $commitSha*" - + # Save to output (escape for GitHub Actions) $releaseNotes = $releaseNotes -replace '"', '\"' $releaseNotes = $releaseNotes -replace "`n", "\n" @@ -113,25 +113,15 @@ jobs: - name: Compile with MSVC run: | cl /O2 /Ot /GL /std:c++20 /EHsc main.cpp /DUNICODE /D_UNICODE /Fe:win-witr.exe - - - name: Create Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create Release and Upload Asset + uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.next_version.outputs.version }} - release_name: Release ${{ steps.next_version.outputs.version }} + name: Release ${{ steps.next_version.outputs.version }} body: ${{ steps.parse_commit.outputs.notes }} + files: win-witr.exe draft: false prerelease: false - - - name: Upload Release Asset - uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./win-witr.exe - asset_name: win-witr.exe - asset_content_type: application/x-msdownload From fcbfb0c512eead7a38c71ebd10984d0b7a40a22b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:45:20 +0000 Subject: [PATCH 04/10] fix: improve semantic version sorting and commit message escaping Co-authored-by: supervoidcoder <88671013+supervoidcoder@users.noreply.github.com> --- .github/workflows/release.yml | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0881f8c..dcd1d2d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,9 +24,20 @@ jobs: shell: pwsh run: | # Get the latest tag that matches semantic versioning pattern - $tags = git tag -l "v*.*.*" | Sort-Object -Descending + $tags = git tag -l "v*.*.*" if ($tags) { - $latestTag = $tags[0] + # Parse and sort tags by semantic version + $sortedTags = $tags | ForEach-Object { + if ($_ -match 'v?(\d+)\.(\d+)\.(\d+)') { + [PSCustomObject]@{ + Tag = $_ + Major = [int]$Matches[1] + Minor = [int]$Matches[2] + Patch = [int]$Matches[3] + } + } + } | Sort-Object -Property Major, Minor, Patch -Descending + $latestTag = $sortedTags[0].Tag Write-Output "Latest tag: $latestTag" Write-Output "latest_tag=$latestTag" >> $env:GITHUB_OUTPUT } else { @@ -105,10 +116,11 @@ jobs: $commitSha = git rev-parse --short HEAD $releaseNotes += "`n---`n*Commit: $commitSha*" - # Save to output (escape for GitHub Actions) - $releaseNotes = $releaseNotes -replace '"', '\"' - $releaseNotes = $releaseNotes -replace "`n", "\n" - Write-Output "notes=$releaseNotes" >> $env:GITHUB_OUTPUT + # Save to output using multiline string with proper escaping + $delimiter = "EOF_$(Get-Random)" + Write-Output "notes<<$delimiter" >> $env:GITHUB_OUTPUT + Write-Output $releaseNotes >> $env:GITHUB_OUTPUT + Write-Output $delimiter >> $env:GITHUB_OUTPUT - name: Compile with MSVC run: | From 6242eda6742d346eaaad5929686b35b31571f9a7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:46:26 +0000 Subject: [PATCH 05/10] docs: add documentation about automatic release workflow Co-authored-by: supervoidcoder <88671013+supervoidcoder@users.noreply.github.com> --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index befa155..6980e5f 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,27 @@ While this is inspired by that project, this does not contain any actual code fr when this is done I will submit this to winget!! +## Automatic Releases + +This project uses GitHub Actions to automatically compile and release new versions on every commit to the main branch. + +**How it works:** +- Every commit to `main` automatically triggers a build and release +- The release version is automatically incremented at the patch level (e.g., v0.1.0 → v0.1.1, v0.0.5 → v0.0.6) +- Release notes are generated from commit messages + - If you use [conventional commits](https://www.conventionalcommits.org/) (e.g., `fix: bug description`, `feat: new feature`), the release notes will be nicely formatted with emojis + - Otherwise, the commit message is used as-is +- The compiled binary (`win-witr.exe`) is attached to each release +- Only patch versions are auto-released; major (1.0, 2.0) and minor (0.1, 0.2) releases are done manually + +**Compilation flags:** +The automatic builds use Microsoft's C++ compiler (MSVC) with: +- `/O2` - Maximum optimization for speed +- `/Ot` - Favor fast code +- `/GL` - Whole program optimization +- `/DUNICODE` and `/D_UNICODE` - Unicode support +- `/std:c++20` - C++20 standard + **Why C++?** - I don't know crap about Go From 51b2b5b7c9a031e9d6309f39d34d57ebe09c079b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:48:40 +0000 Subject: [PATCH 06/10] refactor: optimize git operations and improve tag pattern matching Co-authored-by: supervoidcoder <88671013+supervoidcoder@users.noreply.github.com> --- .github/workflows/release.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dcd1d2d..aa52053 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,7 @@ jobs: shell: pwsh run: | # Get the latest tag that matches semantic versioning pattern - $tags = git tag -l "v*.*.*" + $tags = git tag -l "v[0-9]*.[0-9]*.[0-9]*" if ($tags) { # Parse and sort tags by semantic version $sortedTags = $tags | ForEach-Object { @@ -74,9 +74,11 @@ jobs: id: parse_commit shell: pwsh run: | + # Get commit information in a single call $commitMsg = git log -1 --pretty=%B - $commitSubject = git log -1 --pretty=%s - $commitBody = git log -1 --pretty=%b + $commitSubject = $commitMsg.Split("`n")[0] + $commitBodyLines = $commitMsg.Split("`n") | Select-Object -Skip 1 + $commitBody = ($commitBodyLines -join "`n").Trim() # Create release notes $releaseNotes = "## Changes`n`n" @@ -107,8 +109,12 @@ jobs: $releaseNotes += "$commitSubject`n" } - # Add commit body if present - if ($commitBody.Trim() -ne "") { + # Add commit body if present (with length limit) + if ($commitBody -ne "") { + $maxBodyLength = 1000 + if ($commitBody.Length -gt $maxBodyLength) { + $commitBody = $commitBody.Substring(0, $maxBodyLength) + "..." + } $releaseNotes += "`n$commitBody`n" } From 0f33994bbc3d4007b556da80e20888ec02bd9747 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:53:32 +0000 Subject: [PATCH 07/10] fix: only release on PR merge with source changes and successful build Co-authored-by: supervoidcoder <88671013+supervoidcoder@users.noreply.github.com> --- .github/workflows/release.yml | 51 ++++++++++++++++++++++++++++++++++- README.md | 8 ++++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index aa52053..7a34dbd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,7 +1,8 @@ name: Release Build on: - push: + pull_request: + types: [closed] branches: - main @@ -10,16 +11,47 @@ permissions: jobs: build-and-release: + # Only run if PR was merged (not just closed) and source files changed + if: github.event.pull_request.merged == true runs-on: windows-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch all history for proper versioning + - name: Check if source files changed + id: check_files + shell: pwsh + run: | + # Get list of changed files in the merged PR + $changedFiles = git diff --name-only HEAD~1 HEAD + Write-Output "Changed files:" + Write-Output $changedFiles + + # Check if any C++ source files changed + $sourceChanged = $false + foreach ($file in $changedFiles) { + if ($file -match '\.(cpp|h|hpp|c|cc|cxx)$') { + $sourceChanged = $true + Write-Output "Source file changed: $file" + break + } + } + + if ($sourceChanged) { + Write-Output "should_release=true" >> $env:GITHUB_OUTPUT + Write-Output "Source files changed - will proceed with release" + } else { + Write-Output "should_release=false" >> $env:GITHUB_OUTPUT + Write-Output "No source files changed - skipping release" + } + - name: Setup MSVC + if: steps.check_files.outputs.should_release == 'true' uses: ilammy/msvc-dev-cmd@v1 - name: Get latest release tag + if: steps.check_files.outputs.should_release == 'true' id: get_latest_tag shell: pwsh run: | @@ -46,6 +78,7 @@ jobs: } - name: Determine next version + if: steps.check_files.outputs.should_release == 'true' id: next_version shell: pwsh run: | @@ -71,6 +104,7 @@ jobs: } - name: Parse commit message for release notes + if: steps.check_files.outputs.should_release == 'true' id: parse_commit shell: pwsh run: | @@ -129,10 +163,25 @@ jobs: Write-Output $delimiter >> $env:GITHUB_OUTPUT - name: Compile with MSVC + if: steps.check_files.outputs.should_release == 'true' + id: compile + shell: pwsh run: | + # Compile and capture exit code cl /O2 /Ot /GL /std:c++20 /EHsc main.cpp /DUNICODE /D_UNICODE /Fe:win-witr.exe + $exitCode = $LASTEXITCODE + + if ($exitCode -eq 0) { + Write-Output "Compilation successful" + Write-Output "compile_success=true" >> $env:GITHUB_OUTPUT + } else { + Write-Output "Compilation failed with exit code: $exitCode" + Write-Output "compile_success=false" >> $env:GITHUB_OUTPUT + exit 1 + } - name: Create Release and Upload Asset + if: steps.check_files.outputs.should_release == 'true' && steps.compile.outputs.compile_success == 'true' uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.next_version.outputs.version }} diff --git a/README.md b/README.md index 6980e5f..67cc3c2 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,14 @@ when this is done I will submit this to winget!! ## Automatic Releases -This project uses GitHub Actions to automatically compile and release new versions on every commit to the main branch. +This project uses GitHub Actions to automatically compile and release new versions when PRs are merged to the main branch. **How it works:** -- Every commit to `main` automatically triggers a build and release +- Releases are triggered when a PR is merged to `main` (not on every push) +- Only releases if C++ source files (`.cpp`, `.h`, `.hpp`, etc.) were changed + - README-only changes or other non-code changes won't trigger a release +- The build must compile successfully before creating a release + - If compilation fails, no release is created - The release version is automatically incremented at the patch level (e.g., v0.1.0 → v0.1.1, v0.0.5 → v0.0.6) - Release notes are generated from commit messages - If you use [conventional commits](https://www.conventionalcommits.org/) (e.g., `fix: bug description`, `feat: new feature`), the release notes will be nicely formatted with emojis From e74b1c42ae7fd0d0cba6e8b0e18e4128859be998 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:55:21 +0000 Subject: [PATCH 08/10] fix: improve PR file detection and revert README changes Co-authored-by: supervoidcoder <88671013+supervoidcoder@users.noreply.github.com> --- .github/workflows/release.yml | 3 ++- README.md | 25 ------------------------- 2 files changed, 2 insertions(+), 26 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7a34dbd..a3c4203 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,7 @@ jobs: shell: pwsh run: | # Get list of changed files in the merged PR - $changedFiles = git diff --name-only HEAD~1 HEAD + $changedFiles = git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }} Write-Output "Changed files:" Write-Output $changedFiles @@ -177,6 +177,7 @@ jobs: } else { Write-Output "Compilation failed with exit code: $exitCode" Write-Output "compile_success=false" >> $env:GITHUB_OUTPUT + Write-Error "Build failed - release will be skipped" exit 1 } diff --git a/README.md b/README.md index 67cc3c2..befa155 100644 --- a/README.md +++ b/README.md @@ -13,31 +13,6 @@ While this is inspired by that project, this does not contain any actual code fr when this is done I will submit this to winget!! -## Automatic Releases - -This project uses GitHub Actions to automatically compile and release new versions when PRs are merged to the main branch. - -**How it works:** -- Releases are triggered when a PR is merged to `main` (not on every push) -- Only releases if C++ source files (`.cpp`, `.h`, `.hpp`, etc.) were changed - - README-only changes or other non-code changes won't trigger a release -- The build must compile successfully before creating a release - - If compilation fails, no release is created -- The release version is automatically incremented at the patch level (e.g., v0.1.0 → v0.1.1, v0.0.5 → v0.0.6) -- Release notes are generated from commit messages - - If you use [conventional commits](https://www.conventionalcommits.org/) (e.g., `fix: bug description`, `feat: new feature`), the release notes will be nicely formatted with emojis - - Otherwise, the commit message is used as-is -- The compiled binary (`win-witr.exe`) is attached to each release -- Only patch versions are auto-released; major (1.0, 2.0) and minor (0.1, 0.2) releases are done manually - -**Compilation flags:** -The automatic builds use Microsoft's C++ compiler (MSVC) with: -- `/O2` - Maximum optimization for speed -- `/Ot` - Favor fast code -- `/GL` - Whole program optimization -- `/DUNICODE` and `/D_UNICODE` - Unicode support -- `/std:c++20` - C++20 standard - **Why C++?** - I don't know crap about Go From 316a4245fb4654e4be6860b835050923784fe57c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 14:02:35 +0000 Subject: [PATCH 09/10] fix: fail workflow on version parse error, mark releases as prerelease, update release name Co-authored-by: supervoidcoder <88671013+supervoidcoder@users.noreply.github.com> --- .github/workflows/release.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a3c4203..b176feb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -98,9 +98,8 @@ jobs: Write-Output "version=$newVersion" >> $env:GITHUB_OUTPUT Write-Output "version_number=$major.$minor.$patch" >> $env:GITHUB_OUTPUT } else { - Write-Output "Could not parse version, defaulting to v0.0.1" - Write-Output "version=v0.0.1" >> $env:GITHUB_OUTPUT - Write-Output "version_number=0.0.1" >> $env:GITHUB_OUTPUT + Write-Error "Could not parse version from tag: $latestTag" + exit 1 } - name: Parse commit message for release notes @@ -186,10 +185,10 @@ jobs: uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.next_version.outputs.version }} - name: Release ${{ steps.next_version.outputs.version }} + name: Release win-witr ${{ steps.next_version.outputs.version }} body: ${{ steps.parse_commit.outputs.notes }} files: win-witr.exe draft: false - prerelease: false + prerelease: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From a81a2654fe4377b4809bf9df480fff058d01526d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 14:19:23 +0000 Subject: [PATCH 10/10] fix: add concurrency control to prevent duplicate release tag collisions Co-authored-by: supervoidcoder <88671013+supervoidcoder@users.noreply.github.com> --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b176feb..62a581c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,6 +14,9 @@ jobs: # Only run if PR was merged (not just closed) and source files changed if: github.event.pull_request.merged == true runs-on: windows-latest + concurrency: + group: 'release-${{ github.ref }}' + cancel-in-progress: false steps: - uses: actions/checkout@v4 with: