AX Agent 코드 탭 저장소 요약줄과 리뷰 진입 UX 개선\n\n- 코드 탭 입력부 위 저장소 요약줄에 로컬/워크트리, upstream 배지를 추가해 repo context를 더 명확히 표시\n- 변경 상태에 따라 액션 문구를 동적으로 바꾸고 /review slash 명령으로 바로 이어지는 리뷰 배지 추가\n- 코드 탭 입력 워터마크와 안내 문구를 저장소 배너 흐름에 맞게 정리\n\n검증:\n- dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\\n- 경고 0 / 오류 0
Some checks failed
Release Gate / gate (push) Has been cancelled

This commit is contained in:
2026-04-06 21:37:07 +09:00
parent a19f69b2ff
commit d9309b45fa
5 changed files with 118 additions and 12 deletions

View File

@@ -1354,3 +1354,6 @@ MIT License
업데이트: 2026-04-06 20:18 (KST)
- AX Agent 메시지 마크다운 렌더에 코드 심볼 강조를 추가해 Cowork/Code 답변의 파일 경로·camelCase/PascalCase·snake_case가 더 선명하게 보이도록 조정했다.
- 코드 탭 입력부 위에 저장소/브랜치/변경 수치를 보여주는 Git 요약 배너를 추가해 `claude-code` 스타일의 repo context를 더 빠르게 읽을 수 있게 맞췄다.
- 업데이트: 2026-04-06 20:28 (KST)
- AX Agent 코드 탭 입력부 위 저장소 요약줄을 더 `claude-code` 스타일에 가깝게 정리했습니다. `로컬/워크트리`, `upstream` 상태를 얇은 배지로 표시하고, 변경이 있을 때 액션 문구가 `변경 · 브랜치 보기`로 바뀌도록 했습니다.
- 코드 탭 저장소 요약줄에 `리뷰` 배지를 추가해 기존 slash 명령 `/review`로 바로 이어지게 했습니다. 입력 중인 문구가 있으면 유지한 채 리뷰 흐름만 얹도록 조정했습니다.

View File

@@ -5020,3 +5020,10 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
업데이트: 2026-04-06 20:18 (KST)
- Improved AX Agent markdown rendering for Cowork/Code by highlighting file paths plus code-like symbols, and added a compact repository summary banner above the Code composer to surface branch and diff context closer to `claude-code`.
## 2026-04-06 20:28 (KST)
- AX Agent 코드 탭의 저장소 요약줄을 `claude-code` 레퍼런스에 더 가깝게 정리했다.
- 저장소/브랜치 외에 `로컬/워크트리` 배지와 `upstream` 배지를 추가
- 변경이 있을 때 액션 라벨을 `변경 · 브랜치 보기`로 동적으로 변경
- 코드 탭 저장소 요약줄에서 `/review` slash 명령으로 바로 이어지는 `리뷰` 배지를 추가했다.
- 기존 입력 중인 텍스트는 유지하고 slash chip만 덧붙이도록 구성

View File

