diff --git a/README.md b/README.md index b13a53d..d9481d8 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,10 @@ Windows 전용 시맨틱 런처 & 워크스페이스 매니저 개발 참고: Claw Code 동등성 작업 추적 문서 `docs/claw-code-parity-plan.md` +- 업데이트: 2026-04-06 00:45 (KST) +- AX Agent 내부 설정 공통 탭에 `대화 스타일` 섹션 제목을 복구해, `문서 형태`와 `디자인 스타일` 저장 항목이 명확히 보이도록 정리했습니다. +- AX Agent 내부 설정 스킬 탭의 `MCP 서버` 영역에 `서버 추가` 버튼을 복원했고, 목록 카드 안에서 `활성화/비활성화`와 `삭제`까지 바로 관리할 수 있게 옮겼습니다. + - 업데이트: 2026-04-05 19:04 (KST) - AX Agent transcript와 작업 요약에서 도구/스킬 이름을 사람이 읽기 쉬운 표시명으로 정리했습니다. raw snake_case 도구명 대신 `파일 읽기`, `빌드/실행`, `Git`, `/bug-hunt` 같은 표시명 중심으로 보입니다. - 도구/스킬 이벤트 배지는 역할 중심(`도구`, `도구 결과`, `스킬`)으로 단순화하고, 실제 도구명은 본문 보조 텍스트로만 노출되게 바꿨습니다. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 12c4c74..c1213ad 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4851,3 +4851,5 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - [PermissionRequestWindow.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/PermissionRequestWindow.cs) 의 `BuildPreviewCard`, `BuildFileEditPreviewCard`, `BuildFileWriteTwoColumnPreviewCard`는 이 helper를 쓰도록 정리해 권한 승인 프리뷰가 같은 preview 언어를 따르도록 맞췄다. - [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) 에 `SetPreviewHeader`, `SetPreviewHeaderState`를 추가해 현재 탭 파일 메타를 표시하도록 했다. - 텍스트 프리뷰 본문도 bordered preview box 안에 렌더되게 바꿔, AX Agent 파일 프리뷰와 transcript/승인 프리뷰 사이 시각 언어를 더 가깝게 맞췄다. +- Document update: 2026-04-06 00:45 (KST) - Restored the missing AX Agent internal-settings UX for conversation-style persistence by adding a visible `대화 스타일` section header above the existing `문서 형태` and `디자인 스타일` controls. The underlying save path already existed in `CmbOverlayDefaultOutputFormat_SelectionChanged` and `CmbOverlayDefaultMood_SelectionChanged`; this pass makes that persisted behavior explicit again in the overlay. +- Document update: 2026-04-06 00:45 (KST) - Restored MCP server management inside the AX Agent internal settings overlay. The skill tab now exposes `+ 서버 추가`, and overlay MCP cards support inline enable/disable and delete actions with immediate persistence through `PersistOverlaySettingsState(...)`. diff --git a/src/AxCopilot/Views/ChatWindow.xaml b/src/AxCopilot/Views/ChatWindow.xaml index 9889027..d7a78db 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml +++ b/src/AxCopilot/Views/ChatWindow.xaml @@ -3111,6 +3111,16 @@ Checked="ChkOverlayAiEnabled_Changed" Unchecked="ChkOverlayAiEnabled_Changed"/> + + + + @@ -5187,10 +5197,39 @@ - + + + + + + + + + + + + { + border.Background = TryFindResource("HintBackground") as Brush ?? new SolidColorBrush(Color.FromArgb(20, 0, 0, 0)); + border.BorderBrush = borderBrush; + }; + border.MouseLeave += (_, _) => + { + border.Background = Brushes.Transparent; + border.BorderBrush = Brushes.Transparent; + }; + border.MouseLeftButtonUp += (_, _) => onClick(); + return border; + } + + for (int index = 0; index < servers.Count; index++) + { + var server = servers[index]; + var card = new Border + { + Background = cardBackground, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + CornerRadius = new CornerRadius(8), + Padding = new Thickness(12, 10, 12, 10), Margin = new Thickness(0, 0, 0, 6) }; - var stack = new StackPanel(); - stack.Children.Add(new TextBlock + + var root = new StackPanel(); + var header = new Grid(); + header.ColumnDefinitions.Add(new ColumnDefinition()); + header.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + var title = new TextBlock { Text = server.Name, FontSize = 12, FontWeight = FontWeights.SemiBold, - Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.Black - }); - stack.Children.Add(new TextBlock + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center + }; + header.Children.Add(title); + + var actions = new StackPanel { - Text = $"{server.Command} {(server.Enabled ? "· 활성" : "· 비활성")}", - Margin = new Thickness(0, 3, 0, 0), - FontSize = 10.5, - TextWrapping = TextWrapping.Wrap, - Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray - }); - card.Child = stack; + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Right, + }; + actions.Children.Add(CreateActionChip(server.Enabled ? "비활성화" : "활성화", accentBrush, () => + { + _settings.Settings.Llm.McpServers[index].Enabled = !_settings.Settings.Llm.McpServers[index].Enabled; + PersistOverlaySettingsState(refreshOverlayDeferredInputs: false); + BuildOverlayMcpServerCards(); + })); + actions.Children.Add(CreateActionChip("삭제", BrushFromHex("#DC2626"), () => + { + var result = CustomMessageBox.Show($"'{server.Name}' 서버를 삭제하시겠습니까?", "MCP 서버 삭제", + MessageBoxButton.YesNo, MessageBoxImage.Question); + if (result != MessageBoxResult.Yes) + return; + + _settings.Settings.Llm.McpServers.RemoveAt(index); + PersistOverlaySettingsState(refreshOverlayDeferredInputs: false); + BuildOverlayMcpServerCards(); + })); + Grid.SetColumn(actions, 1); + header.Children.Add(actions); + root.Children.Add(header); + + var commandCard = new Border + { + Background = itemBackground, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + CornerRadius = new CornerRadius(8), + Padding = new Thickness(10, 8, 10, 8), + Margin = new Thickness(0, 8, 0, 0), + Child = new StackPanel + { + Children = + { + new TextBlock + { + Text = server.Command, + FontSize = 10.8, + TextWrapping = TextWrapping.Wrap, + Foreground = primaryText, + }, + new TextBlock + { + Text = server.Enabled ? "활성 상태" : "비활성 상태", + Margin = new Thickness(0, 4, 0, 0), + FontSize = 10.5, + Foreground = secondaryText, + } + } + } + }; + root.Children.Add(commandCard); + card.Child = root; OverlayMcpServerListPanel.Children.Add(card); } } + private void BtnOverlayAddMcpServer_Click(object sender, RoutedEventArgs e) + { + var nameDialog = new InputDialog("MCP 서버 추가", "서버 이름:", placeholder: "예: my-mcp-server") + { + Owner = this + }; + if (nameDialog.ShowDialog() != true || string.IsNullOrWhiteSpace(nameDialog.ResponseText)) + return; + + var commandDialog = new InputDialog("MCP 서버 추가", "실행 명령:", placeholder: "예: npx -y @modelcontextprotocol/server-filesystem") + { + Owner = this + }; + if (commandDialog.ShowDialog() != true || string.IsNullOrWhiteSpace(commandDialog.ResponseText)) + return; + + _settings.Settings.Llm.McpServers.Add(new Models.McpServerEntry + { + Name = nameDialog.ResponseText.Trim(), + Command = commandDialog.ResponseText.Trim(), + Enabled = true, + }); + + PersistOverlaySettingsState(refreshOverlayDeferredInputs: false); + BuildOverlayMcpServerCards(); + } + private void BuildOverlayToolRegistryPanel() { if (OverlayToolRegistryPanel == null)