feat(claude-do): Quick-Claude-Button in der Kopfleiste der Tasks-Insel: oeffn
## Ziel Ein kleines Icon in der Kopfleiste der Tasks-Insel, das fuer die gerade ausgewaehlte Liste **sofort** eine interaktive ConPTY-Claude-Session im Arbeitsverzeichnis dieser Liste oeffnet — ohne Task, ohne Dialog, ohne Ordnerauswahl. ## Ausgangslage (verifiziert 2026-08-05) Der komplette Unterbau existiert schon; das ist im Kern Verdrahtung: - `MissionControlViewModel.OpenAdHocConPtySessio ClaudeDo-Task: 5d8e6246af9444afa500fbb4546873e7
This commit is contained in:
@@ -130,6 +130,7 @@
|
|||||||
"tasks": {
|
"tasks": {
|
||||||
"showCompletedTip": "Abgeschlossene anzeigen",
|
"showCompletedTip": "Abgeschlossene anzeigen",
|
||||||
"letClaudeTip": "Claude machen lassen",
|
"letClaudeTip": "Claude machen lassen",
|
||||||
|
"quickClaudeTip": "Schnelle Claude-Sitzung",
|
||||||
"listSettingsTip": "Listeneinstellungen",
|
"listSettingsTip": "Listeneinstellungen",
|
||||||
"addPlaceholder": "Aufgabe hinzufügen…",
|
"addPlaceholder": "Aufgabe hinzufügen…",
|
||||||
"enterKey": "ENTER",
|
"enterKey": "ENTER",
|
||||||
|
|||||||
@@ -130,6 +130,7 @@
|
|||||||
"tasks": {
|
"tasks": {
|
||||||
"showCompletedTip": "Show completed",
|
"showCompletedTip": "Show completed",
|
||||||
"letClaudeTip": "Let Claude handle it",
|
"letClaudeTip": "Let Claude handle it",
|
||||||
|
"quickClaudeTip": "Quick Claude session",
|
||||||
"listSettingsTip": "List settings",
|
"listSettingsTip": "List settings",
|
||||||
"addPlaceholder": "Add a task…",
|
"addPlaceholder": "Add a task…",
|
||||||
"enterKey": "ENTER",
|
"enterKey": "ENTER",
|
||||||
|
|||||||
@@ -73,12 +73,25 @@ public sealed partial class TasksIslandViewModel : ViewModelBase, IDisposable
|
|||||||
[ObservableProperty] private bool _showNotesRow;
|
[ObservableProperty] private bool _showNotesRow;
|
||||||
[ObservableProperty] private bool _isMyDayList;
|
[ObservableProperty] private bool _isMyDayList;
|
||||||
[ObservableProperty] private bool _isLetClaudeVisible;
|
[ObservableProperty] private bool _isLetClaudeVisible;
|
||||||
|
[ObservableProperty] private bool _isQuickClaudeVisible;
|
||||||
|
|
||||||
public event EventHandler? LetClaudeHandleRequested;
|
public event EventHandler? LetClaudeHandleRequested;
|
||||||
|
|
||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
private void LetClaudeHandle() => LetClaudeHandleRequested?.Invoke(this, EventArgs.Empty);
|
private void LetClaudeHandle() => LetClaudeHandleRequested?.Invoke(this, EventArgs.Empty);
|
||||||
|
|
||||||
|
// Opens a task-less ConPTY session directly in the current list's working dir. The shell owns
|
||||||
|
// Mission Control, so this just raises an event for it to act on (mirrors OpenConPtySessionRequested).
|
||||||
|
public event Action<string>? OpenQuickClaudeSessionRequested;
|
||||||
|
|
||||||
|
[RelayCommand]
|
||||||
|
private void OpenQuickClaudeSession()
|
||||||
|
{
|
||||||
|
var dir = _currentList?.WorkingDir;
|
||||||
|
if (string.IsNullOrWhiteSpace(dir) || !System.IO.Directory.Exists(dir)) return;
|
||||||
|
OpenQuickClaudeSessionRequested?.Invoke(dir);
|
||||||
|
}
|
||||||
|
|
||||||
internal Task? LoadTask { get; private set; }
|
internal Task? LoadTask { get; private set; }
|
||||||
|
|
||||||
public Func<UnfinishedPlanningModalViewModel, Task>? ShowUnfinishedPlanningModal { get; set; }
|
public Func<UnfinishedPlanningModalViewModel, Task>? ShowUnfinishedPlanningModal { get; set; }
|
||||||
@@ -221,7 +234,10 @@ public sealed partial class TasksIslandViewModel : ViewModelBase, IDisposable
|
|||||||
if (e.PropertyName == nameof(ListNavItemViewModel.Name))
|
if (e.PropertyName == nameof(ListNavItemViewModel.Name))
|
||||||
HeaderTitle = vm.Name;
|
HeaderTitle = vm.Name;
|
||||||
else if (e.PropertyName == nameof(ListNavItemViewModel.WorkingDir))
|
else if (e.PropertyName == nameof(ListNavItemViewModel.WorkingDir))
|
||||||
|
{
|
||||||
IsLetClaudeVisible = vm.Kind == ListKind.User && !string.IsNullOrWhiteSpace(vm.WorkingDir);
|
IsLetClaudeVisible = vm.Kind == ListKind.User && !string.IsNullOrWhiteSpace(vm.WorkingDir);
|
||||||
|
IsQuickClaudeVisible = IsLetClaudeVisible;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadForList(ListNavItemViewModel? list)
|
public void LoadForList(ListNavItemViewModel? list)
|
||||||
@@ -259,13 +275,14 @@ public sealed partial class TasksIslandViewModel : ViewModelBase, IDisposable
|
|||||||
ShowOpenLabel = false;
|
ShowOpenLabel = false;
|
||||||
ShowNotesRow = false;
|
ShowNotesRow = false;
|
||||||
if (listChanged) SelectedTask = null;
|
if (listChanged) SelectedTask = null;
|
||||||
if (list is null) { IsLetClaudeVisible = false; LoadTask = Task.CompletedTask; return; }
|
if (list is null) { IsLetClaudeVisible = false; IsQuickClaudeVisible = false; LoadTask = Task.CompletedTask; return; }
|
||||||
|
|
||||||
HeaderTitle = list.Name;
|
HeaderTitle = list.Name;
|
||||||
HeaderEyebrow = DateTime.Now.ToString("dddd · MMM dd", CultureInfo.InvariantCulture).ToUpperInvariant();
|
HeaderEyebrow = DateTime.Now.ToString("dddd · MMM dd", CultureInfo.InvariantCulture).ToUpperInvariant();
|
||||||
ShowNotesRow = list.Id == "smart:my-day";
|
ShowNotesRow = list.Id == "smart:my-day";
|
||||||
IsMyDayList = list.Id == "smart:my-day";
|
IsMyDayList = list.Id == "smart:my-day";
|
||||||
IsLetClaudeVisible = list.Kind == ListKind.User && !string.IsNullOrWhiteSpace(list.WorkingDir);
|
IsLetClaudeVisible = list.Kind == ListKind.User && !string.IsNullOrWhiteSpace(list.WorkingDir);
|
||||||
|
IsQuickClaudeVisible = IsLetClaudeVisible;
|
||||||
|
|
||||||
LoadTask = LoadForListAsync(list, ct, reusable);
|
LoadTask = LoadForListAsync(list, ct, reusable);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -242,6 +242,11 @@ public sealed partial class IslandsShellViewModel : ViewModelBase, IDisposable
|
|||||||
OpenMissionControl();
|
OpenMissionControl();
|
||||||
_ = MissionControl.OpenConPtySessionAsync(taskId);
|
_ = MissionControl.OpenConPtySessionAsync(taskId);
|
||||||
};
|
};
|
||||||
|
Tasks.OpenQuickClaudeSessionRequested += dir =>
|
||||||
|
{
|
||||||
|
OpenMissionControl();
|
||||||
|
_ = MissionControl.OpenAdHocConPtySessionAsync(dir);
|
||||||
|
};
|
||||||
Tasks.OpenPlanningConPtyRequested += (taskId, resume) =>
|
Tasks.OpenPlanningConPtyRequested += (taskId, resume) =>
|
||||||
{
|
{
|
||||||
OpenMissionControl();
|
OpenMissionControl();
|
||||||
|
|||||||
@@ -37,6 +37,10 @@
|
|||||||
Command="{Binding LetClaudeHandleCommand}" ToolTip.Tip="{loc:Tr tasks.letClaudeTip}">
|
Command="{Binding LetClaudeHandleCommand}" ToolTip.Tip="{loc:Tr tasks.letClaudeTip}">
|
||||||
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Broom}"/>
|
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Broom}"/>
|
||||||
</Button>
|
</Button>
|
||||||
|
<Button Classes="icon-btn" IsVisible="{Binding IsQuickClaudeVisible}"
|
||||||
|
Command="{Binding OpenQuickClaudeSessionCommand}" ToolTip.Tip="{loc:Tr tasks.quickClaudeTip}">
|
||||||
|
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Plus}"/>
|
||||||
|
</Button>
|
||||||
<Button Classes="icon-btn" IsVisible="{Binding IsMyDayList}"
|
<Button Classes="icon-btn" IsVisible="{Binding IsMyDayList}"
|
||||||
Command="{Binding ClearDayCommand}" ToolTip.Tip="{loc:Tr tasks.clearDayTip}">
|
Command="{Binding ClearDayCommand}" ToolTip.Tip="{loc:Tr tasks.clearDayTip}">
|
||||||
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Broom}"/>
|
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Broom}"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user