From 0bb37d9390c65d90342e34013849986439a75f92 Mon Sep 17 00:00:00 2001 From: lacvet Date: Sat, 4 Apr 2026 13:56:02 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=ED=8C=9D=EC=97=85=20?= =?UTF-8?q?=EB=8B=A8=EC=88=9C=ED=99=94:=20=ED=95=B5=EC=8B=AC=204=EB=AA=A8?= =?UTF-8?q?=EB=93=9C=20=EC=A0=84=EB=A9=B4=20=EB=B0=B0=EC=B9=98=20+=20?= =?UTF-8?q?=EA=B3=A0=EA=B8=89=20=EB=AA=A8=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ChatWindow 권한 팝업에서 기본 노출 모드를 소극/적극/계획/완전 자동 4개로 재정렬 - 활용하지 않음(Deny), 질문 없이 진행(DontAsk)은 고급 모드 접힘 섹션으로 분리 - permission_advanced_modes 섹션 상태를 설정에 저장/복원하도록 연결 - README.md, docs/DEVELOPMENT.md에 2026-04-04 13:55(KST) 기준 이력 추가 - 품질 확인: dotnet build 통과(0 경고/0 오류), 테스트는 wpftmp 간헐 이슈로 --no-build 필터 86건 통과 --- README.md | 3 ++- docs/DEVELOPMENT.md | 20 ++++++++++++++++++ src/AxCopilot/Views/ChatWindow.xaml.cs | 28 ++++++++++++++++++++++++-- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d64372a..a823207 100644 --- a/README.md +++ b/README.md @@ -222,7 +222,7 @@ public class MyHandler : IActionHandler ### v0.7.3 — AX Agent 권한 코어 재구성 + 입력 계층 정리 -업데이트: 2026-04-04 13:40 (KST) +업데이트: 2026-04-04 13:55 (KST) | 분류 | 내용 | |------|------| @@ -280,6 +280,7 @@ public class MyHandler : IActionHandler | 권한 표시 카탈로그 분리 | 권한 모드 라벨/설명/아이콘/색을 `PermissionModePresentationCatalog`로 분리해 팝업 표면 기준을 단일화 | | 탭별 설정 해석기 도입 | `AgentTabSettingsResolver`를 추가해 Cowork/Code 분기(검증 활성/Code 전용 도구 비활성)를 단일 경로로 정리 | | L4 통합 회귀 보강 | `PermissionModeCatalogTests`/`PermissionModePresentationCatalogTests`/`SlashCommandCatalogTests`를 추가하고 deny 우선 규칙을 `OperationModePolicyTests`에 반영해 권한·슬래시 회귀망을 강화 | +| 권한 팝업 핵심 4모드 정렬 | 권한 팝업을 `소극 활용/적극 활용/계획 중심/완전 자동` 중심으로 단순화하고 `활용하지 않음/질문 없이 진행`은 `고급 모드` 접힘 섹션으로 분리 | | Slash palette 상태 분리 시작 | `ChatWindow`에 몰려 있던 slash 상태를 `SlashPaletteState`로 분리해 이후 Codex/Claude형 composer 개편 기반 마련 | | 런처 이미지 미리보기 추가 | `#` 클립보드 이미지 항목에서 `Shift+Enter`로 전용 미리보기 창을 열고, 줌·원본 해상도 확인·PNG/JPEG/BMP 저장·클립보드 복사를 지원 | | 검증 | `dotnet build` 경고 0 / 오류 0, `dotnet test` 436 passed / 0 failed | diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 0529c7b..052078d 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -3393,3 +3393,23 @@ else: ### 4) 품질 게이트 - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` 통과 (경고 0, 오류 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~PermissionModePresentationCatalogTests|FullyQualifiedName~SlashCommandCatalogTests|FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~OperationModeReadinessTests|FullyQualifiedName~ChatWindowSlashPolicyTests"` 통과 (88 passed, 0 failed). + +## 2026-04-04 추가 진행 기록 (연속 실행 30차: 권한 팝업 핵심 4모드 정렬) + +업데이트: 2026-04-04 13:55 (KST) + +### 1) 권한 팝업 구조 단순화 (claw-code 흐름 반영) +- 권한 팝업 최상단 노출 모드를 핵심 4개로 정리: + - 소극 활용 + - 적극 활용 + - 계획 중심 + - 완전 자동 +- `활용하지 않음`, `질문 없이 진행`은 `고급 모드` 접힘 섹션으로 분리. + +### 2) 고급 모드 접힘 상태 저장 +- `permission_advanced_modes` 키를 사용해 고급 모드 섹션의 펼침/접힘 상태를 설정에 저장하고 재오픈 시 복원. + +### 3) 품질 게이트 +- `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` 통과 (경고 0, 오류 0). +- 테스트 재빌드 시 WPF 임시 생성물 누락(CS2001, `AxCopilot_*_wpftmp.csproj`)이 간헐 발생하여 다음으로 회귀 확인: + - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --no-build --filter "FullyQualifiedName~ChatWindowSlashPolicyTests|FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~PermissionModePresentationCatalogTests|FullyQualifiedName~OperationModeReadinessTests"` 통과 (86 passed, 0 failed). diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs index a5fab71..3099edc 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml.cs +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -1901,7 +1901,18 @@ public partial class ChatWindow : Window }; } - var coreLevels = PermissionModePresentationCatalog.Ordered; + var coreLevels = PermissionModePresentationCatalog.Ordered + .Where(x => + string.Equals(x.Mode, PermissionModeCatalog.Default, StringComparison.OrdinalIgnoreCase) || + string.Equals(x.Mode, PermissionModeCatalog.AcceptEdits, StringComparison.OrdinalIgnoreCase) || + string.Equals(x.Mode, PermissionModeCatalog.Plan, StringComparison.OrdinalIgnoreCase) || + string.Equals(x.Mode, PermissionModeCatalog.BypassPermissions, StringComparison.OrdinalIgnoreCase)) + .ToList(); + var advancedLevels = PermissionModePresentationCatalog.Ordered + .Where(x => + string.Equals(x.Mode, PermissionModeCatalog.Deny, StringComparison.OrdinalIgnoreCase) || + string.Equals(x.Mode, PermissionModeCatalog.DontAsk, StringComparison.OrdinalIgnoreCase)) + .ToList(); var current = PermissionModeCatalog.NormalizeGlobalMode(_settings.Settings.Llm.FilePermission); void AddPermissionRows(Panel container, IEnumerable levels) { @@ -2010,7 +2021,7 @@ public partial class ChatWindow : Window PermissionItems.Children.Add(new TextBlock { - Text = "권한 모드", + Text = "핵심 권한 모드", FontSize = 10.5, FontWeight = FontWeights.SemiBold, Foreground = secondaryText, @@ -2018,6 +2029,19 @@ public partial class ChatWindow : Window }); AddPermissionRows(PermissionItems, coreLevels); + if (advancedLevels.Count > 0) + { + var advancedPanel = new StackPanel(); + AddPermissionRows(advancedPanel, advancedLevels); + PermissionItems.Children.Add(CreateCollapsibleSection( + "permission_advanced_modes", + "\uE9D9", + "고급 모드", + advancedPanel, + expanded: GetPermissionPopupSectionExpanded("permission_advanced_modes", false), + accentHex: "#64748B")); + } + PermissionItems.Children.Add(CreateCollapsibleSection( "permission_summary", "\uE946",