UI 마감 튜닝: 권한 팝업 가독성·컴포저 밀도·점검 체크리스트 반영
Some checks failed
Release Gate / gate (push) Has been cancelled
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:
@@ -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 |
|
||||
|
||||
@@ -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).
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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건 통과
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user