diff --git a/src/ClaudeDo.Data/Repositories/AppSettingsRepository.cs b/src/ClaudeDo.Data/Repositories/AppSettingsRepository.cs index ae22a5f..ab9218a 100644 --- a/src/ClaudeDo.Data/Repositories/AppSettingsRepository.cs +++ b/src/ClaudeDo.Data/Repositories/AppSettingsRepository.cs @@ -50,6 +50,9 @@ public sealed class AppSettingsRepository ? null : updated.CentralWorktreeRoot; row.WorktreeAutoCleanupEnabled = updated.WorktreeAutoCleanupEnabled; row.WorktreeAutoCleanupDays = updated.WorktreeAutoCleanupDays; + row.ReportExcludedPaths = string.IsNullOrWhiteSpace(updated.ReportExcludedPaths) + ? null : updated.ReportExcludedPaths; + row.StandupWeekday = updated.StandupWeekday; await _context.SaveChangesAsync(ct); } diff --git a/src/ClaudeDo.Ui/Services/WorkerClient.cs b/src/ClaudeDo.Ui/Services/WorkerClient.cs index 3f4d04e..9ccd448 100644 --- a/src/ClaudeDo.Ui/Services/WorkerClient.cs +++ b/src/ClaudeDo.Ui/Services/WorkerClient.cs @@ -494,7 +494,9 @@ public sealed record AppSettingsDto( string WorktreeStrategy, string? CentralWorktreeRoot, bool WorktreeAutoCleanupEnabled, - int WorktreeAutoCleanupDays); + int WorktreeAutoCleanupDays, + string? ReportExcludedPaths, + int StandupWeekday); public sealed record WorktreeCleanupDto(int Removed); public sealed record WorktreeResetDto(int Removed, int TasksAffected, bool Blocked, int RunningTasks); diff --git a/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs index 72790da..3c327df 100644 --- a/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs @@ -10,6 +10,10 @@ public sealed partial class GeneralSettingsTabViewModel : ViewModelBase [ObservableProperty] private int _defaultMaxTurns = 100; [ObservableProperty] private string _defaultPermissionMode = PermissionModeRegistry.DefaultMode; [ObservableProperty] private int _maxParallelExecutions = 1; + // Newline-separated path prefixes excluded from the weekly report. + [ObservableProperty] private string _reportExcludedPaths = @"C:\Private"; + // 0=Sunday..6=Saturday (System.DayOfWeek); default Wednesday. + [ObservableProperty] private int _standupWeekday = (int)DayOfWeek.Wednesday; public IReadOnlyList Models { get; } = ModelRegistry.Aliases; public IReadOnlyList PermissionModes { get; } = PermissionModeRegistry.Modes; diff --git a/src/ClaudeDo.Ui/ViewModels/Modals/SettingsModalViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Modals/SettingsModalViewModel.cs index 9cde0c5..73def14 100644 --- a/src/ClaudeDo.Ui/ViewModels/Modals/SettingsModalViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Modals/SettingsModalViewModel.cs @@ -1,3 +1,4 @@ +using System.Linq; using ClaudeDo.Data; using ClaudeDo.Ui.Services; using ClaudeDo.Ui.ViewModels.Modals.Settings; @@ -47,6 +48,11 @@ public sealed partial class SettingsModalViewModel : ViewModelBase Worktrees.CentralWorktreeRoot = dto.CentralWorktreeRoot; Worktrees.WorktreeAutoCleanupEnabled = dto.WorktreeAutoCleanupEnabled; Worktrees.WorktreeAutoCleanupDays = dto.WorktreeAutoCleanupDays; + General.ReportExcludedPaths = string.IsNullOrWhiteSpace(dto.ReportExcludedPaths) + ? @"C:\Private" + : string.Join(Environment.NewLine, + System.Text.Json.JsonSerializer.Deserialize>(dto.ReportExcludedPaths) ?? new()); + General.StandupWeekday = dto.StandupWeekday == 0 ? (int)DayOfWeek.Wednesday : dto.StandupWeekday; } else StatusMessage = "Worker offline — settings read-only."; @@ -74,7 +80,11 @@ public sealed partial class SettingsModalViewModel : ViewModelBase Worktrees.WorktreeStrategy ?? "sibling", string.IsNullOrWhiteSpace(Worktrees.CentralWorktreeRoot) ? null : Worktrees.CentralWorktreeRoot, Worktrees.WorktreeAutoCleanupEnabled, - Worktrees.WorktreeAutoCleanupDays); + Worktrees.WorktreeAutoCleanupDays, + System.Text.Json.JsonSerializer.Serialize( + General.ReportExcludedPaths + .Split('\n').Select(l => l.Trim().TrimEnd('\r')).Where(l => l.Length > 0).ToList()), + General.StandupWeekday); await _worker.UpdateAppSettingsAsync(dto); await Prime.SaveAsync(); CloseAction?.Invoke(); diff --git a/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml b/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml index ed0aa15..d3a4ef7 100644 --- a/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml +++ b/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml @@ -78,6 +78,22 @@ + + + + + + + + Sonntag + Montag + Dienstag + Mittwoch + Donnerstag + Freitag + Samstag + + diff --git a/src/ClaudeDo.Worker/Hub/WorkerHub.cs b/src/ClaudeDo.Worker/Hub/WorkerHub.cs index ff98f31..d019111 100644 --- a/src/ClaudeDo.Worker/Hub/WorkerHub.cs +++ b/src/ClaudeDo.Worker/Hub/WorkerHub.cs @@ -29,7 +29,9 @@ public record AppSettingsDto( string WorktreeStrategy, string? CentralWorktreeRoot, bool WorktreeAutoCleanupEnabled, - int WorktreeAutoCleanupDays); + int WorktreeAutoCleanupDays, + string? ReportExcludedPaths, + int StandupWeekday); public record WorktreeCleanupDto(int Removed); public record WorktreeResetDto(int Removed, int TasksAffected, bool Blocked, int RunningTasks); @@ -213,7 +215,9 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub row.WorktreeStrategy, row.CentralWorktreeRoot, row.WorktreeAutoCleanupEnabled, - row.WorktreeAutoCleanupDays); + row.WorktreeAutoCleanupDays, + row.ReportExcludedPaths, + row.StandupWeekday); } public async Task UpdateAppSettings(AppSettingsDto dto) @@ -232,6 +236,8 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub CentralWorktreeRoot = dto.CentralWorktreeRoot, WorktreeAutoCleanupEnabled = dto.WorktreeAutoCleanupEnabled, WorktreeAutoCleanupDays = dto.WorktreeAutoCleanupDays, + ReportExcludedPaths = dto.ReportExcludedPaths, + StandupWeekday = dto.StandupWeekday == 0 ? (int)DayOfWeek.Wednesday : dto.StandupWeekday, }); }