feat(installer): mode-aware wizard page list + Update-mode step pipeline

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Mika Kuns
2026-04-15 11:07:03 +02:00
parent 5d42438a72
commit b5455a1965
2 changed files with 48 additions and 12 deletions

View File

@@ -3,15 +3,17 @@ using System.Diagnostics;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using ClaudeDo.Installer.Core; using ClaudeDo.Installer.Core;
using ClaudeDo.Installer.Steps;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using Microsoft.Extensions.DependencyInjection;
namespace ClaudeDo.Installer.Pages.InstallPage; namespace ClaudeDo.Installer.Pages.InstallPage;
public partial class InstallPageViewModel : ObservableObject, IInstallerPage public partial class InstallPageViewModel : ObservableObject, IInstallerPage
{ {
private readonly InstallContext _context; private readonly InstallContext _context;
private readonly InstallerService _installerService; private readonly IServiceProvider _serviceProvider;
private InstallPageView? _view; private InstallPageView? _view;
private CancellationTokenSource? _cts; private CancellationTokenSource? _cts;
@@ -29,22 +31,31 @@ public partial class InstallPageViewModel : ObservableObject, IInstallerPage
[ObservableProperty] private bool _hasErrors; [ObservableProperty] private bool _hasErrors;
[ObservableProperty] private double _overallProgress; [ObservableProperty] private double _overallProgress;
public InstallPageViewModel(InstallContext context, InstallerService installerService) public InstallPageViewModel(InstallContext context, IServiceProvider serviceProvider)
{ {
_context = context; _context = context;
_installerService = installerService; _serviceProvider = serviceProvider;
} }
public Task LoadAsync() public Task LoadAsync()
{ {
Steps.Clear(); Steps.Clear();
Steps.Add(new StepViewModel("Publish ClaudeDo.App")); if (_context.Mode == InstallerMode.Update)
Steps.Add(new StepViewModel("Publish ClaudeDo.Worker")); {
Steps.Add(new StepViewModel("Deploy Binaries")); Steps.Add(new StepViewModel("Stop Worker Service"));
Steps.Add(new StepViewModel("Write Configuration")); Steps.Add(new StepViewModel("Download and Extract"));
Steps.Add(new StepViewModel("Initialize Database")); Steps.Add(new StepViewModel("Start Worker Service"));
Steps.Add(new StepViewModel("Register Windows Service")); Steps.Add(new StepViewModel("Write Install Manifest"));
Steps.Add(new StepViewModel("Create Shortcuts")); }
else
{
Steps.Add(new StepViewModel("Download and Extract"));
Steps.Add(new StepViewModel("Write Configuration"));
Steps.Add(new StepViewModel("Initialize Database"));
Steps.Add(new StepViewModel("Register Windows Service"));
Steps.Add(new StepViewModel("Create Shortcuts"));
Steps.Add(new StepViewModel("Write Install Manifest"));
}
return Task.CompletedTask; return Task.CompletedTask;
} }
@@ -85,7 +96,24 @@ public partial class InstallPageViewModel : ObservableObject, IInstallerPage
try try
{ {
var results = await _installerService.ExecuteAsync(_context, progress, _cts.Token); IEnumerable<IInstallStep> steps;
if (_context.Mode == InstallerMode.Update)
{
steps = new IInstallStep[]
{
_serviceProvider.GetRequiredService<StopServiceStep>(),
_serviceProvider.GetRequiredService<DownloadAndExtractStep>(),
_serviceProvider.GetRequiredService<StartServiceStep>(),
_serviceProvider.GetRequiredService<WriteInstallManifestStep>(),
};
}
else
{
steps = _serviceProvider.GetServices<IInstallStep>();
}
var runner = new InstallerService(steps);
var results = await runner.ExecuteAsync(_context, progress, _cts.Token);
HasErrors = results.Any(r => !r.Result.Success); HasErrors = results.Any(r => !r.Result.Success);
} }
catch (OperationCanceledException) catch (OperationCanceledException)

View File

@@ -1,5 +1,8 @@
using System.Linq;
using System.Windows; using System.Windows;
using ClaudeDo.Installer.Core; using ClaudeDo.Installer.Core;
using ClaudeDo.Installer.Pages.InstallPage;
using ClaudeDo.Installer.Pages.WelcomePage;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
@@ -28,9 +31,14 @@ public partial class WizardViewModel : ObservableObject
public WizardViewModel(PageResolver resolver, InstallContext context) public WizardViewModel(PageResolver resolver, InstallContext context)
{ {
Pages = resolver.WizardPages;
_context = context; _context = context;
var all = resolver.WizardPages;
Pages = context.Mode == InstallerMode.Update
? all.Where(p => p is WelcomePageViewModel
|| p is InstallPageViewModel).ToList()
: all;
if (Pages.Count > 0) if (Pages.Count > 0)
_ = InitAsync(); _ = InitAsync();
} }