diff --git a/README.md b/README.md index b5f3506..74ae336 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,13 @@ # AX Commander +- 업데이트: 2026-04-15 21:00 (KST) +- AX Agent 좌측 대화 목록의 선택 표시를 카드형으로 다시 다듬었습니다. `src/AxCopilot/Views/ChatWindow.xaml`의 `ConversationItemTemplate`가 선택된 항목에 `ItemSelectedBackground` 기반의 둥근 직사각형 배경을 채우도록 바뀌어, 제목만 굵어지는 대신 항목 전체가 현재 테마에 맞춰 강조됩니다. +- 같은 템플릿에 idle 심볼도 추가했습니다. 실행 중(`IsRunning`)이나 미확인 완료 점(`HasUnreadCompletion`)이 없는 대화는 좌측에 점선 링 형태의 기본 심볼을 보여주고, 실행 중이면 기존 러닝 링으로, 아직 열어보지 않은 완료 대화면 완료 점으로 자연스럽게 바뀝니다. +- `src/AxCopilot/ViewModels/ChatWindowViewModel.cs`에 `ShowIdleIndicator` 계산 속성을 추가했고, `src/AxCopilot.Tests/ViewModels/ConversationItemViewModelTests.cs`로 idle/running/completion 상태에 따른 표시 규칙 회귀 테스트를 보강했습니다. +- 검증: + - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_conversation_list_selected_card\\ -p:IntermediateOutputPath=obj\\verify_conversation_list_selected_card\\` 경고 0 / 오류 0 + - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ConversationItemViewModelTests" -p:OutputPath=bin\\verify_conversation_list_selected_card_tests\\ -p:IntermediateOutputPath=obj\\verify_conversation_list_selected_card_tests\\` 통과 3 + - 업데이트: 2026-04-15 20:55 (KST) - Code 탭 리뷰 로그 기준으로 비 Git 작업 폴더 회복 흐름을 보강했습니다. `src/AxCopilot/Services/Agent/AgentLoopService.cs`, `src/AxCopilot/Services/Agent/TaskTypePolicy.cs`가 `git_tool(diff)`만 고집하지 않고 `code_review(file_review)` 또는 직접 파일 검토 경로를 함께 안내하도록 바뀌어, `현재 작업 폴더는 Git 저장소가 아닙니다`와 `Git을 찾을 수 없습니다` 이후 같은 Git 계열 도구를 반복 호출하던 흐름을 줄였습니다. - `src/AxCopilot/Services/Agent/CodeReviewTool.cs`는 `diff_review` 전에 실제 Git 저장소 루트를 확인하고, 저장소가 아니거나 Git 실행이 불가능하면 바로 `file_review` 대안을 반환하도록 보강했습니다. Git 탐지도 `where.exe` 기반으로 맞춰 `git_tool`과 `code_review` 사이 탐지 불일치를 줄였습니다. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 6a39279..61d0c01 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -1563,3 +1563,10 @@ UI ?遺우쁽????域뱀뮆???귐뗫솯?醫딆춦 ???袁る퓮 ?臾믩씜 ??疫 - 테스트: `src/AxCopilot.Tests/Services/AgentLoopCodeQualityTests.cs`, `src/AxCopilot.Tests/Services/OperationModeReadinessTests.cs` - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_review_policy_fix\\ -p:IntermediateOutputPath=obj\\verify_review_policy_fix\\` 경고 0 / 오류 0 - 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentLoopCodeQualityTests|OperationModeReadinessTests" -p:OutputPath=bin\\verify_review_policy_fix_tests\\ -p:IntermediateOutputPath=obj\\verify_review_policy_fix_tests\\` 통과 133 + +업데이트: 2026-04-15 21:00 (KST) +- AX Agent 좌측 대화 목록의 선택 스타일을 카드형 강조로 조정했습니다. `src/AxCopilot/Views/ChatWindow.xaml`의 `ConversationItemTemplate`가 선택된 항목에 `ItemSelectedBackground`를 채우는 둥근 직사각형 배경을 적용해, 제목만 굵어지는 대신 항목 전체가 현재 테마에서 더 분명하게 선택 상태를 보여줍니다. +- 같은 목록 템플릿에 idle 심볼도 추가했습니다. `src/AxCopilot/ViewModels/ChatWindowViewModel.cs`의 `ConversationItemViewModel.ShowIdleIndicator`가 실행 중/미확인 완료가 아닌 항목을 판정하고, 목록에서는 점선 링 심볼을 기본으로 보여주다가 실행 중이면 러닝 링, 아직 열어보지 않은 완료 대화면 완료 점으로 치환합니다. +- `src/AxCopilot.Tests/ViewModels/ConversationItemViewModelTests.cs`에 idle/running/completion 상태별 아이콘 계산 회귀 테스트를 추가했습니다. +- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_conversation_list_selected_card\\ -p:IntermediateOutputPath=obj\\verify_conversation_list_selected_card\\` 경고 0 / 오류 0 +- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ConversationItemViewModelTests" -p:OutputPath=bin\\verify_conversation_list_selected_card_tests\\ -p:IntermediateOutputPath=obj\\verify_conversation_list_selected_card_tests\\` 통과 3 diff --git a/src/AxCopilot.Tests/ViewModels/ConversationItemViewModelTests.cs b/src/AxCopilot.Tests/ViewModels/ConversationItemViewModelTests.cs new file mode 100644 index 0000000..83e3b37 --- /dev/null +++ b/src/AxCopilot.Tests/ViewModels/ConversationItemViewModelTests.cs @@ -0,0 +1,43 @@ +using AxCopilot.ViewModels; +using FluentAssertions; +using Xunit; + +namespace AxCopilot.Tests.ViewModels; + +public class ConversationItemViewModelTests +{ + [Fact] + public void ShowIdleIndicator_IsTrue_WhenConversationIsIdle() + { + var viewModel = new ConversationItemViewModel + { + HasUnreadCompletion = false, + }; + + viewModel.ShowIdleIndicator.Should().BeTrue(); + } + + [Fact] + public void ShowIdleIndicator_IsFalse_WhenConversationIsRunning() + { + var viewModel = new ConversationItemViewModel + { + HasUnreadCompletion = false, + }; + + viewModel.IsRunning = true; + + viewModel.ShowIdleIndicator.Should().BeFalse(); + } + + [Fact] + public void ShowIdleIndicator_IsFalse_WhenUnreadCompletionMarkerIsVisible() + { + var viewModel = new ConversationItemViewModel + { + HasUnreadCompletion = true, + }; + + viewModel.ShowIdleIndicator.Should().BeFalse(); + } +} diff --git a/src/AxCopilot/ViewModels/ChatWindowViewModel.cs b/src/AxCopilot/ViewModels/ChatWindowViewModel.cs index a61dace..934e4f5 100644 --- a/src/AxCopilot/ViewModels/ChatWindowViewModel.cs +++ b/src/AxCopilot/ViewModels/ChatWindowViewModel.cs @@ -247,7 +247,11 @@ public class ConversationItemViewModel : ViewModelBase public bool IsRunning { get => _isRunning; - set => SetProperty(ref _isRunning, value); + set + { + if (SetProperty(ref _isRunning, value)) + OnPropertyChanged(nameof(ShowIdleIndicator)); + } } public string Category { get; init; } = "general"; @@ -274,4 +278,5 @@ public class ConversationItemViewModel : ViewModelBase : AgentRunCount > 0 ? $"실행 {AgentRunCount}" : ""; public bool HasRunStatus => AgentRunCount > 0 || FailedAgentRunCount > 0; public bool HasFailed => FailedAgentRunCount > 0; + public bool ShowIdleIndicator => !IsRunning && !HasUnreadCompletion; } diff --git a/src/AxCopilot/Views/ChatWindow.xaml b/src/AxCopilot/Views/ChatWindow.xaml index 45dbfae..56b15e6 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml +++ b/src/AxCopilot/Views/ChatWindow.xaml @@ -163,8 +163,8 @@ - - + + @@ -193,20 +193,28 @@ - + + @@ -242,6 +250,9 @@ + + +