UI 마감 튜닝: 권한 팝업 가독성·컴포저 밀도·점검 체크리스트 반영
Some checks failed
Release Gate / gate (push) Has been cancelled

- ChatWindow 권한 팝업의 섹션/행 패딩·폰트·줄간격을 미세 조정해 스캔 속도 개선
- 슬래시 팔레트 하단 안내에 PgUp/PgDn/Home/End 키 이동 정보를 반영
- 좌측 기본 카테고리 라벨을 주제 선택/작업 선택으로 통일
- 입력 상단 컴포저(모델/프리셋/인라인 설정) 간격을 컴팩트하게 재정돈
- docs/UI_UX_CHECKLIST.md에 최신 점검 결과(운영모드 필터 18건, 전체 테스트 436건) 기록
- README.md, docs/DEVELOPMENT.md 이력 및 업데이트 시각(2026-04-04 12:33 KST) 갱신
- 빌드 복구 메모: WPF 임시 생성물 꼬임 발생 시 obj/bin 정리 후 정상 재생성 확인
This commit is contained in:
2026-04-04 12:34:34 +09:00
parent de70f57277
commit e8e701e4a1
5 changed files with 67 additions and 22 deletions

View File

@@ -222,7 +222,7 @@ public class MyHandler : IActionHandler
### v0.7.3 — AX Agent 권한 코어 재구성 + 입력 계층 정리
업데이트: 2026-04-04 12:22 (KST)
업데이트: 2026-04-04 12:33 (KST)
| 분류 | 내용 |
|------|------|
@@ -267,6 +267,9 @@ public class MyHandler : IActionHandler
| 권한 모드 표면 통일 | 권한 표시 명칭을 `활용하지 않음/소극 활용/적극 활용/계획 중심/완전 자동/질문 없이 진행`으로 통일하고 팝업 선택 순서를 동일 체계로 재정렬 |
| 권한 기본 동작/순환 보강 | Chat 탭 기본 권한을 `활용하지 않음`으로 적용하고, `/sandbox-toggle` 및 AX Agent 설정 권한 순환을 같은 순서(`활용하지 않음→소극→적극→계획→완전 자동→질문 없이 진행`)로 맞춤 |
| 운영 모드 회귀 점검 강화 | `OperationModePolicyTests`, `OperationModeReadinessTests`, `LlmOperationModeTests` 필터 테스트(18건)를 통과해 internal/external 차단·허용 경로를 재검증 |
| 권한 팝업 밀도 재정돈 | 권한 섹션 헤더/카드/행의 패딩·폰트·줄간격을 조정해 과밀 영역을 완화하고 Codex/Claude형 스캔 속도에 맞춤 |
| 좌측/컴포저 라벨 정리 | 좌측 기본 카테고리 라벨을 `주제 선택/작업 선택`으로 통일하고, 입력 상단 바 패딩·간격을 미세 조정해 단일 라인 정돈 강화 |
| 체크리스트 실행 결과 기록 | `docs/UI_UX_CHECKLIST.md`에 2026-04-04 12:22 기준 점검 결과(운영모드 필터 18건 + 전체 436건 통과)를 기록 |
| Slash palette 상태 분리 시작 | `ChatWindow`에 몰려 있던 slash 상태를 `SlashPaletteState`로 분리해 이후 Codex/Claude형 composer 개편 기반 마련 |
| 런처 이미지 미리보기 추가 | `#` 클립보드 이미지 항목에서 `Shift+Enter`로 전용 미리보기 창을 열고, 줌·원본 해상도 확인·PNG/JPEG/BMP 저장·클립보드 복사를 지원 |
| 검증 | `dotnet build` 경고 0 / 오류 0, `dotnet test` 436 passed / 0 failed |

View File