@@ -19,7 +19,7 @@ public partial class ChatWindow
? "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 필요하면 작업 폴더 파일도 함께 참고합니다."
: "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 작업 폴더를 선택하면 관련 파일도 함께 참고합니다.",
"Code" => hasFolder
? "코드 수정, 원인 분석, 빌드·테스트를 요청하세요. 작업 폴더 코드와 문서를 함께 검토합니다."
? "코드 수정, 원인 분석, 빌드·테스트를 요청하세요. 작업 폴더 코드를 참고하고, 상단 저장소 배너로 브랜치와 변경 상태를 함께 니다."
: "작업 폴더를 선택한 뒤 코드 수정, 원인 분석, 빌드·테스트를 요청하세요.",
_ => "질문, 요약, 초안 작성, 아이디어 정리를 요청하세요.",
};
@@ -41,9 +41,9 @@ public partial class ChatWindow
return preset.Description.Trim();
if (string.Equals(_activeTab, "Cowork", StringComparison.OrdinalIgnoreCase))
return " 작업 유형에 맞는 문서/데이터/파일 작업 흐름으로 이어집니다.";
return "선택한 작업 유형에 맞는 문서·데이터·파일 작업 흐름으로 이어집니다.";
return " 주제에 맞는 답변 톤과 초안 방향으로 대화를 이어니다.";
return "선택한 대화 주제에 맞는 응답 방향과 초안 흐름으로 이어니다.";
}
private void UpdateFolderBar()
@@ -109,7 +109,7 @@ public partial class ChatWindow
return;
}
var preset = Services.PresetService.GetByTabWithCustom(_activeTab, _settings.Settings.Llm.CustomPresets)
var preset = PresetService.GetByTabWithCustom(_activeTab, _settings.Settings.Llm.CustomPresets)
.FirstOrDefault(p => string.Equals(p.Category?.Trim(), category, StringComparison.OrdinalIgnoreCase));
if (preset == null)
{

View File

@@ -43,33 +43,46 @@ public partial class ChatWindow
if (CodeRepoSummaryBar == null)
return;
var currentFolder = GetCurrentWorkFolder();
var isVisible = visibility == Visibility.Visible &&
string.Equals(_activeTab, "Code", StringComparison.OrdinalIgnoreCase) &&
!string.IsNullOrWhiteSpace(GetCurrentWorkFolder());
!string.IsNullOrWhiteSpace(currentFolder);
CodeRepoSummaryBar.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
if (!isVisible)
return;
var gitRoot = _currentGitRoot ?? ResolveGitRoot(GetCurrentWorkFolder());
var gitRoot = _currentGitRoot ?? ResolveGitRoot(currentFolder);
var repoName = !string.IsNullOrWhiteSpace(gitRoot)
? System.IO.Path.GetFileName(gitRoot.TrimEnd('\\', '/'))
: "저장소";
var normalizedBranch = string.IsNullOrWhiteSpace(branchName) ? "detached" : branchName!;
var normalizedGitRoot = string.IsNullOrWhiteSpace(gitRoot)
? ""
: gitRoot!.TrimEnd('\\', '/');
var normalizedCurrentFolder = string.IsNullOrWhiteSpace(currentFolder)
? ""
: currentFolder!.TrimEnd('\\', '/');
var isWorkspaceSubfolder = !string.IsNullOrWhiteSpace(normalizedGitRoot) &&
!string.IsNullOrWhiteSpace(normalizedCurrentFolder) &&
!string.Equals(normalizedGitRoot, normalizedCurrentFolder, StringComparison.OrdinalIgnoreCase);
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}");
details.Add($"변경 {filesText}");
if (!string.IsNullOrWhiteSpace(addedText))
details.Add(addedText);
if (!string.IsNullOrWhiteSpace(deletedText))
details.Add(deletedText);
if (!string.IsNullOrWhiteSpace(_currentGitUpstreamStatus))
details.Add(_currentGitUpstreamStatus!);
CodeRepoSummaryDetailText.Text = details.Count > 0
? string.Join(" · ", details)
@@ -90,6 +103,47 @@ public partial class ChatWindow
CodeRepoSummaryDeletedPill.Visibility = hasDeleted ? Visibility.Visible : Visibility.Collapsed;
CodeRepoSummaryDeletedText.Text = hasDeleted ? deletedText : "";
}
if (CodeRepoSummaryWorkspacePill != null && CodeRepoSummaryWorkspaceText != null)
{
CodeRepoSummaryWorkspacePill.Visibility = Visibility.Visible;
CodeRepoSummaryWorkspaceText.Text = isWorkspaceSubfolder ? "워크트리" : "로컬";
}
if (CodeRepoSummaryUpstreamPill != null && CodeRepoSummaryUpstreamText != null)
{
var hasUpstream = !string.IsNullOrWhiteSpace(_currentGitUpstreamStatus);
CodeRepoSummaryUpstreamPill.Visibility = hasUpstream ? Visibility.Visible : Visibility.Collapsed;
CodeRepoSummaryUpstreamText.Text = hasUpstream ? _currentGitUpstreamStatus! : "";
}
if (CodeRepoSummaryActionText != null)
{
var hasChanges = _currentGitChangedFileCount > 0 ||
!string.IsNullOrWhiteSpace(addedText) ||
!string.IsNullOrWhiteSpace(deletedText);
CodeRepoSummaryActionText.Text = hasChanges ? "변경 · 브랜치 보기" : "브랜치 보기";
}
if (CodeRepoSummaryReviewPill != null)
CodeRepoSummaryReviewPill.Visibility = Visibility.Visible;
}
private void CodeRepoSummaryReviewPill_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
if (!string.Equals(_activeTab, "Code", StringComparison.OrdinalIgnoreCase) || InputBox == null)
return;
var existingText = InputBox.Text;
ShowSlashChip("/review");
if (!string.IsNullOrWhiteSpace(existingText))
{
InputBox.Text = existingText;
InputBox.CaretIndex = InputBox.Text.Length;
}
InputBox.Focus();
}
private async void CodeRepoSummaryBar_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
@@ -183,7 +237,7 @@ public partial class ChatWindow
GitBranchItems.Children.Add(CreatePopupMenuRow(
"\uE8C8",
"상태 요약 복사",
"브랜치 변경 파일, 추가/삭제 라인 복사",
"브랜치, 변경 파일, 추가/삭제 라인 요약을 복사합니다.",
false,
accentBrush,
secondaryText,
@@ -196,8 +250,8 @@ public partial class ChatWindow
GitBranchItems.Children.Add(CreatePopupMenuRow(
"\uE72B",
"새로고침",
"Git 상태를 다시 조회합니다.",
"다시 조회",
"Git 상태를 다시 불러옵니다.",
false,
accentBrush,
secondaryText,
@@ -280,7 +334,7 @@ public partial class ChatWindow
GitBranchItems.Children.Add(CreatePopupMenuRow(
"\uE710",
"새 브랜치 생성",
"현재 작업 기준으로 새 브랜치를 만들고 전환합니다.",
"현재 작업 기준으로 새 브랜치를 만들고 전환합니다.",
false,
accentBrush,
secondaryText,

View File

@@ -1750,6 +1750,34 @@
Orientation="Horizontal"
VerticalAlignment="Center"
Margin="12,0,0,0">
<Border x:Name="CodeRepoSummaryWorkspacePill"
Visibility="Collapsed"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="999"
Padding="8,3"
Margin="0,0,6,0">
<TextBlock x:Name="CodeRepoSummaryWorkspaceText"
Text="로컬"
FontSize="11"
FontWeight="SemiBold"
Foreground="{DynamicResource SecondaryText}"/>
</Border>
<Border x:Name="CodeRepoSummaryUpstreamPill"
Visibility="Collapsed"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="999"
Padding="8,3"
Margin="0,0,6,0">
<TextBlock x:Name="CodeRepoSummaryUpstreamText"
Text="upstream"
FontSize="11"
FontWeight="SemiBold"
Foreground="{DynamicResource SecondaryText}"/>
</Border>
<Border x:Name="CodeRepoSummaryAddedPill"
Visibility="Collapsed"
Background="#E8F7EC"
@@ -1778,12 +1806,26 @@
FontWeight="SemiBold"
Foreground="#B91C1C"/>
</Border>
<Border x:Name="CodeRepoSummaryReviewPill"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="999"
Padding="9,4"
Margin="0,0,6,0"
Cursor="Hand"
MouseLeftButtonUp="CodeRepoSummaryReviewPill_MouseLeftButtonUp">
<TextBlock Text="리뷰"
FontSize="11.5"
Foreground="{DynamicResource PrimaryText}"/>
</Border>
<Border Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="999"
Padding="9,4">
<TextBlock Text="브랜치 보기"
<TextBlock x:Name="CodeRepoSummaryActionText"
Text="브랜치 · 변경 보기"
FontSize="11.5"
Foreground="{DynamicResource PrimaryText}"/>
</Border>