52 lines
2.8 KiB
Markdown
52 lines
2.8 KiB
Markdown
# ClaudeDo.Ui
|
|
|
|
Avalonia UI layer: views, viewmodels, converters, and the SignalR client.
|
|
|
|
## Pattern
|
|
|
|
MVVM with CommunityToolkit.Mvvm source generators:
|
|
- `[ObservableProperty]` for bindable properties
|
|
- `[RelayCommand]` for commands (supports async and CanExecute)
|
|
- All ViewModels inherit `ViewModelBase` (extends `ObservableObject`)
|
|
|
|
## Views
|
|
|
|
- **MainWindow** — 3-column DockPanel layout (lists | tasks | detail) with GridSplitter, status bar at bottom
|
|
- **TaskListView** — ListBox of tasks with add/edit/delete toolbar
|
|
- **TaskDetailView** — Task info, live log output, worktree section (merge/keep/discard)
|
|
- **TaskEditorView** — Modal dialog for task create/edit
|
|
- **ListEditorView** — Modal dialog for list create/edit
|
|
- **StatusBarView** — Connection status indicator, active task display
|
|
- **ListSettingsModalView** — edits list name, working dir, default commit type, and per-list Model/SystemPrompt/AgentPath. Opened via context menu or gear button on a list row.
|
|
- **DetailsIslandView** — contains an "Agent settings (overrides)" expander with per-task Model/SystemPrompt/AgentPath, showing inherited effective values. Disabled while task is running.
|
|
|
|
All views use compiled bindings (`x:DataType`).
|
|
|
|
## ViewModels
|
|
|
|
- **MainWindowViewModel** — root coordinator; manages list collection, selected list, dialog creation via `Func<T>` factories
|
|
- **TaskListViewModel** — manages task collection for selected list; handles CRUD, "Run Now"
|
|
- **TaskDetailViewModel** — displays task details, streams live log, controls worktree operations
|
|
- **TaskItemViewModel** / **ListItemViewModel** — lightweight display VMs
|
|
- **TaskEditorViewModel** / **ListEditorViewModel** — dialog VMs with validation
|
|
- **StatusBarViewModel** — connection state and active tasks
|
|
|
|
## Services
|
|
|
|
- **WorkerClient** — SignalR client connecting to `http://127.0.0.1:47821/hub`. Auto-reconnect with exponential backoff. Methods: StartAsync, RunNowAsync, CancelTaskAsync, WakeQueueAsync, ContinueTaskAsync, ResetTaskAsync, GetAgentsAsync, UpdateAppSettingsAsync, UpdateListAsync, UpdateListConfigAsync, GetListConfigAsync, UpdateTaskAgentSettingsAsync. Events: TaskStarted, TaskFinished, TaskMessage, TaskUpdated, WorktreeUpdated, ListUpdated
|
|
|
|
## Converters
|
|
|
|
- **StatusColorConverter** — task status string -> color (Queued=Blue, Running=Orange, Done=Green, Failed=Red, Manual=Gray)
|
|
- **ConnectionColorConverter** — connection state -> color (Online=Green, Offline=Red)
|
|
|
|
## Dialog Pattern
|
|
|
|
Editor dialogs use `TaskCompletionSource<bool>` — the dialog sets the result on save/cancel, and the caller awaits the TCS.
|
|
|
|
## Notes
|
|
|
|
- Context menus are on both list items and task items
|
|
- Right-click selects the item before showing the context menu
|
|
- "Run Now" CanExecute re-evaluates when worker connection state changes
|