@@ -3206,6 +3206,39 @@ else:
- `dotnet build src/AxCopilot/AxCopilot.csproj` 통과 (경고 0, 오류 0).
- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj` 통과 (436 passed, 0 failed).
## 2026-04-04 추가 진행 기록 (연속 실행 23차: UI 마감 튜닝 + 체크리스트 실행 기록)
업데이트: 2026-04-04 12:33 (KST)
### 1) 권한 팝업 가독성 마감
- 권한 섹션 헤더/요약 카드/권한 행의 폰트·패딩·줄간격을 조정해 밀도 균형을 개선.
- 권한 설명 문장의 줄바꿈을 정돈해 항목 간 스캔 속도를 개선.
### 2) 좌측 패널/카테고리 라벨 정리
- 탭별 기본 카테고리 라벨을
- Chat: `주제 선택`
- Cowork/Code: `작업 선택`
로 통일해 좌측 목적성을 명확화.
### 3) 컴포저 미세 튜닝
- 입력 컨테이너 패딩, 모델/프리셋 바 상단 간격, 인라인 설정 패널 간격을 조정해 단일 라인 구성을 더 컴팩트하게 정돈.
- `/` 팔레트 하단 안내 문구에 `PgUp/PgDn/Home/End` 키 이동 정보를 반영.
### 4) 체크리스트 및 운영 모드 점검 기록
- `docs/UI_UX_CHECKLIST.md`에 최근 점검 결과 섹션 추가.
- 운영 모드 관련 테스트 필터 18건 통과:
- `OperationModePolicyTests`
- `OperationModeReadinessTests`
- `LlmOperationModeTests`
### 5) 빌드 이슈 대응
- WPF 임시 생성물(`wpftmp`) 꼬임으로 발생한 빌드 실패를 확인.
- `src/AxCopilot/obj`, `src/AxCopilot/bin` 정리 후 재빌드/재테스트로 정상 복구.
### 6) 품질 게이트
- `dotnet build src/AxCopilot/AxCopilot.csproj` 통과 (경고 0, 오류 0).
- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj` 통과 (436 passed, 0 failed).

View File

@@ -45,3 +45,12 @@
- [ ] `dotnet build src/AxCopilot/AxCopilot.csproj` 경고 0 / 오류 0
- [ ] `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj` 전체 통과
## 7. 최근 점검 결과
점검 시각: 2026-04-04 12:22 (KST)
- [x] 권한 모드 표면 명칭/순서 통일 적용 확인
- [x] `/` 팔레트 휠/방향키/PageUp/PageDown/Home/End 동작 경로 반영 확인
- [x] AX Agent 설정 권한 순환 순서와 `/sandbox-toggle` 순환 순서 일치 확인
- [x] 운영 모드 회귀 필터 테스트 18건 통과 (`OperationModePolicy/Readiness/LlmOperationMode`)
- [x] 전체 테스트 436건 통과

View File

@@ -1079,7 +1079,7 @@
<!-- 실제 입력 영역 -->
<Border x:Name="InputBorder"
Background="{DynamicResource ItemBackground}"
CornerRadius="24" Padding="8"
CornerRadius="24" Padding="7"
BorderBrush="{DynamicResource BorderColor}" BorderThickness="1">
<Border.Effect>
<DropShadowEffect BlurRadius="18" ShadowDepth="0" Opacity="0.08"/>
@@ -1093,7 +1093,7 @@
</Grid.RowDefinitions>
<!-- Row 0: 모델 셀렉터 + 템플릿 버튼 -->
<Grid Grid.Row="0" Margin="6,2,6,2">
<Grid Grid.Row="0" Margin="6,1,6,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
@@ -1149,8 +1149,8 @@
<!-- Row 1: 통합 설정 패널 -->
<Border x:Name="InlineSettingsPanel"
Grid.Row="1"
Margin="8,4,8,4"
Padding="10,10,10,8"
Margin="8,3,8,4"
Padding="10,9,10,8"
CornerRadius="12"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"

View File

