빌드 부산물 추적 해제와 AX Agent 대기열·composer UI 정리
Some checks failed
Release Gate / gate (push) Has been cancelled

- .gitignore에 bin/obj/publish 및 IDE/OS/비밀정보 패턴 추가
- Git 인덱스에서 publish 및 src 하위 bin/obj 빌드 부산물 추적을 해제하여 저장소 노이즈를 정리
- DraftQueue를 실행 대기/최근 결과 섹션과 상태 요약 pill 구조로 재정리
- composer 상단 모델/컨텍스트/프리셋 줄과 하단 작업 위치 칩 UI를 더 평평한 시각 언어로 통일
- 워크스페이스·브랜치·워크트리 패널에 공통 row 및 요약 strip을 적용해 panel UX를 정돈
- README.md와 docs/DEVELOPMENT.md, docs/AGENT_ROADMAP.md, AGENTS.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:
2026-04-04 23:03:42 +09:00
parent a027ea4f9a
commit 72a8c0d541
908 changed files with 5661 additions and 77215 deletions

View File

@@ -17,12 +17,10 @@ public static class PermissionModeCatalog
public static readonly IReadOnlyList<string> UserSelectableModes = new[]
{
Deny,
Default,
AcceptEdits,
Plan,
BypassPermissions,
DontAsk,
};
/// <summary>
@@ -56,11 +54,11 @@ public static class PermissionModeCatalog
"fullauto" => BypassPermissions,
"완전자동" => BypassPermissions,
"완전 자동" => BypassPermissions,
"dontask" => DontAsk,
"don't ask" => DontAsk,
"silent" => DontAsk,
"질문없이진행" => DontAsk,
"질문 없이 진행" => DontAsk,
"dontask" => BypassPermissions,
"don't ask" => BypassPermissions,
"silent" => BypassPermissions,
"질문없이진행" => BypassPermissions,
"질문 없이 진행" => BypassPermissions,
"allow" => AcceptEdits,
"none" => Deny,
"disabled" => Deny,
@@ -115,7 +113,6 @@ public static class PermissionModeCatalog
var normalized = NormalizeGlobalMode(mode);
return !IsAcceptEdits(normalized)
&& !IsBypassPermissions(normalized)
&& !IsDontAsk(normalized)
&& !string.Equals(normalized, Deny, StringComparison.OrdinalIgnoreCase);
}
@@ -128,7 +125,6 @@ public static class PermissionModeCatalog
AcceptEdits => "편집 자동 승인",
Plan => "계획 모드",
BypassPermissions => "권한 건너뛰기",
DontAsk => "질문 없이 진행",
Deny => "읽기 전용",
_ => normalized,
};

View File

@@ -11,12 +11,6 @@ internal static class PermissionModePresentationCatalog
{
public static readonly IReadOnlyList<PermissionModePresentation> Ordered = new[]
{
new PermissionModePresentation(
PermissionModeCatalog.Deny,
"\uE711",
"읽기 전용",
"파일 읽기만 허용하고 생성/수정/삭제는 차단합니다.",
"#107C10"),
new PermissionModePresentation(
PermissionModeCatalog.Default,
"\uE8D7",
@@ -39,14 +33,8 @@ internal static class PermissionModePresentationCatalog
PermissionModeCatalog.BypassPermissions,
"\uE814",
"권한 건너뛰기",
"모든 권한을 허용합니다.",
"파일 편집과 명령 실행까지 모두 자동 허용합니다.",
"#B45309"),
new PermissionModePresentation(
PermissionModeCatalog.DontAsk,
"\uE8A5",
"질문 없이 진행",
"권한 질문 없이 진행합니다. 자동 실행 범위를 점검하세요.",
"#B91C1C"),
};
public static PermissionModePresentation Resolve(string? mode)
@@ -54,6 +42,6 @@ internal static class PermissionModePresentationCatalog
var normalized = PermissionModeCatalog.NormalizeGlobalMode(mode);
return Ordered.FirstOrDefault(item =>
string.Equals(item.Mode, normalized, StringComparison.OrdinalIgnoreCase))
?? Ordered[1];
?? Ordered[0];
}
}

View File

@@ -506,7 +506,7 @@ public sealed class AppStateService
if (string.IsNullOrWhiteSpace(conversation?.Permission))
effective = defaultMode;
var risk = PermissionModeCatalog.IsBypassPermissions(effective) || PermissionModeCatalog.IsDontAsk(effective)
var risk = PermissionModeCatalog.IsBypassPermissions(effective)
? "critical"
: PermissionModeCatalog.IsAcceptEdits(effective)
? "high"
@@ -522,7 +522,6 @@ public sealed class AppStateService
"Deny" => "파일 읽기만 허용하고 생성/수정/삭제는 차단합니다.",
"Plan" => "계획/승인 흐름을 우선 적용한 뒤 파일 작업을 진행합니다.",
"BypassPermissions" => "모든 권한 확인을 생략합니다. 주의해서 사용해야 합니다.",
"DontAsk" => "권한 질문 없이 진행합니다. 자동 실행 범위를 반드시 점검해야 합니다.",
_ => "파일 작업 전마다 사용자 확인을 요청합니다.",
};

View File

@@ -438,7 +438,7 @@ public sealed class ChatSessionStateService
return conv;
}
public DraftQueueItem? EnqueueDraft(string tab, string text, string priority = "next", ChatStorageService? storage = null)
public DraftQueueItem? EnqueueDraft(string tab, string text, string priority = "next", ChatStorageService? storage = null, string kind = "message")
{
var trimmed = text?.Trim() ?? "";
if (string.IsNullOrWhiteSpace(trimmed))
@@ -446,7 +446,7 @@ public sealed class ChatSessionStateService
var conv = EnsureCurrentConversation(tab);
conv.DraftQueueItems ??= new List<DraftQueueItem>();
var item = _draftQueue.CreateItem(trimmed, priority);
var item = _draftQueue.CreateItem(trimmed, priority, kind);
conv.DraftQueueItems.Add(item);
TouchConversation(storage, tab);
return item;

View File

@@ -20,12 +20,13 @@ public sealed class DraftQueueService
public DateTime? NextReadyAt { get; init; }
}
public DraftQueueItem CreateItem(string text, string priority = "next")
public DraftQueueItem CreateItem(string text, string priority = "next", string kind = "message")
{
return new DraftQueueItem
{
Text = text.Trim(),
Priority = NormalizePriority(priority),
Kind = string.IsNullOrWhiteSpace(kind) ? "message" : kind.Trim().ToLowerInvariant(),
State = "queued",
CreatedAt = DateTime.Now,
};

View File

@@ -67,7 +67,7 @@ public static class TokenEstimator
public static string Format(int count) => count switch
{
>= 1_000_000 => $"{count / 1_000_000.0:0.#}M",
>= 1_000 => $"{count / 1_000.0:0.#}k",
>= 1_000 => $"{count / 1_000.0:0.#}K",
_ => count.ToString(),
};