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
Some checks failed
Release Gate / gate (push) Has been cancelled
This commit is contained in:
@@ -1354,3 +1354,6 @@ MIT License
|
|||||||
업데이트: 2026-04-06 20:18 (KST)
|
업데이트: 2026-04-06 20:18 (KST)
|
||||||
- AX Agent 메시지 마크다운 렌더에 코드 심볼 강조를 추가해 Cowork/Code 답변의 파일 경로·camelCase/PascalCase·snake_case가 더 선명하게 보이도록 조정했다.
|
- AX Agent 메시지 마크다운 렌더에 코드 심볼 강조를 추가해 Cowork/Code 답변의 파일 경로·camelCase/PascalCase·snake_case가 더 선명하게 보이도록 조정했다.
|
||||||
- 코드 탭 입력부 위에 저장소/브랜치/변경 수치를 보여주는 Git 요약 배너를 추가해 `claude-code` 스타일의 repo context를 더 빠르게 읽을 수 있게 맞췄다.
|
- 코드 탭 입력부 위에 저장소/브랜치/변경 수치를 보여주는 Git 요약 배너를 추가해 `claude-code` 스타일의 repo context를 더 빠르게 읽을 수 있게 맞췄다.
|
||||||
|
- 업데이트: 2026-04-06 20:28 (KST)
|
||||||
|
- AX Agent 코드 탭 입력부 위 저장소 요약줄을 더 `claude-code` 스타일에 가깝게 정리했습니다. `로컬/워크트리`, `upstream` 상태를 얇은 배지로 표시하고, 변경이 있을 때 액션 문구가 `변경 · 브랜치 보기`로 바뀌도록 했습니다.
|
||||||
|
- 코드 탭 저장소 요약줄에 `리뷰` 배지를 추가해 기존 slash 명령 `/review`로 바로 이어지게 했습니다. 입력 중인 문구가 있으면 유지한 채 리뷰 흐름만 얹도록 조정했습니다.
|
||||||
|
|||||||
@@ -5020,3 +5020,10 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
|
|||||||
|
|
||||||
업데이트: 2026-04-06 20:18 (KST)
|
업데이트: 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`.
|
- 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만 덧붙이도록 구성
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public partial class ChatWindow
|
|||||||
? "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 필요하면 작업 폴더 파일도 함께 참고합니다."
|
? "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 필요하면 작업 폴더 파일도 함께 참고합니다."
|
||||||
: "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 작업 폴더를 선택하면 관련 파일도 함께 참고합니다.",
|
: "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 작업 폴더를 선택하면 관련 파일도 함께 참고합니다.",
|
||||||
"Code" => hasFolder
|
"Code" => hasFolder
|
||||||
? "코드 수정, 원인 분석, 빌드·테스트를 요청하세요. 작업 폴더의 코드와 문서를 함께 검토합니다."
|
? "코드 수정, 원인 분석, 빌드·테스트를 요청하세요. 작업 폴더 코드를 참고하고, 상단 저장소 배너로 브랜치와 변경 상태를 함께 봅니다."
|
||||||
: "작업 폴더를 선택한 뒤 코드 수정, 원인 분석, 빌드·테스트를 요청하세요.",
|
: "작업 폴더를 선택한 뒤 코드 수정, 원인 분석, 빌드·테스트를 요청하세요.",
|
||||||
_ => "질문, 요약, 초안 작성, 아이디어 정리를 요청하세요.",
|
_ => "질문, 요약, 초안 작성, 아이디어 정리를 요청하세요.",
|
||||||
};
|
};
|
||||||
@@ -41,9 +41,9 @@ public partial class ChatWindow
|
|||||||
return preset.Description.Trim();
|
return preset.Description.Trim();
|
||||||
|
|
||||||
if (string.Equals(_activeTab, "Cowork", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(_activeTab, "Cowork", StringComparison.OrdinalIgnoreCase))
|
||||||
return "이 작업 유형에 맞는 문서/데이터/파일 작업 흐름으로 이어집니다.";
|
return "선택한 작업 유형에 맞는 문서·데이터·파일 작업 흐름으로 이어집니다.";
|
||||||
|
|
||||||
return "이 주제에 맞는 답변 톤과 초안 방향으로 대화를 이어갑니다.";
|
return "선택한 대화 주제에 맞는 응답 방향과 초안 흐름으로 이어집니다.";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateFolderBar()
|
private void UpdateFolderBar()
|
||||||
@@ -109,7 +109,7 @@ public partial class ChatWindow
|
|||||||
return;
|
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));
|
.FirstOrDefault(p => string.Equals(p.Category?.Trim(), category, StringComparison.OrdinalIgnoreCase));
|
||||||
if (preset == null)
|
if (preset == null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -43,33 +43,46 @@ public partial class ChatWindow
|
|||||||
if (CodeRepoSummaryBar == null)
|
if (CodeRepoSummaryBar == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
var currentFolder = GetCurrentWorkFolder();
|
||||||
var isVisible = visibility == Visibility.Visible &&
|
var isVisible = visibility == Visibility.Visible &&
|
||||||
string.Equals(_activeTab, "Code", StringComparison.OrdinalIgnoreCase) &&
|
string.Equals(_activeTab, "Code", StringComparison.OrdinalIgnoreCase) &&
|
||||||
!string.IsNullOrWhiteSpace(GetCurrentWorkFolder());
|
!string.IsNullOrWhiteSpace(currentFolder);
|
||||||
|
|
||||||
CodeRepoSummaryBar.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
|
CodeRepoSummaryBar.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
|
||||||
if (!isVisible)
|
if (!isVisible)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var gitRoot = _currentGitRoot ?? ResolveGitRoot(GetCurrentWorkFolder());
|
var gitRoot = _currentGitRoot ?? ResolveGitRoot(currentFolder);
|
||||||
var repoName = !string.IsNullOrWhiteSpace(gitRoot)
|
var repoName = !string.IsNullOrWhiteSpace(gitRoot)
|
||||||
? System.IO.Path.GetFileName(gitRoot.TrimEnd('\\', '/'))
|
? System.IO.Path.GetFileName(gitRoot.TrimEnd('\\', '/'))
|
||||||
: "저장소";
|
: "저장소";
|
||||||
var normalizedBranch = string.IsNullOrWhiteSpace(branchName) ? "detached" : branchName!;
|
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)
|
if (CodeRepoSummaryRepoLabel != null)
|
||||||
CodeRepoSummaryRepoLabel.Text = repoName;
|
CodeRepoSummaryRepoLabel.Text = repoName;
|
||||||
if (CodeRepoSummaryBranchLabel != null)
|
if (CodeRepoSummaryBranchLabel != null)
|
||||||
CodeRepoSummaryBranchLabel.Text = normalizedBranch;
|
CodeRepoSummaryBranchLabel.Text = normalizedBranch;
|
||||||
|
|
||||||
if (CodeRepoSummaryDetailText != null)
|
if (CodeRepoSummaryDetailText != null)
|
||||||
{
|
{
|
||||||
var details = new List<string>();
|
var details = new List<string>();
|
||||||
if (!string.IsNullOrWhiteSpace(filesText))
|
if (!string.IsNullOrWhiteSpace(filesText))
|
||||||
details.Add($"변경 파일 {filesText}");
|
details.Add($"변경 {filesText}");
|
||||||
if (!string.IsNullOrWhiteSpace(addedText))
|
if (!string.IsNullOrWhiteSpace(addedText))
|
||||||
details.Add(addedText);
|
details.Add(addedText);
|
||||||
if (!string.IsNullOrWhiteSpace(deletedText))
|
if (!string.IsNullOrWhiteSpace(deletedText))
|
||||||
details.Add(deletedText);
|
details.Add(deletedText);
|
||||||
|
if (!string.IsNullOrWhiteSpace(_currentGitUpstreamStatus))
|
||||||
|
details.Add(_currentGitUpstreamStatus!);
|
||||||
|
|
||||||
CodeRepoSummaryDetailText.Text = details.Count > 0
|
CodeRepoSummaryDetailText.Text = details.Count > 0
|
||||||
? string.Join(" · ", details)
|
? string.Join(" · ", details)
|
||||||
@@ -90,6 +103,47 @@ public partial class ChatWindow
|
|||||||
CodeRepoSummaryDeletedPill.Visibility = hasDeleted ? Visibility.Visible : Visibility.Collapsed;
|
CodeRepoSummaryDeletedPill.Visibility = hasDeleted ? Visibility.Visible : Visibility.Collapsed;
|
||||||
CodeRepoSummaryDeletedText.Text = hasDeleted ? deletedText : "";
|
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)
|
private async void CodeRepoSummaryBar_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
||||||
@@ -183,7 +237,7 @@ public partial class ChatWindow
|
|||||||
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
||||||
"\uE8C8",
|
"\uE8C8",
|
||||||
"상태 요약 복사",
|
"상태 요약 복사",
|
||||||
"브랜치 변경 파일, 추가/삭제 라인 복사",
|
"브랜치, 변경 파일, 추가/삭제 라인 요약을 복사합니다.",
|
||||||
false,
|
false,
|
||||||
accentBrush,
|
accentBrush,
|
||||||
secondaryText,
|
secondaryText,
|
||||||
@@ -196,8 +250,8 @@ public partial class ChatWindow
|
|||||||
|
|
||||||
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
||||||
"\uE72B",
|
"\uE72B",
|
||||||
"새로고침",
|
"다시 조회",
|
||||||
"Git 상태를 다시 조회합니다.",
|
"Git 상태를 다시 불러옵니다.",
|
||||||
false,
|
false,
|
||||||
accentBrush,
|
accentBrush,
|
||||||
secondaryText,
|
secondaryText,
|
||||||
@@ -280,7 +334,7 @@ public partial class ChatWindow
|
|||||||
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
GitBranchItems.Children.Add(CreatePopupMenuRow(
|
||||||
"\uE710",
|
"\uE710",
|
||||||
"새 브랜치 생성",
|
"새 브랜치 생성",
|
||||||
"현재 작업 기준으로 새 브랜치를 만들고 전환합니다.",
|
"현재 작업을 기준으로 새 브랜치를 만들고 전환합니다.",
|
||||||
false,
|
false,
|
||||||
accentBrush,
|
accentBrush,
|
||||||
secondaryText,
|
secondaryText,
|
||||||
|
|||||||
@@ -1750,6 +1750,34 @@
|
|||||||
Orientation="Horizontal"
|
Orientation="Horizontal"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Margin="12,0,0,0">
|
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"
|
<Border x:Name="CodeRepoSummaryAddedPill"
|
||||||
Visibility="Collapsed"
|
Visibility="Collapsed"
|
||||||
Background="#E8F7EC"
|
Background="#E8F7EC"
|
||||||
@@ -1778,12 +1806,26 @@
|
|||||||
FontWeight="SemiBold"
|
FontWeight="SemiBold"
|
||||||
Foreground="#B91C1C"/>
|
Foreground="#B91C1C"/>
|
||||||
</Border>
|
</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}"
|
<Border Background="{DynamicResource ItemBackground}"
|
||||||
BorderBrush="{DynamicResource BorderColor}"
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
CornerRadius="999"
|
CornerRadius="999"
|
||||||
Padding="9,4">
|
Padding="9,4">
|
||||||
<TextBlock Text="브랜치 보기"
|
<TextBlock x:Name="CodeRepoSummaryActionText"
|
||||||
|
Text="브랜치 · 변경 보기"
|
||||||
FontSize="11.5"
|
FontSize="11.5"
|
||||||
Foreground="{DynamicResource PrimaryText}"/>
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
</Border>
|
</Border>
|
||||||
|
|||||||
Reference in New Issue
Block a user