@@ -676,7 +676,7 @@ public partial class ChatWindow : Window
{
if (string.IsNullOrEmpty(_selectedCategory))
{
CategoryLabel.Text = _activeTab switch { "Cowork" or "Code" => "모든 작업", _ => "모든 주제" };
CategoryLabel.Text = _activeTab switch { "Cowork" or "Code" => "작업 선택", _ => "주제 선택" };
CategoryIcon.Text = "\uE8BD";
}
else if (_selectedCategory == "__custom__")
@@ -1636,7 +1636,7 @@ public partial class ChatWindow : Window
var titleBlock = new TextBlock
{
Text = title,
FontSize = 10.5,
FontSize = 10,
FontWeight = FontWeights.SemiBold,
Foreground = primaryText,
VerticalAlignment = VerticalAlignment.Center,
@@ -1650,7 +1650,7 @@ public partial class ChatWindow : Window
{
Background = Brushes.Transparent,
CornerRadius = new CornerRadius(6),
Padding = new Thickness(8, 6, 8, 6),
Padding = new Thickness(8, 5, 8, 5),
Cursor = Cursors.Hand,
Focusable = true,
Child = headerGrid,
@@ -1708,12 +1708,12 @@ public partial class ChatWindow : Window
: BrushFromHex("#C7D2FE"),
BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(8),
Padding = new Thickness(12, 10, 12, 10),
Margin = new Thickness(0, 0, 0, 6),
Child = new StackPanel
{
Children =
Padding = new Thickness(11, 9, 11, 9),
Margin = new Thickness(0, 0, 0, 6),
Child = new StackPanel
{
Children =
{
new TextBlock
{
Text = $"현재 권한 모드 · {PermissionModeCatalog.ToDisplayLabel(summary.EffectiveMode)}",
@@ -1728,7 +1728,7 @@ public partial class ChatWindow : Window
new TextBlock
{
Text = $"{summary.Description} 기본값 {PermissionModeCatalog.ToDisplayLabel(summary.DefaultMode)} · 예외 {summary.OverrideCount}개",
FontSize = 10.5,
FontSize = 10,
Margin = new Thickness(0, 4, 0, 0),
Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray,
TextWrapping = TextWrapping.Wrap,
@@ -1919,8 +1919,8 @@ public partial class ChatWindow : Window
BorderBrush = isActive ? BrushFromHex("#C7D2FE") : Brushes.Transparent,
BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(8),
Padding = new Thickness(10, 7, 10, 7),
Margin = new Thickness(0, 1, 0, 1),
Padding = new Thickness(10, 6, 10, 6),
Margin = new Thickness(0, 2, 0, 2),
Cursor = Cursors.Hand,
Focusable = true,
};
@@ -1945,18 +1945,18 @@ public partial class ChatWindow : Window
textStack.Children.Add(new TextBlock
{
Text = title,
FontSize = 12,
FontSize = 11.5,
FontWeight = FontWeights.SemiBold,
Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.White,
});
textStack.Children.Add(new TextBlock
{
Text = desc,
FontSize = 10.5,
FontSize = 10,
Margin = new Thickness(0, 2, 0, 0),
Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray,
TextWrapping = TextWrapping.Wrap,
LineHeight = 14.5,
LineHeight = 14,
MaxWidth = 230,
});
Grid.SetColumn(textStack, 1);
@@ -5400,8 +5400,8 @@ public partial class ChatWindow : Window
BorderBrush = isSelected ? accent : borderBrush,
BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(10),
Padding = new Thickness(10, 8, 10, 8),
Margin = new Thickness(0, 0, 0, 6),
Padding = new Thickness(10, 7, 10, 7),
Margin = new Thickness(0, 0, 0, 4),
Cursor = skillAvailable ? Cursors.Hand : Cursors.Arrow,
Opacity = skillAvailable ? 1.0 : 0.5,
};
@@ -5566,7 +5566,7 @@ public partial class ChatWindow : Window
}
else
{
SlashPopupFooter.Text = $"Enter 실행 · ↑↓ 이동 · 휠 스크롤 · Esc 닫기 · 표시 {visibleCommandCount + visibleSkillCount}/{total}";
SlashPopupFooter.Text = $"Enter 실행 · ↑↓/PgUp/PgDn 이동 · Home/End · Esc 닫기 · 표시 {visibleCommandCount + visibleSkillCount}/{total}";
}
EnsureSlashSelectionVisible();