From 3e4e4a03f7405f678160abe8b591b5ec70be79d1 Mon Sep 17 00:00:00 2001 From: Mika Kuns Date: Fri, 19 Jun 2026 09:31:53 +0200 Subject: [PATCH] feat(ui): move review feedback to the Output tab + review/worktree polish - Feedback box + a new "Resume session" button move from the Git tab to the Output tab; the Git review block keeps Approve & Merge / Park / Cancel / Reset. - Add a "Parked" chip for Idle tasks that still hold an Active worktree. - Stop showing the "Session was Cancelled" band on cancel (failed-only now). - Fix the Worktrees-overview state-chip contrast (dark text on the colour). --- src/ClaudeDo.Localization/locales/de.json | 2 +- src/ClaudeDo.Localization/locales/en.json | 2 +- src/ClaudeDo.Ui/Design/IslandStyles.axaml | 9 +++++ .../Islands/DetailsIslandViewModel.cs | 5 +-- .../ViewModels/Islands/TaskRowViewModel.cs | 12 +++++- .../Views/Islands/Detail/WorkConsole.axaml | 39 ++++++++++++------- .../Views/Islands/TaskRowView.axaml | 1 + .../Modals/WorktreesOverviewModalView.axaml | 2 +- 8 files changed, 50 insertions(+), 22 deletions(-) diff --git a/src/ClaudeDo.Localization/locales/de.json b/src/ClaudeDo.Localization/locales/de.json index 890b383..1ddde29 100644 --- a/src/ClaudeDo.Localization/locales/de.json +++ b/src/ClaudeDo.Localization/locales/de.json @@ -442,7 +442,7 @@ "connection": { "online": "Online", "connecting": "Verbinden…", "offline": "Offline" }, "shell": { "restartingWorker": "Worker wird neu gestartet…" }, "agentStatus": { "idle": "Leerlauf", "queued": "In Warteschlange", "running": "Läuft", "review": "Prüfung", "children": "Wartet auf Verbesserungen", "done": "Fertig", "failed": "Fehlgeschlagen", "cancelled": "Abgebrochen" }, - "taskStatus": { "idle": "Leerlauf", "queued": "In Warteschlange", "running": "Läuft", "waitingForReview": "Wartet auf Prüfung", "waitingForChildren": "Wartet auf Verbesserungen", "done": "Fertig", "failed": "Fehlgeschlagen", "cancelled": "Abgebrochen" }, + "taskStatus": { "idle": "Leerlauf", "queued": "In Warteschlange", "running": "Läuft", "waitingForReview": "Wartet auf Prüfung", "waitingForChildren": "Wartet auf Verbesserungen", "done": "Fertig", "failed": "Fehlgeschlagen", "cancelled": "Abgebrochen", "parked": "Geparkt" }, "planningBadge": { "active": "PLANUNG", "finalized": "GEPLANT" }, "taskRow": { "createdPrefix": "Erstellt {0}", "stepsText": "{0}/{1} Schritte" }, "tasksIsland": { "completedHeader": "ABGESCHLOSSEN", "completedHeaderCount": "ABGESCHLOSSEN · {0}" }, diff --git a/src/ClaudeDo.Localization/locales/en.json b/src/ClaudeDo.Localization/locales/en.json index db3d761..e3b9d1e 100644 --- a/src/ClaudeDo.Localization/locales/en.json +++ b/src/ClaudeDo.Localization/locales/en.json @@ -442,7 +442,7 @@ "connection": { "online": "Online", "connecting": "Connecting…", "offline": "Offline" }, "shell": { "restartingWorker": "Restarting worker…" }, "agentStatus": { "idle": "Idle", "queued": "Queued", "running": "Running", "review": "Review", "children": "Waiting for Improvements", "done": "Done", "failed": "Failed", "cancelled": "Cancelled" }, - "taskStatus": { "idle": "Idle", "queued": "Queued", "running": "Running", "waitingForReview": "Waiting for Review", "waitingForChildren": "Waiting for Improvements", "done": "Done", "failed": "Failed", "cancelled": "Cancelled" }, + "taskStatus": { "idle": "Idle", "queued": "Queued", "running": "Running", "waitingForReview": "Waiting for Review", "waitingForChildren": "Waiting for Improvements", "done": "Done", "failed": "Failed", "cancelled": "Cancelled", "parked": "Parked" }, "planningBadge": { "active": "PLANNING", "finalized": "PLANNED" }, "taskRow": { "createdPrefix": "Created {0}", "stepsText": "{0}/{1} steps" }, "tasksIsland": { "completedHeader": "COMPLETED", "completedHeaderCount": "COMPLETED · {0}" }, diff --git a/src/ClaudeDo.Ui/Design/IslandStyles.axaml b/src/ClaudeDo.Ui/Design/IslandStyles.axaml index b48ac6c..b2eefb3 100644 --- a/src/ClaudeDo.Ui/Design/IslandStyles.axaml +++ b/src/ClaudeDo.Ui/Design/IslandStyles.axaml @@ -229,6 +229,15 @@ + + + + diff --git a/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs index f322813..d600687 100644 --- a/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs @@ -166,10 +166,9 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase, IDisposable public string DiffAddText => $"+{DiffAdditions}"; public string DiffDelText => $"-{DiffDeletions}"; - public bool ShowRoadblock => IsFailed || IsCancelled; + public bool ShowRoadblock => IsFailed; public string RoadblockMessage => - IsFailed ? "The session ended with an error." : - IsCancelled ? "The session was cancelled." : ""; + IsFailed ? "The session ended with an error." : ""; [ObservableProperty] [NotifyPropertyChangedFor(nameof(ShowSessionOutcome))] diff --git a/src/ClaudeDo.Ui/ViewModels/Islands/TaskRowViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Islands/TaskRowViewModel.cs index e4d7e62..e3c9b9c 100644 --- a/src/ClaudeDo.Ui/ViewModels/Islands/TaskRowViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Islands/TaskRowViewModel.cs @@ -18,6 +18,7 @@ public sealed partial class TaskRowViewModel : ViewModelBase [ObservableProperty] private PlanningPhase _planningPhase; [ObservableProperty] private string? _branch; [ObservableProperty] private string? _diffStat; + [ObservableProperty] private ClaudeDo.Data.Models.WorktreeState? _worktreeState; [ObservableProperty] private DateTime? _scheduledFor; [ObservableProperty] private int _diffAdditions; [ObservableProperty] private int _diffDeletions; @@ -76,6 +77,8 @@ public sealed partial class TaskRowViewModel : ViewModelBase public bool IsOverdue => ScheduledFor is { } d && d.Date < DateTime.Today && !Done; public bool IsRunning => Status == TaskStatus.Running; public bool IsWaitingForReview => Status == TaskStatus.WaitingForReview; + // Parked = set aside from review: Idle but still holding its Active worktree (vs a plain Idle task). + public bool IsParked => Status == TaskStatus.Idle && WorktreeState == ClaudeDo.Data.Models.WorktreeState.Active; public bool IsQueued => Status == TaskStatus.Queued && string.IsNullOrEmpty(BlockedByTaskId); public bool IsWaiting => Status == TaskStatus.Queued && !string.IsNullOrEmpty(BlockedByTaskId); public bool CanRemoveFromQueue => IsQueued || HasQueuedSubtasks; @@ -105,7 +108,7 @@ public sealed partial class TaskRowViewModel : ViewModelBase public string DiffDeletionsText => $"−{DiffDeletions}"; public string StepsText => Loc.T("vm.taskRow.stepsText", StepsCompleted, StepsCount); - public string StatusLabel => Status switch + public string StatusLabel => IsParked ? Loc.T("vm.taskStatus.parked") : Status switch { TaskStatus.Idle => Loc.T("vm.taskStatus.idle"), TaskStatus.Queued => Loc.T("vm.taskStatus.queued"), @@ -136,6 +139,7 @@ public sealed partial class TaskRowViewModel : ViewModelBase OnPropertyChanged(nameof(StatusLabel)); OnPropertyChanged(nameof(IsRunning)); OnPropertyChanged(nameof(IsWaitingForReview)); + OnPropertyChanged(nameof(IsParked)); OnPropertyChanged(nameof(IsQueued)); OnPropertyChanged(nameof(IsWaiting)); OnPropertyChanged(nameof(IsDraft)); @@ -210,6 +214,11 @@ public sealed partial class TaskRowViewModel : ViewModelBase } partial void OnBranchChanged(string? value) => OnPropertyChanged(nameof(HasBranch)); + partial void OnWorktreeStateChanged(ClaudeDo.Data.Models.WorktreeState? value) + { + OnPropertyChanged(nameof(IsParked)); + OnPropertyChanged(nameof(StatusLabel)); + } partial void OnDoneChanged(bool value) { OnPropertyChanged(nameof(IsOverdue)); @@ -252,6 +261,7 @@ public sealed partial class TaskRowViewModel : ViewModelBase PlanningPhase = t.PlanningPhase; Branch = t.Worktree?.BranchName; DiffStat = t.Worktree?.DiffStat; + WorktreeState = t.Worktree?.State; ScheduledFor = t.ScheduledFor; DiffAdditions = add; DiffDeletions = del; diff --git a/src/ClaudeDo.Ui/Views/Islands/Detail/WorkConsole.axaml b/src/ClaudeDo.Ui/Views/Islands/Detail/WorkConsole.axaml index 1674575..f1b1bc8 100644 --- a/src/ClaudeDo.Ui/Views/Islands/Detail/WorkConsole.axaml +++ b/src/ClaudeDo.Ui/Views/Islands/Detail/WorkConsole.axaml @@ -212,6 +212,28 @@ + + + + +