diff --git a/README.md b/README.md index 935ce6c..6393f62 100644 --- a/README.md +++ b/README.md @@ -788,8 +788,10 @@ ow + toggle 시각 언어로 통일했습니다. - 대화 목록 행 카드와 축소 아이콘 바도 같은 시각 언어로 더 정리했습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `AddConversationItem(...)`에서 선택 강조 배경과 좌측 액센트 바 두께를 더 얇게 줄이고, 행 패딩/아이콘/폰트/배지 크기를 전반적으로 낮춰 `claw-code`처럼 목록 자체가 먼저 튀지 않도록 정리했습니다. - `진행 중`, `성공`, `실패` 배지와 실행 요약 텍스트도 더 작고 중립적인 톤으로 줄였고, 호버 시 확대 애니메이션은 제거해 목록이 더 차분하게 반응하도록 맞췄습니다. 편집 버튼도 더 작은 규격과 낮은 opacity를 써서 필요할 때만 보조 액션으로 보이게 조정했습니다. - [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml)의 축소 아이콘 바는 상하 행 높이, 버튼 패딩, 아이콘 크기, 사용자 배지 크기를 한 단계 더 줄여 현재 사이드바와 같은 밀도로 묶었습니다. 이제 축소 상태에서도 검색/필터/새 대화 아이콘이 더 균일한 간격으로 정리되고, 하단 사용자 배지도 과하게 튀지 않는 중립형으로 유지됩니다. +- AX Agent 내부 설정 탭도 다시 정리했습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml), [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서 사라졌던 `테마 스타일`, `테마 모드`를 `공통` 탭에 실제 선택 카드로 복구했고, 기존 `스킬/차단` 탭은 `도구 / 스킬 / 차단`으로 나눠 각 항목이 맞는 탭에서만 보이게 재배치했습니다. +- 이제 `도구` 탭에서는 훅과 도구/커넥터 목록을, `스킬` 탭에서는 스킬 폴더, 슬래시 설정, 드래그 앤 드롭, 로드된 스킬, 폴백 모델, MCP 서버를, `차단` 탭에서는 차단 경로/확장자만 관리합니다. 같이 [SettingsWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml.cs) 에서 메인 설정의 `AX Agent` 바로가기 탭을 좌측 사이드바 맨 아래로 재배치했습니다. - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0 -- 업데이트: 2026-04-05 14:57 (KST) +- 업데이트: 2026-04-05 15:06 (KST) --- diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index d6341fb..be94289 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4555,3 +4555,8 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml)의 축소 아이콘 바는 상하 row 높이와 버튼 규격, 아이콘 크기, 사용자 배지 크기를 함께 줄여 현재 사이드바 헤더/하단 계정 영역과 같은 밀도로 묶었습니다. - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0 - 업데이트: 2026-04-05 14:57 (KST) +- AX Agent 내부 설정 탭 구조도 다시 나눴습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 의 좌측 네비에서 기존 `스킬/차단`을 `도구 / 스킬 / 차단`으로 분리했고, [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `SetOverlaySection(...)` 가시성 로직도 각 탭에 맞는 패널만 보이도록 재구성했습니다. +- `공통` 탭에는 숨겨져 있던 `테마 스타일`, `테마 모드`를 실제 선택 카드로 복구했고, `도구` 탭에는 훅/도구 커넥터 목록, `스킬` 탭에는 스킬 폴더/슬래시/로드된 스킬/폴백 모델/MCP 서버, `차단` 탭에는 차단 경로와 확장자만 남도록 분리했습니다. +- 메인 설정 쪽은 [SettingsWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml.cs) 에서 `AgentShortcutTabItem`을 `MainSettingsTab` 맨 끝으로 다시 추가해, AX Agent 이동 항목이 좌측 사이드바 맨 아래에 오도록 정리했습니다. +- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0 +- 업데이트: 2026-04-05 15:06 (KST) diff --git a/src/AxCopilot/Views/ChatWindow.xaml b/src/AxCopilot/Views/ChatWindow.xaml index d84195c..30f43ad 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml +++ b/src/AxCopilot/Views/ChatWindow.xaml @@ -2481,22 +2481,30 @@ Margin="0,4,0,0" Checked="OverlayNav_Checked" Tag="dev"/> - + - + + Tag="block"/> - - - + Margin="0,0,0,12"> + + + + + + + + + + + + + - - - + Margin="0,0,0,12"> + + + + + + + + + + + + + @@ -4715,7 +4807,7 @@ - - @@ -4750,9 +4842,35 @@ - + + + + + + 시스템 보호 경로와 실행 위험이 높은 형식은 기본값으로 막아 둡니다. + 운영 정책에 맞춰 차단 기준을 검토할 때 이 탭을 확인하면 됩니다. + + + + + + - + + "코드 설정", "dev" => "개발자 설정", "tools" => "도구 설정", - "etc" => "스킬/차단 설정", + "skill" => "스킬 설정", + "block" => "차단 설정", _ => "공통 설정" }; var headingDescription = section switch @@ -15239,7 +15241,8 @@ public partial class ChatWindow : Window "code" => "코드 작업, 검증, 개발 도구 사용에 맞춘 설정입니다.", "dev" => "실행 이력, 감사, 시각화 같은 개발자용 설정입니다.", "tools" => "AX Agent가 사용할 도구와 훅 동작을 관리합니다.", - "etc" => "스킬 로드와 차단 규칙, 보조 연결을 관리합니다.", + "skill" => "슬래시 스킬, 스킬 폴더, 폴백 모델, MCP 연결을 관리합니다.", + "block" => "에이전트가 접근하거나 수정하면 안 되는 경로와 형식을 관리합니다.", _ => "Chat, Cowork, Code에서 공통으로 쓰는 기본 설정입니다." }; @@ -15289,19 +15292,25 @@ public partial class ChatWindow : Window if (OverlayDeveloperExtraPanel != null) OverlayDeveloperExtraPanel.Visibility = showDev ? Visibility.Visible : Visibility.Collapsed; if (OverlayAdvancedTogglePanel != null) - OverlayAdvancedTogglePanel.Visibility = showDev || showCowork || showCode || showTools || showEtc ? Visibility.Visible : Visibility.Collapsed; + OverlayAdvancedTogglePanel.Visibility = showDev || showCowork || showCode || showTools || showSkill ? Visibility.Visible : Visibility.Collapsed; if (OverlayToolsInfoPanel != null) OverlayToolsInfoPanel.Visibility = showTools ? Visibility.Visible : Visibility.Collapsed; if (OverlayToolsRuntimePanel != null) OverlayToolsRuntimePanel.Visibility = showTools ? Visibility.Visible : Visibility.Collapsed; - if (OverlayEtcInfoPanel != null) - OverlayEtcInfoPanel.Visibility = showEtc ? Visibility.Visible : Visibility.Collapsed; - if (OverlayEtcRuntimePanel != null) - OverlayEtcRuntimePanel.Visibility = showEtc ? Visibility.Visible : Visibility.Collapsed; + if (OverlayToolRegistrySection != null) + OverlayToolRegistrySection.Visibility = showTools ? Visibility.Visible : Visibility.Collapsed; + if (OverlaySkillInfoPanel != null) + OverlaySkillInfoPanel.Visibility = showSkill ? Visibility.Visible : Visibility.Collapsed; + if (OverlaySkillRuntimePanel != null) + OverlaySkillRuntimePanel.Visibility = showSkill ? Visibility.Visible : Visibility.Collapsed; + if (OverlayBlockInfoPanel != null) + OverlayBlockInfoPanel.Visibility = showBlock ? Visibility.Visible : Visibility.Collapsed; + if (OverlayBlockRuntimePanel != null) + OverlayBlockRuntimePanel.Visibility = showBlock ? Visibility.Visible : Visibility.Collapsed; if (OverlayToggleProactiveCompact != null) OverlayToggleProactiveCompact.Visibility = showDev ? Visibility.Visible : Visibility.Collapsed; if (OverlayToggleSkillSystem != null) - OverlayToggleSkillSystem.Visibility = showEtc ? Visibility.Visible : Visibility.Collapsed; + OverlayToggleSkillSystem.Visibility = showSkill ? Visibility.Visible : Visibility.Collapsed; if (OverlayToggleToolHooks != null) OverlayToggleToolHooks.Visibility = showTools ? Visibility.Visible : Visibility.Collapsed; if (OverlayToggleHookInputMutation != null) @@ -15317,9 +15326,9 @@ public partial class ChatWindow : Window if (OverlayToggleParallelTools != null) OverlayToggleParallelTools.Visibility = showCode ? Visibility.Visible : Visibility.Collapsed; if (OverlayToggleProjectRules != null) - OverlayToggleProjectRules.Visibility = showEtc ? Visibility.Visible : Visibility.Collapsed; + OverlayToggleProjectRules.Visibility = showDev ? Visibility.Visible : Visibility.Collapsed; if (OverlayToggleAgentMemory != null) - OverlayToggleAgentMemory.Visibility = showEtc ? Visibility.Visible : Visibility.Collapsed; + OverlayToggleAgentMemory.Visibility = showDev ? Visibility.Visible : Visibility.Collapsed; if (OverlayTogglePlanModeTools != null) OverlayTogglePlanModeTools.Visibility = showCode ? Visibility.Visible : Visibility.Collapsed; if (OverlayToggleWorktreeTools != null) @@ -15329,7 +15338,7 @@ public partial class ChatWindow : Window if (OverlayToggleCronTools != null) OverlayToggleCronTools.Visibility = showCode ? Visibility.Visible : Visibility.Collapsed; - if (showTools || showEtc) + if (showTools || showSkill || showBlock) RefreshOverlayEtcPanels(); } diff --git a/src/AxCopilot/Views/SettingsWindow.xaml.cs b/src/AxCopilot/Views/SettingsWindow.xaml.cs index 3fc3636..d63a75c 100644 --- a/src/AxCopilot/Views/SettingsWindow.xaml.cs +++ b/src/AxCopilot/Views/SettingsWindow.xaml.cs @@ -34,6 +34,14 @@ public partial class SettingsWindow : Window _revertCallback = revertCallback; DataContext = vm; + if (MainSettingsTab != null && AgentTabItem != null && MainSettingsTab.Items.Contains(AgentTabItem)) + MainSettingsTab.Items.Remove(AgentTabItem); + if (MainSettingsTab != null && AgentShortcutTabItem != null && MainSettingsTab.Items.Contains(AgentShortcutTabItem)) + { + MainSettingsTab.Items.Remove(AgentShortcutTabItem); + MainSettingsTab.Items.Add(AgentShortcutTabItem); + } + vm.ThemePreviewRequested += (_, _) => _previewCallback(vm.SelectedThemeKey); vm.SaveCompleted += (_, _) => { @@ -60,8 +68,11 @@ public partial class SettingsWindow : Window BuildQuoteCategoryCheckboxes(); BuildDockBarSettings(); BuildTextActionCommandsPanel(); - MoveBlockSectionToEtc(); - BuildServiceModelPanels(); + if (HasLegacyAgentTab()) + { + MoveBlockSectionToEtc(); + BuildServiceModelPanels(); + } // 스킬이 아직 로드되지 않았으면 백그라운드에서 로드 후 UI 구성 var app = System.Windows.Application.Current as App; @@ -76,8 +87,11 @@ public partial class SettingsWindow : Window }); } - BuildToolRegistryPanel(); - LoadAdvancedSettings(); + if (HasLegacyAgentTab()) + { + BuildToolRegistryPanel(); + LoadAdvancedSettings(); + } RefreshStorageInfo(); // 개발자 모드는 저장된 설정 유지 (끄면 하위 기능 모두 비활성) UpdateDevModeContentVisibility(); @@ -85,10 +99,14 @@ public partial class SettingsWindow : Window ApplyAiEnabledState(app?.SettingsService?.Settings.AiEnabled ?? false, init: true); ApplyOperationModeState(app?.SettingsService?.Settings.OperationMode); InitializeDisplayModeUi(); - SyncAgentSelectionCards(); + if (HasLegacyAgentTab()) + SyncAgentSelectionCards(); }; } + private bool HasLegacyAgentTab() + => MainSettingsTab != null && AgentTabItem != null && MainSettingsTab.Items.Contains(AgentTabItem); + private void SyncAgentSelectionCards() { var service = (_vm.LlmService ?? "").Trim().ToLowerInvariant(); @@ -139,8 +157,9 @@ public partial class SettingsWindow : Window private void InitializeDisplayModeUi() { var app = System.Windows.Application.Current as App; - var saved = app?.SettingsService?.Settings?.Llm?.AgentUiExpressionLevel; - SetDisplayMode(saved ?? "balanced", persist: false); + if (app?.SettingsService?.Settings?.Llm != null) + app.SettingsService.Settings.Llm.AgentUiExpressionLevel = "rich"; + SetDisplayMode("rich", persist: false); } private void DisplayMode_Checked(object sender, RoutedEventArgs e) @@ -159,14 +178,7 @@ public partial class SettingsWindow : Window private void AgentDisplayMode_Checked(object sender, RoutedEventArgs e) { if (_isDisplayModeSyncing) return; - var rb = sender as RadioButton; - var next = rb?.Name switch - { - "AgentDisplayModeRich" => "rich", - "AgentDisplayModeSimple" => "simple", - _ => "balanced", - }; - SetDisplayMode(next, persist: true); + SetDisplayMode("rich", persist: true); } private void SetDisplayMode(string mode, bool persist) @@ -195,7 +207,8 @@ public partial class SettingsWindow : Window } ApplyMainTabVisibility(mode); - ApplyAgentSubTabVisibility(mode); + if (HasLegacyAgentTab()) + ApplyAgentSubTabVisibility(mode); if (!persist) return; var app = System.Windows.Application.Current as App; @@ -210,11 +223,11 @@ public partial class SettingsWindow : Window var simpleKeep = new HashSet(StringComparer.OrdinalIgnoreCase) { - "일반", "테마", "기능", "AX Agent" + "일반", "테마", "기능" }; var balancedKeep = new HashSet(StringComparer.OrdinalIgnoreCase) { - "일반", "테마", "클립보드", "캡처", "시스템", "기능", "AX Agent" + "일반", "테마", "클립보드", "캡처", "시스템", "기능" }; foreach (var item in MainSettingsTab.Items.OfType()) @@ -229,12 +242,6 @@ public partial class SettingsWindow : Window if (string.Equals(header, "알림", StringComparison.OrdinalIgnoreCase)) visible = false; - if (string.Equals(header, "AX Agent", StringComparison.OrdinalIgnoreCase) - && !((System.Windows.Application.Current as App)?.SettingsService?.Settings.AiEnabled ?? false)) - { - visible = false; - } - item.Visibility = visible ? Visibility.Visible : Visibility.Collapsed; } @@ -2583,31 +2590,12 @@ public partial class SettingsWindow : Window /// AI 기능 토글 상태를 UI와 설정에 반영합니다. private void ApplyAiEnabledState(bool enabled, bool init = false) { - // 토글 스위치 체크 상태 동기화 (init 시에는 이벤트 억제) - if (AiEnabledToggle != null && AiEnabledToggle.IsChecked != enabled) - { - AiEnabledToggle.IsChecked = enabled; - } - if (AgentAiEnabledToggle != null && AgentAiEnabledToggle.IsChecked != enabled) - { - AgentAiEnabledToggle.IsChecked = enabled; - } - if (AgentTabItem != null) - AgentTabItem.Visibility = enabled ? Visibility.Visible : Visibility.Collapsed; - ApplyMainTabVisibility(NormalizeDisplayMode((System.Windows.Application.Current as App)?.SettingsService?.Settings?.Llm?.AgentUiExpressionLevel)); } public void SelectAgentSettingsTab() { - if (AgentTabItem == null || MainSettingsTab == null || AgentTabItem.Visibility != Visibility.Visible) - return; - - MainSettingsTab.SelectedItem = AgentTabItem; - if (AgentTabCommon != null) - AgentTabCommon.IsChecked = true; - AgentSubTab_Checked(this, new RoutedEventArgs()); - Activate(); + OpenAgentSettingsShortcut(closeAfterOpen: false); } private void BtnAgentSettingsBack_Click(object sender, RoutedEventArgs e) @@ -2625,13 +2613,32 @@ public partial class SettingsWindow : Window private void BtnAgentShortcut_Click(object sender, RoutedEventArgs e) { - SelectAgentSettingsTab(); + OpenAgentSettingsShortcut(closeAfterOpen: true); + } + + private void MainSettingsTab_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (MainSettingsTab?.SelectedItem is not TabItem selected) + return; + + if (!ReferenceEquals(selected, AgentShortcutTabItem)) + return; + + OpenAgentSettingsShortcut(closeAfterOpen: true); + } + + private void OpenAgentSettingsShortcut(bool closeAfterOpen) + { + var app = System.Windows.Application.Current as App; + app?.OpenAgentSettingsInChat(); + + if (closeAfterOpen) + Close(); } private void ApplyOperationModeState(string? mode) { var normalized = OperationModePolicy.Normalize(mode); - SyncOperationModeCombo(OperationModeCombo, normalized); if (AgentOperationModeInternal != null) AgentOperationModeInternal.IsChecked = normalized == OperationModePolicy.InternalMode; if (AgentOperationModeExternal != null) AgentOperationModeExternal.IsChecked = normalized == OperationModePolicy.ExternalMode; } @@ -2833,7 +2840,6 @@ public partial class SettingsWindow : Window else { // 취소/실패 ? 토글 원상복구 - if (AiEnabledToggle != null) AiEnabledToggle.IsChecked = false; if (AgentAiEnabledToggle != null) AgentAiEnabledToggle.IsChecked = false; } }