From f8be2c178bd989ee2af1f026f5aa4863865b836f Mon Sep 17 00:00:00 2001 From: Mika Kuns Date: Tue, 14 Apr 2026 16:39:50 +0200 Subject: [PATCH] feat(ui): add config override fields to TaskEditorView Adds Model, SystemPrompt, and AgentPath override fields to TaskEditorViewModel and TaskEditorView. Wires agent loading from WorkerClient in TaskListViewModel before opening the editor dialog. Co-Authored-By: Claude Sonnet 4.6 --- .../ViewModels/TaskEditorViewModel.cs | 24 ++++++++++++++ .../ViewModels/TaskListViewModel.cs | 2 ++ src/ClaudeDo.Ui/Views/TaskEditorView.axaml | 33 ++++++++++++++++++- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/ClaudeDo.Ui/ViewModels/TaskEditorViewModel.cs b/src/ClaudeDo.Ui/ViewModels/TaskEditorViewModel.cs index 81ee756..7a07f2a 100644 --- a/src/ClaudeDo.Ui/ViewModels/TaskEditorViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/TaskEditorViewModel.cs @@ -1,4 +1,5 @@ using ClaudeDo.Data.Models; +using ClaudeDo.Ui.Services; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using TaskStatus = ClaudeDo.Data.Models.TaskStatus; @@ -13,6 +14,10 @@ public partial class TaskEditorViewModel : ViewModelBase [ObservableProperty] private string _statusChoice = "manual"; [ObservableProperty] private string _tagsInput = ""; [ObservableProperty] private string _windowTitle = "New Task"; + [ObservableProperty] private string _modelChoice = "(list default)"; + [ObservableProperty] private string? _systemPromptOverride; + [ObservableProperty] private AgentInfo? _selectedAgent; + public List AvailableAgents { get; set; } = []; private string? _editId; private string _listId = ""; @@ -21,12 +26,19 @@ public partial class TaskEditorViewModel : ViewModelBase public event Action? RequestClose; + public static string[] ModelChoices { get; } = ["(list default)", "Sonnet", "Opus", "Haiku"]; + public static string[] CommitTypes { get; } = ["chore", "feat", "fix", "refactor", "docs", "test", "perf", "style", "build", "ci"]; public static string[] StatusChoices { get; } = ["manual", "queued"]; + public async Task LoadAgentsAsync(WorkerClient worker) + { + AvailableAgents = await worker.GetAgentsAsync(); + } + public IReadOnlyList SelectedTagNames => TagsInput.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) .Distinct() @@ -56,6 +68,13 @@ public partial class TaskEditorViewModel : ViewModelBase _ => entity.Status.ToString().ToLowerInvariant(), }; TagsInput = string.Join(", ", taskTags.Select(t => t.Name)); + ModelChoice = entity.Model is not null + ? ListEditorViewModel.ModelIdToDisplay(entity.Model) + : "(list default)"; + SystemPromptOverride = entity.SystemPrompt; + SelectedAgent = entity.AgentPath is not null + ? AvailableAgents.FirstOrDefault(a => a.Path == entity.AgentPath) + : null; WindowTitle = $"Edit Task: {entity.Title}"; } @@ -78,6 +97,11 @@ public partial class TaskEditorViewModel : ViewModelBase CommitType = CommitType, CreatedAt = _createdAt, }; + entity.Model = ModelChoice != "(list default)" + ? ListEditorViewModel.ModelDisplayToId(ModelChoice) + : null; + entity.SystemPrompt = string.IsNullOrWhiteSpace(SystemPromptOverride) ? null : SystemPromptOverride.Trim(); + entity.AgentPath = SelectedAgent?.Path; _tcs.TrySetResult(entity); RequestClose?.Invoke(); } diff --git a/src/ClaudeDo.Ui/ViewModels/TaskListViewModel.cs b/src/ClaudeDo.Ui/ViewModels/TaskListViewModel.cs index 1e9fc78..f1bda78 100644 --- a/src/ClaudeDo.Ui/ViewModels/TaskListViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/TaskListViewModel.cs @@ -146,6 +146,7 @@ public partial class TaskListViewModel : ViewModelBase var defaultCommitType = list?.DefaultCommitType ?? "chore"; var editor = _editorFactory(); + await editor.LoadAgentsAsync(_worker); editor.InitForCreate(CurrentListId, defaultCommitType); var window = new TaskEditorView { DataContext = editor }; @@ -191,6 +192,7 @@ public partial class TaskListViewModel : ViewModelBase var taskTags = await _taskRepo.GetTagsAsync(entity.Id); var editor = _editorFactory(); + await editor.LoadAgentsAsync(_worker); editor.InitForEdit(entity, taskTags); var window = new TaskEditorView { DataContext = editor }; diff --git a/src/ClaudeDo.Ui/Views/TaskEditorView.axaml b/src/ClaudeDo.Ui/Views/TaskEditorView.axaml index fc269fd..f38ea79 100644 --- a/src/ClaudeDo.Ui/Views/TaskEditorView.axaml +++ b/src/ClaudeDo.Ui/Views/TaskEditorView.axaml @@ -1,10 +1,11 @@ @@ -34,6 +35,36 @@ + + + + + + + + + + + + + + + + + + + +