AX Agent 코드 메시지 강조와 Git 요약 배너 개선

- Cowork/Code 메시지 마크다운 렌더에 camelCase, PascalCase, snake_case 등 코드 심볼 강조를 추가함

- 코드 탭 입력부 위에 저장소/브랜치/변경 수치 요약 배너를 추가해 claude-code 스타일의 repo context를 빠르게 확인할 수 있게 함

- README와 DEVELOPMENT 문서를 2026-04-06 20:18 (KST) 기준으로 갱신함

- 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (경고 0, 오류 0)
This commit is contained in:
2026-04-06 20:29:33 +09:00
parent 43ee9154a8
commit a19f69b2ff
7 changed files with 229 additions and 6 deletions

View File

@@ -78,6 +78,7 @@ public partial class ChatWindow
UpdateDataUsageUI();
RefreshContextUsageVisual();
ScheduleGitBranchRefresh();
UpdateGitBranchUi(_currentGitBranchName, GitBranchFilesText?.Text ?? "", GitBranchAddedText?.Text ?? "", GitBranchDeletedText?.Text ?? "", _currentGitTooltip ?? "", BtnGitBranch?.Visibility ?? Visibility.Collapsed);
}
private void UpdateDataUsageUI()

View File

@@ -33,9 +33,76 @@ public partial class ChatWindow
GitBranchDeletedText.Text = deletedText;
if (GitBranchSeparator != null)
GitBranchSeparator.Visibility = visibility;
UpdateCodeRepoSummaryUi(branchName, filesText, addedText, deletedText, tooltip, visibility);
});
}
private void UpdateCodeRepoSummaryUi(string? branchName, string filesText, string addedText, string deletedText, string tooltip, Visibility visibility)
{
if (CodeRepoSummaryBar == null)
return;
var isVisible = visibility == Visibility.Visible &&
string.Equals(_activeTab, "Code", StringComparison.OrdinalIgnoreCase) &&
!string.IsNullOrWhiteSpace(GetCurrentWorkFolder());
CodeRepoSummaryBar.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
if (!isVisible)
return;
var gitRoot = _currentGitRoot ?? ResolveGitRoot(GetCurrentWorkFolder());
var repoName = !string.IsNullOrWhiteSpace(gitRoot)
? System.IO.Path.GetFileName(gitRoot.TrimEnd('\\', '/'))
: "저장소";
var normalizedBranch = string.IsNullOrWhiteSpace(branchName) ? "detached" : branchName!;
if (CodeRepoSummaryRepoLabel != null)
CodeRepoSummaryRepoLabel.Text = repoName;
if (CodeRepoSummaryBranchLabel != null)
CodeRepoSummaryBranchLabel.Text = normalizedBranch;
if (CodeRepoSummaryDetailText != null)
{
var details = new List<string>();
if (!string.IsNullOrWhiteSpace(filesText))
details.Add($"변경 파일 {filesText}");
if (!string.IsNullOrWhiteSpace(addedText))
details.Add(addedText);
if (!string.IsNullOrWhiteSpace(deletedText))
details.Add(deletedText);
CodeRepoSummaryDetailText.Text = details.Count > 0
? string.Join(" · ", details)
: "현재 저장소 컨텍스트와 변경 상태를 기준으로 작업합니다.";
CodeRepoSummaryDetailText.ToolTip = string.IsNullOrWhiteSpace(tooltip) ? null : tooltip;
}
if (CodeRepoSummaryAddedPill != null && CodeRepoSummaryAddedText != null)
{
var hasAdded = !string.IsNullOrWhiteSpace(addedText);
CodeRepoSummaryAddedPill.Visibility = hasAdded ? Visibility.Visible : Visibility.Collapsed;
CodeRepoSummaryAddedText.Text = hasAdded ? addedText : "";
}
if (CodeRepoSummaryDeletedPill != null && CodeRepoSummaryDeletedText != null)
{
var hasDeleted = !string.IsNullOrWhiteSpace(deletedText);
CodeRepoSummaryDeletedPill.Visibility = hasDeleted ? Visibility.Visible : Visibility.Collapsed;
CodeRepoSummaryDeletedText.Text = hasDeleted ? deletedText : "";
}
}
private async void CodeRepoSummaryBar_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
if (BtnGitBranch == null)
return;
await RefreshGitBranchStatusAsync();
BuildGitBranchPopup();
GitBranchPopup.IsOpen = true;
}
private void BuildGitBranchPopup()
{
if (GitBranchItems == null)

View File

@@ -51,10 +51,12 @@ public partial class ChatWindow
var userCodeBgBrush = TryFindResource("HintBackground") as Brush ?? Brushes.DarkGray;
MarkdownRenderer.EnableFilePathHighlight =
(System.Windows.Application.Current as App)?.SettingsService?.Settings.Llm.EnableFilePathHighlight ?? true;
MarkdownRenderer.EnableCodeSymbolHighlight = true;
bubble.Child = MarkdownRenderer.Render(content, primaryText, secondaryText, accentBrush, userCodeBgBrush);
}
else
{
MarkdownRenderer.EnableCodeSymbolHighlight = false;
bubble.Child = new TextBlock
{
Text = content,
@@ -176,6 +178,9 @@ public partial class ChatWindow
var app = System.Windows.Application.Current as App;
MarkdownRenderer.EnableFilePathHighlight =
app?.SettingsService?.Settings.Llm.EnableFilePathHighlight ?? true;
MarkdownRenderer.EnableCodeSymbolHighlight =
string.Equals(_activeTab, "Cowork", StringComparison.OrdinalIgnoreCase) ||
string.Equals(_activeTab, "Code", StringComparison.OrdinalIgnoreCase);
var codeBgBrush = TryFindResource("HintBackground") as Brush ?? Brushes.DarkGray;
if (IsBranchContextMessage(content))
{

View File

@@ -1699,6 +1699,97 @@
HorizontalAlignment="Center"
VerticalAlignment="Bottom">
<StackPanel HorizontalAlignment="Stretch">
<Border x:Name="CodeRepoSummaryBar"
Visibility="Collapsed"
HorizontalAlignment="Stretch"
Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="12"
Padding="12,8"
Margin="0,0,0,10"
Cursor="Hand"
MouseLeftButtonUp="CodeRepoSummaryBar_MouseLeftButtonUp">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE943;"
FontFamily="Segoe MDL2 Assets"
FontSize="12"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
<TextBlock x:Name="CodeRepoSummaryRepoLabel"
Text="저장소"
Margin="6,0,0,0"
FontSize="12.5"
FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"
VerticalAlignment="Center"/>
<TextBlock Text="·"
Margin="6,0"
FontSize="12"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
<TextBlock x:Name="CodeRepoSummaryBranchLabel"
Text="main"
FontSize="12"
Foreground="{DynamicResource SecondaryText}"
VerticalAlignment="Center"/>
</StackPanel>
<TextBlock x:Name="CodeRepoSummaryDetailText"
Margin="0,4,0,0"
FontSize="11.5"
Foreground="{DynamicResource SecondaryText}"
Text="현재 저장소 컨텍스트와 변경 상태를 기준으로 작업합니다."/>
</StackPanel>
<StackPanel Grid.Column="1"
Orientation="Horizontal"
VerticalAlignment="Center"
Margin="12,0,0,0">
<Border x:Name="CodeRepoSummaryAddedPill"
Visibility="Collapsed"
Background="#E8F7EC"
BorderBrush="#B7E3C0"
BorderThickness="1"
CornerRadius="999"
Padding="8,3"
Margin="0,0,6,0">
<TextBlock x:Name="CodeRepoSummaryAddedText"
Text="+0"
FontSize="11"
FontWeight="SemiBold"
Foreground="#15803D"/>
</Border>
<Border x:Name="CodeRepoSummaryDeletedPill"
Visibility="Collapsed"
Background="#FDECEC"
BorderBrush="#F4B9B9"
BorderThickness="1"
CornerRadius="999"
Padding="8,3"
Margin="0,0,6,0">
<TextBlock x:Name="CodeRepoSummaryDeletedText"
Text="-0"
FontSize="11"
FontWeight="SemiBold"
Foreground="#B91C1C"/>
</Border>
<Border Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="999"
Padding="9,4">
<TextBlock Text="브랜치 보기"
FontSize="11.5"
Foreground="{DynamicResource PrimaryText}"/>
</Border>
</StackPanel>
</Grid>
</Border>
<Border x:Name="SelectedPresetGuide"
Visibility="Collapsed"
HorizontalAlignment="Center"