트레이 AX Agent 우선 진입과 설정 반영 fan-out 보강
Some checks failed
Release Gate / gate (push) Has been cancelled
Some checks failed
Release Gate / gate (push) Has been cancelled
- 트레이 우클릭 메뉴 상단에 AX Copilot 버전 헤더를 추가 - 트레이 좌클릭 시 AI 기능 활성화 상태에서는 AX Agent 창을 우선 열도록 변경 - 메인 설정 저장 완료 후 열린 AX Agent 창이 테마, 모델, 권한, 데이터 활용, 하단 composer 라벨을 즉시 다시 반영하도록 fan-out 경로 추가 - DraftQueue kind 분류를 message/command/steering/direct/followup 기준으로 보강하고 전송 버튼은 일반 메시지 전송 경로를 사용하도록 정리 - README.md, docs/DEVELOPMENT.md, docs/AGENT_ROADMAP.md 이력 갱신 검증 - 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:
@@ -8,6 +8,13 @@ Windows 전용 시맨틱 런처 & 워크스페이스 매니저
|
|||||||
`docs/claw-code-parity-plan.md`
|
`docs/claw-code-parity-plan.md`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- 업데이트: 2026-04-04 23:14 (KST)
|
||||||
|
- 트레이 아이콘 우클릭 메뉴 상단에 `AX Copilot v.0.7.3` 버전 헤더를 추가하고, 좌클릭 시에는 런처보다 AX Agent를 우선 열도록 정리했습니다. AI 기능이 꺼져 있을 때만 기존처럼 런처를 열도록 유지했습니다.
|
||||||
|
- Enter/전송 버튼/슬래시 명령의 DraftQueue kind 분류를 다시 정리해 일반 입력은 `message`, 슬래시 입력은 `command`, 조정 입력은 `steering`, 직접 실행 요청은 `direct`로 더 자연스럽게 나뉘도록 보강했습니다.
|
||||||
|
- 메인 설정 저장 완료 시 열려 있는 AX Agent 창이 테마/권한/데이터 활용/모델 라벨/하단 바를 즉시 다시 읽어오도록 fan-out 경로를 추가해 설정과 실제 실행 화면의 어긋남을 줄였습니다.
|
||||||
|
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 주요 기능 (프리픽스 치트시트)
|
## 주요 기능 (프리픽스 치트시트)
|
||||||
|
|||||||
@@ -93,3 +93,7 @@
|
|||||||
- composer 컨텍스트 카드를 hover 중심의 간단 표기(`%` + `K/M` 사용량)로 정리하고, 최대 컨텍스트 설정 상한을 1M까지 확장함.
|
- composer 컨텍스트 카드를 hover 중심의 간단 표기(`%` + `K/M` 사용량)로 정리하고, 최대 컨텍스트 설정 상한을 1M까지 확장함.
|
||||||
- 업데이트: 2026-04-04 21:02 (KST)
|
- 업데이트: 2026-04-04 21:02 (KST)
|
||||||
- AX Agent 서비스 설정의 `Gemini/Claude`도 모델 칩 선택 구조로 통일하고, composer 모델 버튼을 `서비스 · 모델` 문법으로 맞춰 설정-실행 흐름의 시각 언어를 정리함.
|
- AX Agent 서비스 설정의 `Gemini/Claude`도 모델 칩 선택 구조로 통일하고, composer 모델 버튼을 `서비스 · 모델` 문법으로 맞춰 설정-실행 흐름의 시각 언어를 정리함.
|
||||||
|
- 업데이트: 2026-04-04 23:14 (KST)
|
||||||
|
- 트레이 좌클릭 기본 진입점을 AX Agent로 전환하고, 우클릭 메뉴 상단에 앱 버전 헤더를 추가해 AX Agent 중심 진입 흐름을 강화함.
|
||||||
|
- 메인 설정 저장 완료 후 열린 AX Agent 창이 즉시 테마/모델/권한/하단 상태줄을 다시 읽어오도록 fan-out 경로를 추가해 설정 반영 지연을 줄임.
|
||||||
|
- DraftQueue kind 분류를 message/command/steering/direct/followup 기준으로 재정리해 큐 타입과 실제 입력 성격이 더 잘 맞도록 보강함.
|
||||||
|
|||||||
@@ -4060,3 +4060,11 @@ ow + toggle 시각 언어로 다시 정렬했다.
|
|||||||
- 브랜치/워크트리 패널에는 공통 요약 strip을 추가해 현재 브랜치, 파일 상태, 최근 브랜치 수, 로컬/워크트리 모드, 변형 개수를 같은 시각 언어로 보여주도록 맞췄다.
|
- 브랜치/워크트리 패널에는 공통 요약 strip을 추가해 현재 브랜치, 파일 상태, 최근 브랜치 수, 로컬/워크트리 모드, 변형 개수를 같은 시각 언어로 보여주도록 맞췄다.
|
||||||
- 저장소 루트 `.gitignore`에는 빌드 산출물(bin/obj/publish), IDE 파일(.vs, *.user, *.suo), 운영체제 잡파일(Thumbs.db, Desktop.ini, .DS_Store), 비밀정보 패턴(*.env, credentials.json)을 추가해 불필요한 추적을 줄였다.
|
- 저장소 루트 `.gitignore`에는 빌드 산출물(bin/obj/publish), IDE 파일(.vs, *.user, *.suo), 운영체제 잡파일(Thumbs.db, Desktop.ini, .DS_Store), 비밀정보 패턴(*.env, credentials.json)을 추가해 불필요한 추적을 줄였다.
|
||||||
- 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (경고 0 / 오류 0)
|
- 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (경고 0 / 오류 0)
|
||||||
|
|
||||||
|
### 2026-04-04 추가 진행 기록 (연속 실행 75차: 트레이 진입 흐름과 설정 fan-out 보강)
|
||||||
|
- 업데이트: 2026-04-04 23:14 (KST)
|
||||||
|
- 트레이 메뉴 상단에 현재 앱 버전을 `AX Copilot v.0.7.3` 형식의 헤더로 표기해 우클릭 시 제품 버전을 바로 확인할 수 있게 했다.
|
||||||
|
- 트레이 아이콘 좌클릭 동작은 AI 기능 활성화 시 AX Agent 창을 우선 열고, AI 기능이 비활성화된 경우에만 AX Commander를 열도록 바꿔 사용 흐름을 AX Agent 중심으로 정리했다.
|
||||||
|
- 메인 설정 저장 완료 시 열려 있는 AX Agent 창이 즉시 테마, 모델, 권한, 데이터 활용, overlay/inline 빠른 설정, 하단 composer 라벨을 다시 읽어오도록 `RefreshFromSavedSettings()` fan-out 경로를 추가했다.
|
||||||
|
- DraftQueue kind 판정은 일반 입력(message), 슬래시 명령(command), 조정 입력(steering), 직접 실행 요청(direct), 후속 작업(followup)이 실제 입력 형태와 더 일치하도록 보강했고, 전송 버튼은 일반 메시지 전송 경로를 사용하도록 정리했다.
|
||||||
|
- 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (경고 0 / 오류 0)
|
||||||
|
|||||||
@@ -458,6 +458,11 @@ public partial class App : System.Windows.Application
|
|||||||
|
|
||||||
private void SetupTrayIcon(PluginHost pluginHost, SettingsService settings)
|
private void SetupTrayIcon(PluginHost pluginHost, SettingsService settings)
|
||||||
{
|
{
|
||||||
|
var version = typeof(App).Assembly.GetName().Version;
|
||||||
|
var versionText = version == null
|
||||||
|
? "AX Copilot v.0.0.0"
|
||||||
|
: $"AX Copilot v.{version.Major}.{version.Minor}.{version.Build}";
|
||||||
|
|
||||||
_trayIcon = new NotifyIcon
|
_trayIcon = new NotifyIcon
|
||||||
{
|
{
|
||||||
Text = "AX Copilot",
|
Text = "AX Copilot",
|
||||||
@@ -468,6 +473,7 @@ public partial class App : System.Windows.Application
|
|||||||
// ─── WPF 커스텀 트레이 메뉴 구성 ──────────────────────────────────
|
// ─── WPF 커스텀 트레이 메뉴 구성 ──────────────────────────────────
|
||||||
_trayMenu = new Views.TrayMenuWindow();
|
_trayMenu = new Views.TrayMenuWindow();
|
||||||
_trayMenu
|
_trayMenu
|
||||||
|
.AddHeader(versionText)
|
||||||
.AddItem("\uE7C5", "AX Commander 호출하기", () =>
|
.AddItem("\uE7C5", "AX Commander 호출하기", () =>
|
||||||
Dispatcher.Invoke(() => _launcher?.Show()))
|
Dispatcher.Invoke(() => _launcher?.Show()))
|
||||||
.AddItem("\uE8BD", "AX Agent 대화하기", () =>
|
.AddItem("\uE8BD", "AX Agent 대화하기", () =>
|
||||||
@@ -522,7 +528,15 @@ public partial class App : System.Windows.Application
|
|||||||
_trayIcon.MouseClick += (_, e) =>
|
_trayIcon.MouseClick += (_, e) =>
|
||||||
{
|
{
|
||||||
if (e.Button == System.Windows.Forms.MouseButtons.Left)
|
if (e.Button == System.Windows.Forms.MouseButtons.Left)
|
||||||
Dispatcher.Invoke(() => _launcher?.Show());
|
{
|
||||||
|
Dispatcher.Invoke(() =>
|
||||||
|
{
|
||||||
|
if (settings.Settings.AiEnabled)
|
||||||
|
OpenAiChat();
|
||||||
|
else
|
||||||
|
_launcher?.Show();
|
||||||
|
});
|
||||||
|
}
|
||||||
else if (e.Button == System.Windows.Forms.MouseButtons.Right)
|
else if (e.Button == System.Windows.Forms.MouseButtons.Right)
|
||||||
Dispatcher.Invoke(() => _trayMenu?.ShowWithUpdate());
|
Dispatcher.Invoke(() => _trayMenu?.ShowWithUpdate());
|
||||||
};
|
};
|
||||||
@@ -752,6 +766,7 @@ public partial class App : System.Windows.Application
|
|||||||
_settings.Settings.ScreenCapture.GlobalHotkeyEnabled);
|
_settings.Settings.ScreenCapture.GlobalHotkeyEnabled);
|
||||||
}
|
}
|
||||||
_worktimeReminder?.RestartTimer();
|
_worktimeReminder?.RestartTimer();
|
||||||
|
_chatWindow?.RefreshFromSavedSettings();
|
||||||
};
|
};
|
||||||
|
|
||||||
_settingsWindow.Show();
|
_settingsWindow.Show();
|
||||||
|
|||||||
@@ -5161,7 +5161,7 @@ public partial class ChatWindow : Window
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void BtnSend_Click(object sender, RoutedEventArgs e)
|
private void BtnSend_Click(object sender, RoutedEventArgs e)
|
||||||
=> QueueComposerDraft(priority: "now", explicitKind: "direct", startImmediatelyWhenIdle: true);
|
=> QueueComposerDraft(priority: "now", explicitKind: null, startImmediatelyWhenIdle: true);
|
||||||
|
|
||||||
private void InputBox_PreviewKeyDown(object sender, KeyEventArgs e)
|
private void InputBox_PreviewKeyDown(object sender, KeyEventArgs e)
|
||||||
{
|
{
|
||||||
@@ -13942,6 +13942,23 @@ public partial class ChatWindow : Window
|
|||||||
}, DispatcherPriority.Input);
|
}, DispatcherPriority.Input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void RefreshFromSavedSettings()
|
||||||
|
{
|
||||||
|
Dispatcher.BeginInvoke(() =>
|
||||||
|
{
|
||||||
|
ApplyAgentThemeResources();
|
||||||
|
LoadConversationSettings();
|
||||||
|
UpdatePermissionUI();
|
||||||
|
UpdateDataUsageUI();
|
||||||
|
UpdateModelLabel();
|
||||||
|
RefreshInlineSettingsPanel();
|
||||||
|
RefreshOverlaySettingsPanel();
|
||||||
|
RefreshContextUsageVisual();
|
||||||
|
UpdateTabUI();
|
||||||
|
BuildBottomBar();
|
||||||
|
}, DispatcherPriority.Input);
|
||||||
|
}
|
||||||
|
|
||||||
private void BtnOverlaySettingsClose_Click(object sender, RoutedEventArgs e)
|
private void BtnOverlaySettingsClose_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
ApplyOverlaySettingsChanges(showToast: false, closeOverlay: true);
|
ApplyOverlaySettingsChanges(showToast: false, closeOverlay: true);
|
||||||
@@ -17055,12 +17072,23 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
|
|||||||
|
|
||||||
private static string InferDraftKind(string text, string? explicitKind = null)
|
private static string InferDraftKind(string text, string? explicitKind = null)
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrWhiteSpace(explicitKind))
|
|
||||||
return explicitKind.Trim().ToLowerInvariant();
|
|
||||||
|
|
||||||
var trimmed = text?.Trim() ?? "";
|
var trimmed = text?.Trim() ?? "";
|
||||||
|
var requestedKind = explicitKind?.Trim().ToLowerInvariant();
|
||||||
|
|
||||||
|
if (requestedKind is "followup" or "steering")
|
||||||
|
return requestedKind;
|
||||||
|
|
||||||
if (trimmed.StartsWith("/", StringComparison.OrdinalIgnoreCase))
|
if (trimmed.StartsWith("/", StringComparison.OrdinalIgnoreCase))
|
||||||
return "command";
|
return "command";
|
||||||
|
|
||||||
|
if (requestedKind is "direct" or "message")
|
||||||
|
return requestedKind;
|
||||||
|
|
||||||
|
if (trimmed.StartsWith("steer:", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
trimmed.StartsWith("@steer ", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
trimmed.StartsWith("조정:", StringComparison.OrdinalIgnoreCase))
|
||||||
|
return "steering";
|
||||||
|
|
||||||
return "message";
|
return "message";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -17111,6 +17139,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
|
|||||||
{
|
{
|
||||||
"command" => "명령이 대기열에 추가되었습니다.",
|
"command" => "명령이 대기열에 추가되었습니다.",
|
||||||
"direct" => "직접 실행 요청이 대기열에 추가되었습니다.",
|
"direct" => "직접 실행 요청이 대기열에 추가되었습니다.",
|
||||||
|
"steering" => "조정 요청이 대기열에 추가되었습니다.",
|
||||||
|
"followup" => "후속 작업이 대기열에 추가되었습니다.",
|
||||||
_ => "메시지가 대기열에 추가되었습니다.",
|
_ => "메시지가 대기열에 추가되었습니다.",
|
||||||
};
|
};
|
||||||
ShowToast(toast);
|
ShowToast(toast);
|
||||||
|
|||||||
@@ -40,6 +40,22 @@ public partial class TrayMenuWindow : Window
|
|||||||
|
|
||||||
// ─── 아이템 빌더 API ─────────────────────────────────────────────────
|
// ─── 아이템 빌더 API ─────────────────────────────────────────────────
|
||||||
|
|
||||||
|
/// <summary>일반 메뉴 항목을 추가합니다.</summary>
|
||||||
|
public TrayMenuWindow AddHeader(string text)
|
||||||
|
{
|
||||||
|
var label = new TextBlock
|
||||||
|
{
|
||||||
|
Text = text,
|
||||||
|
FontSize = 12,
|
||||||
|
FontWeight = FontWeights.SemiBold,
|
||||||
|
Margin = new Thickness(12, 2, 12, 6),
|
||||||
|
};
|
||||||
|
label.SetResourceReference(TextBlock.ForegroundProperty, "SecondaryText");
|
||||||
|
MenuPanel.Children.Add(label);
|
||||||
|
AddSeparator();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>일반 메뉴 항목을 추가합니다.</summary>
|
/// <summary>일반 메뉴 항목을 추가합니다.</summary>
|
||||||
public TrayMenuWindow AddItem(string glyph, string text, Action onClick)
|
public TrayMenuWindow AddItem(string glyph, string text, Action onClick)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user