From 43ae947fce17e35386346a83775ca2822116accd Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 13 Jun 2025 22:11:11 +0000 Subject: [PATCH 01/14] chore: bump version to 3.26.2-rc1 for RC release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6d6bb31be..81dbb9a66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse", - "version": "3.26.2", + "version": "3.26.2-rc1", "description": "A lightweight monitoring application for Proxmox VE.", "main": "server/index.js", "scripts": { From ea98f4a2e1160740f49defc3d6c43c1a1027c450 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 13 Jun 2025 23:15:20 +0100 Subject: [PATCH 02/14] fix: add conflict resolution to both RC and stable release workflows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add rebase and retry logic to handle concurrent workflow runs - Resolve package.json conflicts automatically during releases - Prevent workflow failures from git push conflicts - Apply fix to both RC and stable release workflows 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .github/workflows/rc-release.yml | 28 ++++++++++++++++++++++++-- .github/workflows/stable-release.yml | 30 ++++++++++++++++++++++++++-- package-lock.json | 4 ++++ 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/.github/workflows/rc-release.yml b/.github/workflows/rc-release.yml index 56c05569b..a7f013616 100644 --- a/.github/workflows/rc-release.yml +++ b/.github/workflows/rc-release.yml @@ -66,10 +66,34 @@ jobs: git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - # Commit the version change + # Commit the version change with conflict resolution git add package.json git commit -m "chore: bump version to $NEW_VERSION for RC release" - git push origin develop + + # Pull and rebase before pushing to handle any concurrent changes + echo "🔄 Pulling latest changes before push..." + git fetch origin develop + if ! git rebase origin/develop; then + echo "⚠️ Rebase conflicts detected, attempting resolution..." + # For package.json conflicts, prefer our version (the RC version) + git checkout --ours package.json 2>/dev/null || true + git add package.json 2>/dev/null || true + git rebase --continue 2>/dev/null || true + fi + + # Push with retry logic + echo "📤 Pushing to develop..." + for i in {1..3}; do + if git push origin develop; then + echo "✅ Successfully pushed to develop" + break + else + echo "⚠️ Push failed (attempt $i/3), retrying..." + git fetch origin develop + git rebase origin/develop 2>/dev/null || true + sleep $((i * 2)) + fi + done - name: Set up Docker Buildx if: steps.check.outputs.create_release == 'true' diff --git a/.github/workflows/stable-release.yml b/.github/workflows/stable-release.yml index 438554f52..dfda465e0 100644 --- a/.github/workflows/stable-release.yml +++ b/.github/workflows/stable-release.yml @@ -178,9 +178,35 @@ jobs: 🤖 Generated by automated stable release workflow" - # Create and push tag + # Create and push tag with conflict resolution git tag -a "v$NEW_VERSION" -m "Release v$NEW_VERSION" - git push origin main + + # Pull and rebase before pushing to handle any concurrent changes + echo "🔄 Pulling latest changes before push..." + git fetch origin main + if ! git rebase origin/main; then + echo "⚠️ Rebase conflicts detected, attempting resolution..." + # For package.json conflicts, prefer our version (the release version) + git checkout --ours package.json package-lock.json 2>/dev/null || true + git add package.json package-lock.json 2>/dev/null || true + git rebase --continue 2>/dev/null || true + fi + + # Push with retry logic + echo "📤 Pushing to main..." + for i in {1..3}; do + if git push origin main; then + echo "✅ Successfully pushed to main" + break + else + echo "⚠️ Push failed (attempt $i/3), retrying..." + git fetch origin main + git rebase origin/main 2>/dev/null || true + sleep $((i * 2)) + fi + done + + echo "📤 Pushing tag..." git push origin "v$NEW_VERSION" - name: Generate changelog diff --git a/package-lock.json b/package-lock.json index b326be3c9..177214e1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,11 @@ "packages": { "": { "name": "pulse", +<<<<<<< Updated upstream "version": "3.26.2", +======= + "version": "3.27.0-rc6", +>>>>>>> Stashed changes "license": "MIT", "dependencies": { "axios": "^1.9.0", From 44ccd3bd0670e9357b221fe2ba2c51fa5220ab5f Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 13 Jun 2025 22:15:43 +0000 Subject: [PATCH 03/14] chore: bump version to 3.26.2-rc2 for RC release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 81dbb9a66..1c0cec73d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse", - "version": "3.26.2-rc1", + "version": "3.26.2-rc2", "description": "A lightweight monitoring application for Proxmox VE.", "main": "server/index.js", "scripts": { From 7bf00641757711a6dab7955294954253541b3472 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 13 Jun 2025 23:19:24 +0100 Subject: [PATCH 04/14] chore: bump package.json version to 3.26.5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Keep develop ahead of latest stable release (v3.26.4) - Ensures future RC releases appear at top of releases page - Aligns with release workflow expectations 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1c0cec73d..49b9eca17 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse", - "version": "3.26.2-rc2", + "version": "3.26.5", "description": "A lightweight monitoring application for Proxmox VE.", "main": "server/index.js", "scripts": { From 60fd68ba4c88107da2ea7bba6792094802ff9d5c Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 13 Jun 2025 22:19:50 +0000 Subject: [PATCH 05/14] chore: bump version to 3.26.5-rc1 for RC release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 49b9eca17..fdec01283 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse", - "version": "3.26.5", + "version": "3.26.5-rc1", "description": "A lightweight monitoring application for Proxmox VE.", "main": "server/index.js", "scripts": { From d20777e4af5442714c57cd88fae82c3dadf5c824 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 13 Jun 2025 23:21:12 +0100 Subject: [PATCH 06/14] fix: use consistent version analysis logic in RC workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Make RC workflow use same version analysis as stable workflow - Prevents version number inconsistencies between RC and stable releases - Ensures RC versions are based on commit analysis, not package.json - Both workflows now calculate versions from latest stable release 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .github/workflows/rc-release.yml | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rc-release.yml b/.github/workflows/rc-release.yml index a7f013616..e3469823d 100644 --- a/.github/workflows/rc-release.yml +++ b/.github/workflows/rc-release.yml @@ -19,11 +19,35 @@ jobs: VERSION=$(node -p "require('./package.json').version") echo "version=$VERSION" >> $GITHUB_OUTPUT + - name: Analyze version for RC release + id: analyze + run: | + # Use the same version analysis logic as stable releases + node -e " + const { analyzeCommitsForVersionBump } = require('./server/versionUtils'); + const analysis = analyzeCommitsForVersionBump(); + + console.log('📊 RC Version Analysis:'); + console.log('Current stable version:', analysis.currentStableVersion); + console.log('Suggested next version:', analysis.suggestedVersion); + console.log('Bump type:', analysis.bumpType); + console.log('Total commits:', analysis.totalCommits); + + // Set base version for RC releases + const fs = require('fs'); + const output = fs.readFileSync(process.env.GITHUB_OUTPUT, 'utf8'); + fs.writeFileSync(process.env.GITHUB_OUTPUT, output + + 'base_version=' + analysis.suggestedVersion + '\\n' + + 'current_stable=' + analysis.currentStableVersion + '\\n' + + 'reasoning=' + analysis.reasoning + '\\n' + ); + " + - name: Check if RC release needed id: check run: | - # Get base version (remove any existing RC suffix) - BASE_VERSION=$(echo "${{ steps.version.outputs.version }}" | sed 's/-rc[0-9]*$//') + # Use analyzed base version instead of package.json + BASE_VERSION="${{ steps.analyze.outputs.base_version }}" # Get the latest RC tag for this base version LATEST_RC=$(git tag -l "v${BASE_VERSION}-rc*" | sort -V | tail -n1) From c2a0887dc63e07e7c18aba4a4c646d2eb62234dc Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 13 Jun 2025 23:27:49 +0100 Subject: [PATCH 07/14] fix: add missing info method to toast notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add PulseApp.ui.toast.info() method that was referenced but not implemented - Fixes TypeError when switching update channels in settings - Method calls showToast with 'info' type and 4000ms duration 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/public/js/ui/toastNotifications.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/public/js/ui/toastNotifications.js b/src/public/js/ui/toastNotifications.js index d8ea4de3a..29288afe8 100644 --- a/src/public/js/ui/toastNotifications.js +++ b/src/public/js/ui/toastNotifications.js @@ -229,6 +229,10 @@ PulseApp.ui.toast = (() => { return showToast(message, 'warning', 5000); } + function info(message) { + return showToast(message, 'info', 4000); + } + function confirm(message, onConfirm, onCancel = null) { return showConfirmToast(message, onConfirm, onCancel); } @@ -242,6 +246,7 @@ PulseApp.ui.toast = (() => { success, error, warning, + info, confirm }; })(); From cc75216779e8a6a2c2bd36ff58a79099ba7d92bd Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 13 Jun 2025 22:27:58 +0000 Subject: [PATCH 08/14] chore: bump version to 3.26.5-rc2 for RC release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fdec01283..b16681954 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse", - "version": "3.26.5-rc1", + "version": "3.26.5-rc2", "description": "A lightweight monitoring application for Proxmox VE.", "main": "server/index.js", "scripts": { From 7502dec914c3205905beb115340c013a81c84053 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 13 Jun 2025 23:36:43 +0100 Subject: [PATCH 09/14] feat: auto-refresh after update and persist channel preference MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Auto-refresh frontend 10 seconds after update restart - Store update channel preference in localStorage during update - Restore channel preference after successful update - Show user-friendly progress messages during reconnection - Automatically save restored channel preference to config 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/public/js/ui/settings.js | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/public/js/ui/settings.js b/src/public/js/ui/settings.js index e50ccdc86..92df69e77 100644 --- a/src/public/js/ui/settings.js +++ b/src/public/js/ui/settings.js @@ -196,10 +196,21 @@ PulseApp.ui.settings = (() => { } else if (activeTab === 'system') { // Auto-check for latest version when system tab is opened checkLatestVersion(); - // Initialize update channel warning visibility + // Initialize update channel warning visibility and restore channel preference setTimeout(() => { const channelSelect = document.querySelector('select[name="UPDATE_CHANNEL"]'); if (channelSelect) { + // Check if there's a stored channel preference from a recent update + const storedChannelPreference = localStorage.getItem('pulse_update_channel_preference'); + if (storedChannelPreference && storedChannelPreference !== channelSelect.value) { + // Update the select to match the stored preference + channelSelect.value = storedChannelPreference; + showMessage(`Restored ${storedChannelPreference === 'rc' ? 'RC' : 'Stable'} channel preference from update.`, 'info'); + // Clear the stored preference since we've applied it + localStorage.removeItem('pulse_update_channel_preference'); + // Save the configuration with the restored preference + setTimeout(() => saveConfiguration(), 1000); + } onUpdateChannelChange(channelSelect.value); } }, 0); @@ -2032,6 +2043,25 @@ PulseApp.ui.settings = (() => { progressText.textContent = 'Update complete! Restarting...'; } showMessage('Update applied successfully. The application will restart momentarily.', 'success'); + + // Store the current channel preference for after restart + const currentChannelSelect = document.querySelector('select[name="UPDATE_CHANNEL"]'); + if (currentChannelSelect) { + localStorage.setItem('pulse_update_channel_preference', currentChannelSelect.value); + } + + // Auto-refresh after restart delay + setTimeout(() => { + if (progressText) { + progressText.textContent = 'Reconnecting...'; + } + showMessage('Attempting to reconnect...', 'info'); + + // Try to reload the page after service restart + setTimeout(() => { + window.location.reload(); + }, 2000); + }, 8000); // Wait 8 seconds for service to restart }); window.socket.on('updateError', (data) => { From 94cd20559bf42d9bc064fc90851a67abc9a72b4a Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 13 Jun 2025 22:36:53 +0000 Subject: [PATCH 10/14] chore: bump version to 3.27.0-rc9 for RC release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b16681954..d4df54302 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse", - "version": "3.26.5-rc2", + "version": "3.27.0-rc9", "description": "A lightweight monitoring application for Proxmox VE.", "main": "server/index.js", "scripts": { From 56c6cafd5579e7c8511c7ba05acd1cb2f77df455 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 13 Jun 2025 23:41:06 +0100 Subject: [PATCH 11/14] feat: improve update UX with auto-refresh and channel-specific version checking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Auto-refresh frontend 10 seconds after update restart with reconnection UI - Store and restore update channel preference across updates - Fix footer version check to only compare within user's configured channel - Stable users only see stable updates, RC users only see RC updates - Eliminate confusing cross-channel update notifications 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/public/js/main.js | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/public/js/main.js b/src/public/js/main.js index b65d47a7d..d819bea5b 100644 --- a/src/public/js/main.js +++ b/src/public/js/main.js @@ -167,21 +167,9 @@ document.addEventListener('DOMContentLoaded', function() { return; } - // Get user's channel preference from config - let userChannel = 'stable'; // default - try { - const configResponse = await fetch('/api/config'); - if (configResponse.ok) { - const config = await configResponse.json(); - userChannel = config.advanced?.updateChannel || 'stable'; - } - } catch (error) { - console.warn('Could not load user channel preference, using stable'); - } - - // Check version with user's preferred channel - const versionUrl = userChannel === 'stable' ? '/api/version' : `/api/version?channel=${userChannel}`; - fetch(versionUrl) + // Use the user's configured channel from server config + // No need to override - let the server use its configured channel + fetch('/api/version') .then(response => { if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); From 2bd537ad84db0b65254743549f2943ae1ecf0d16 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 13 Jun 2025 22:41:17 +0000 Subject: [PATCH 12/14] chore: bump version to 3.27.0-rc10 for RC release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d4df54302..f4fb3ce87 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse", - "version": "3.27.0-rc9", + "version": "3.27.0-rc10", "description": "A lightweight monitoring application for Proxmox VE.", "main": "server/index.js", "scripts": { From 97c5e89bbb5bab6241aaadfbe5c008649d300edf Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 13 Jun 2025 23:44:42 +0100 Subject: [PATCH 13/14] fix: reset package.json version to correct value MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reset from incorrect 3.27.0-rc9 to 3.26.5 - Allows RC workflow to generate correct version number - Next RC should be v3.26.5-rc3 based on version analysis 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f4fb3ce87..49b9eca17 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse", - "version": "3.27.0-rc10", + "version": "3.26.5", "description": "A lightweight monitoring application for Proxmox VE.", "main": "server/index.js", "scripts": { From ee02361ecae556e104e5e747fc5a0c5a04053340 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 13 Jun 2025 22:45:08 +0000 Subject: [PATCH 14/14] chore: bump version to 3.27.0-rc1 for RC release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 49b9eca17..d4704b7ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse", - "version": "3.26.5", + "version": "3.27.0-rc1", "description": "A lightweight monitoring application for Proxmox VE.", "main": "server/index.js", "scripts": {