fix(ui): failureReason "usage_limit" nachziehen + Worktree-Gate prüft die Platte

Zwei liegengebliebene Consumer aus den letzten beiden Commits:

- TaskRunner klassifiziert seit 07dd7570 "usage_limit", aber weder
  TaskRowViewModel.FailureReasonLabel noch vm.failureReason (de/en) noch
  die get_task-Tool-Beschreibung kannten den Wert — die UI zeigte
  "Grund unbekannt", das MCP-Doc listete weiterhin max_turns|timeout|error.
- TaskRowViewModel.CanOpenWorktree prüfte nur auf einen nicht-leeren
  String. Die Zeile behält den Path eines gemergten/verworfenen Worktrees,
  also war der Menüpunkt aktiv und Process.Start warf in den Footer.
  Jetzt zusätzlich Directory.Exists — dieselbe Prüfung, die
  WorktreesOverviewModalViewModel und MergeSectionViewModel schon machen.
This commit is contained in:
mika kuns
2026-08-24 09:05:31 +02:00
parent 3dfae30fff
commit 29171b104b
5 changed files with 37 additions and 15 deletions
@@ -65,13 +65,19 @@ public class TaskRowViewModelTests
}
[Fact]
public void CanOpenWorktree_True_And_ReasonNull_When_Path_Present()
public void CanOpenWorktree_True_And_ReasonNull_When_Folder_Exists()
{
var vm = new TaskRowViewModel { Id = "t" };
vm.WorktreePath = @"C:\repo\worktrees\t";
var dir = Path.Combine(Path.GetTempPath(), $"cd_wt_{Guid.NewGuid():N}");
Directory.CreateDirectory(dir);
try
{
var vm = new TaskRowViewModel { Id = "t" };
vm.WorktreePath = dir;
Assert.True(vm.CanOpenWorktree);
Assert.Null(vm.OpenWorktreeDisabledReason);
Assert.True(vm.CanOpenWorktree);
Assert.Null(vm.OpenWorktreeDisabledReason);
}
finally { Directory.Delete(dir, true); }
}
[Theory]
@@ -87,6 +93,18 @@ public class TaskRowViewModelTests
Assert.NotNull(vm.OpenWorktreeDisabledReason);
}
// A merged/discarded worktree leaves its recorded Path on the row long after the folder is
// gone — the menu entry has to gray out, not throw inside Process.Start.
[Fact]
public void CanOpenWorktree_False_When_Recorded_Folder_Is_Gone()
{
var vm = new TaskRowViewModel { Id = "t" };
vm.WorktreePath = Path.Combine(Path.GetTempPath(), $"cd_wt_gone_{Guid.NewGuid():N}");
Assert.False(vm.CanOpenWorktree);
Assert.NotNull(vm.OpenWorktreeDisabledReason);
}
[Fact]
public void OpenWorktreeGate_Raises_PropertyChanged_On_WorktreePath_Change()
{
@@ -115,7 +133,6 @@ public class TaskRowViewModelTests
var vm = TaskRowViewModel.FromEntity(entity);
Assert.Equal(@"C:\repo\worktrees\t", vm.WorktreePath);
Assert.True(vm.CanOpenWorktree);
}
[Fact]