diff --git a/src/ClaudeDo.Installer/App.xaml.cs b/src/ClaudeDo.Installer/App.xaml.cs index 89207019..ef35f7da 100644 --- a/src/ClaudeDo.Installer/App.xaml.cs +++ b/src/ClaudeDo.Installer/App.xaml.cs @@ -4,13 +4,17 @@ using System.Linq; using System.Net.Http; using System.Reflection; using System.Windows; +using ClaudeDo.Installer.Checks; +using ClaudeDo.Installer.Checks.Interfaces; using ClaudeDo.Installer.Core; +using ClaudeDo.Installer.Core.Interfaces; using ClaudeDo.Installer.Localization; using ClaudeDo.Localization; using ClaudeDo.Releases; using ClaudeDo.Installer.Pages.InstallPage; using ClaudeDo.Installer.Pages.PathsPage; using ClaudeDo.Installer.Pages.ServicePage; +using ClaudeDo.Installer.Pages.SystemCheckPage; using ClaudeDo.Installer.Pages.UiSettingsPage; using ClaudeDo.Installer.Pages.WelcomePage; using ClaudeDo.Installer.Steps; @@ -121,8 +125,30 @@ public partial class App : Application sc.AddSingleton(sp => new ReleaseClient(sp.GetRequiredService())); sc.AddSingleton(); + // Environment checks — stateless, so their infrastructure is shared; ClaudeCliLookup is + // rebuilt per EnvironmentCheckService instance so a re-check doesn't reuse a stale result. + sc.AddSingleton(); + sc.AddSingleton(); + sc.AddTransient>(sp => () => + { + var processRunner = sp.GetRequiredService(); + var claudeLookup = new ClaudeCliLookup(processRunner); + return new EnvironmentCheckService(new IEnvironmentCheck[] + { + new GitCheck(processRunner), + new GitIdentityCheck(processRunner), + new PortCheck(sp.GetRequiredService()), + new WriteAccessCheck(), + new ClaudeCliCheck(claudeLookup), + new ClaudeVersionCheck(claudeLookup), + new ClaudeAuthCheck(claudeLookup), + new PermissionModeAutoCheck(claudeLookup), + }); + }); + // Pages sc.AddSingleton(); + sc.AddSingleton(); sc.AddSingleton(); sc.AddSingleton(); sc.AddSingleton(); diff --git a/src/ClaudeDo.Installer/Core/Interfaces/IInstallerPage.cs b/src/ClaudeDo.Installer/Core/Interfaces/IInstallerPage.cs index ef4db1c9..bd9b6799 100644 --- a/src/ClaudeDo.Installer/Core/Interfaces/IInstallerPage.cs +++ b/src/ClaudeDo.Installer/Core/Interfaces/IInstallerPage.cs @@ -13,4 +13,7 @@ public interface IInstallerPage Task LoadAsync(); Task ApplyAsync(); bool Validate(); + + /// True while this page wants "Next" disabled (e.g. a check run in progress or a blocking error). + bool BlocksNavigation => false; } diff --git a/src/ClaudeDo.Installer/Pages/PathsPage/PathsPageViewModel.cs b/src/ClaudeDo.Installer/Pages/PathsPage/PathsPageViewModel.cs index cd6d7d12..16b64e8e 100644 --- a/src/ClaudeDo.Installer/Pages/PathsPage/PathsPageViewModel.cs +++ b/src/ClaudeDo.Installer/Pages/PathsPage/PathsPageViewModel.cs @@ -12,7 +12,7 @@ public partial class PathsPageViewModel : ObservableObject, IInstallerPage public string Title => TrExtension.Localizer?["installer.paths.title"] ?? "Paths"; public string Icon => "\uE8B7"; - public int Order => 1; + public int Order => 2; public bool ShowInWizard => true; public bool ShowInSettings => true; public UserControl View => _view ??= new PathsPageView { DataContext = this }; diff --git a/src/ClaudeDo.Installer/Pages/ServicePage/ServicePageViewModel.cs b/src/ClaudeDo.Installer/Pages/ServicePage/ServicePageViewModel.cs index 437e93ac..76cc099e 100644 --- a/src/ClaudeDo.Installer/Pages/ServicePage/ServicePageViewModel.cs +++ b/src/ClaudeDo.Installer/Pages/ServicePage/ServicePageViewModel.cs @@ -14,7 +14,7 @@ public partial class ServicePageViewModel : ObservableObject, IInstallerPage public string Title => TrExtension.Localizer?["installer.service.title"] ?? "Service"; public string Icon => "\uE912"; - public int Order => 2; + public int Order => 3; public bool ShowInWizard => true; public bool ShowInSettings => true; public UserControl View => _view ??= new ServicePageView { DataContext = this }; diff --git a/src/ClaudeDo.Installer/Pages/SystemCheckPage/SystemCheckPageView.xaml b/src/ClaudeDo.Installer/Pages/SystemCheckPage/SystemCheckPageView.xaml new file mode 100644 index 00000000..459163af --- /dev/null +++ b/src/ClaudeDo.Installer/Pages/SystemCheckPage/SystemCheckPageView.xaml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +