diff --git a/README.md b/README.md index 32e3981..c576116 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # AX Commander +- 업데이트: 2026-04-15 17:41 (KST) +- `~` 워크스페이스 저장/복원에 파일 탐색기와 메모장 상태 복원을 추가했습니다. `src/AxCopilot/Core/AppWorkspaceStateHelper.cs`가 파일 탐색기 현재 폴더 경로와 메모장 열린 파일 경로를 best-effort로 수집하고, `src/AxCopilot/Core/ProcessCommandLineHelper.cs`가 프로세스 명령줄 파싱을 공용화합니다. +- `src/AxCopilot/Core/ContextManager.cs`는 저장된 탐색기/메모장 상태가 현재 창 제목과 다를 때 새 창을 띄워 원래 경로와 파일을 다시 열고, 새 창 연속 실행 시에는 CPU·메모리 부하와 이미 실행한 창 수를 반영한 적응형 지연을 넣어 복원 속도를 자동 조절합니다. +- `src/AxCopilot/Models/AppSettings.cs`, `src/AxCopilot/ViewModels/SettingsViewModel.cs`, `src/AxCopilot/Views/SettingsWindow.xaml`에 `복원 속도 자동 조절`, `복원 기본 간격`, `복원 최대 간격` 설정을 추가했습니다. +- 테스트를 `src/AxCopilot.Tests/Core/ContextManagerTests.cs`, `src/AxCopilot.Tests/Services/SettingsServiceTests.cs`에 확장했고, `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_workspace_app_restore\\ -p:IntermediateOutputPath=obj\\verify_workspace_app_restore\\` 경고 0 / 오류 0, `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "WorkspaceHandlerTests|ContextManagerTests|SettingsServiceTests" -p:OutputPath=bin\\verify_workspace_app_restore_tests\\ -p:IntermediateOutputPath=obj\\verify_workspace_app_restore_tests\\` 54개 통과를 확인했습니다. + - 업데이트: 2026-04-15 17:26 (KST) - `~` 워크스페이스 저장/복원에 브라우저 상태 복원을 추가했습니다. `src/AxCopilot/Core/BrowserWorkspaceStateHelper.cs`가 Edge/Chrome/Whale/Brave/Opera/Firefox 창에서 프로필 인자와 탭 URL, 활성 탭 인덱스를 best-effort로 수집하고, `src/AxCopilot/Core/ContextManager.cs`가 브라우저 상태가 저장된 경우 새 창을 띄워 동일한 탭 묶음을 다시 열어 배치합니다. - `src/AxCopilot/Models/AppSettings.cs`, `src/AxCopilot/ViewModels/SettingsViewModel.cs`, `src/AxCopilot/Views/SettingsWindow.xaml`에 `브라우저 상태 복원` 토글을 연결해 저장 시 탭 포커스 이동이 부담되는 환경에서는 기능을 끌 수 있게 했습니다. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 7e32d06..d2f49b8 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -1,1503 +1,1473 @@ -업데이트: 2026-04-14 19:50 (KST) -업데이트: 2026-04-15 12:51 (KST) -- 업데이트: 2026-04-15 18:20 (KST) -- README, 로드맵, 실행 계획 문서에서 비교·모사 표현을 줄이고 AX 기준 개발 계획과 검증 기록 중심으로 문서명과 설명을 정리했습니다. -- 업데이트: 2026-04-15 16:49 (KST) -- 런처 `~` 워크스페이스 복원 경로를 재검토하고, 같은 `exe`의 첫 번째 창 하나를 모든 스냅샷에 재사용하던 복원 매칭 결함을 수정했습니다. 기존 `src/AxCopilot/Core/ContextManager.cs`는 각 스냅샷마다 `exe`만 비교해 HWND를 찾았기 때문에, Chrome/Edge처럼 여러 창이 떠 있을 때 한 창만 반복 이동되며 배치가 무너지기 쉬웠습니다. -- `src/AxCopilot/Core/ContextManager.cs`는 열린 창 후보를 수집한 뒤 `exe + 제목 매칭 점수 + 이미 사용한 핸들 제외` 기준으로 창을 배정하도록 바꿨습니다. exact title을 최우선으로 두고, 브라우저 suffix 제거/토큰 비교를 통해 비슷한 제목도 보조적으로 매칭합니다. 이미 다른 스냅샷에 배정된 핸들은 다시 쓰지 않아 multi-window 복원 품질을 높였습니다. -- `src/AxCopilot/Handlers/WorkspaceHandler.cs`는 문서에만 있었던 `~restore <이름>`과 `~list`를 실제 핸들러에서도 지원하도록 보완했습니다. 프로필 목록은 최근 생성 순으로 정렬하고 각 항목이 곧바로 restore action을 가지도록 정리했습니다. -- 테스트: `src/AxCopilot.Tests/Handlers/WorkspaceHandlerTests.cs`, `src/AxCopilot.Tests/Core/ContextManagerTests.cs` -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_workspace_restore_review\\ -p:IntermediateOutputPath=obj\\verify_workspace_restore_review\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "WorkspaceHandlerTests|ContextManagerTests" -p:OutputPath=bin\\verify_workspace_restore_review_tests\\ -p:IntermediateOutputPath=obj\\verify_workspace_restore_review_tests\\` 통과 6 -- 업데이트: 2026-04-15 16:12 (KST) -- 권한 경로 해석과 세션 승인 재사용을 workspace-aware 기준으로 정리했습니다. 상대 경로 `index.html` 같은 대상이 권한 팝업/사내 모드 외부 경로 판정에서 프로세스 현재 폴더(`dist`) 기준으로 잘못 절대경로화되면서, 팝업 표시가 틀어지고 `이번 실행 동안 허용`도 raw/absolute 경로 불일치로 재사용되지 않던 문제를 수정했습니다. -- `src/AxCopilot/Services/Agent/IAgentTool.cs`는 `ResolvePathForWorkspaceCheck(...)`를 추가해 `IsPathAllowed(...)`, `IsOutsideWorkspace(...)`가 상대 경로를 현재 `WorkFolder` 기준으로 절대경로화한 뒤 판정하도록 변경했습니다. 사내 모드에서도 워크스페이스 하위 상대 경로는 외부 경로로 오판하지 않습니다. -- `src/AxCopilot/Views/ChatWindow.xaml.cs`는 권한 콜백에서 `RuntimeWorkFolderOverride` 또는 현재 대화의 `WorkFolder`를 사용해 대상 경로를 먼저 정규화하고, 자동 승인 재사용, 외부 경로 notice, 권한 팝업 표시, 세션 규칙 저장에 모두 같은 절대경로를 사용하도록 정리했습니다. -- 테스트: `src/AxCopilot.Tests/Services/OperationModePolicyTests.cs`에 `AgentContext_CheckToolPermissionAsync_InternalMode_BypassPermissions_AllowsRelativeWorkspacePathWithoutPrompt` 추가 -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_permission_workspace_path\\ -p:IntermediateOutputPath=obj\\verify_permission_workspace_path\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "OperationModePolicyTests|AgentLoopE2ETests" -p:OutputPath=bin\\verify_permission_workspace_path_tests\\ -p:IntermediateOutputPath=obj\\verify_permission_workspace_path_tests\\` 통과 34 -- 업데이트: 2026-04-15 15:56 (KST) -- AX Agent 상단 라이브 진행 카드 복원 가드를 추가했습니다. `src/AxCopilot/Views/ChatWindow.LiveProgressPresentation.cs`에 `EnsureAgentLiveCardVisible(...)`를 만들고, Cowork/Code 실행 중 라이브 카드가 아직 생성되지 않았거나 transcript 재구성으로 빠졌을 때 즉시 재생성/재부착되도록 했습니다. -- `src/AxCopilot/Views/ChatWindow.xaml.cs`는 agent event 수신과 live hint 시작 시 eligible 탭이면 위 helper를 먼저 호출한 뒤 live card 상태를 갱신하도록 바꿨습니다. 메인 루프2 이후 이벤트는 오는데 채팅창 바로 위 라이브 카드만 사라지는 회귀를 막는 목적입니다. -- `src/AxCopilot/Views/ChatWindow.V2Rendering.cs`는 부분/전체 transcript 재렌더링 중 `_v2LiveContainer` 존재 여부만 보지 않고 `_isStreaming` 상태면 helper를 통해 라이브 카드를 자동 복원합니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_live_card_guard\\ -p:IntermediateOutputPath=obj\\verify_live_card_guard\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ChatWindowSlashPolicyTests" -p:OutputPath=bin\\verify_live_card_guard_tests\\ -p:IntermediateOutputPath=obj\\verify_live_card_guard_tests\\` 통과 49 -- AX Agent 진행 이력 정제를 위해 `src/AxCopilot/Services/Agent/AgentProgressSummarySanitizer.cs`를 추가했습니다. 스트리밍 중간 preview, `Thinking` 요약, `[이전 도구 호출: ...]` transcript 꼬리, 숫자/대괄호 같은 저품질 조각 문자열을 공통 규칙으로 정리합니다. -- `src/AxCopilot/Services/Agent/AgentLoopService.cs`는 스트리밍 `TextDelta` preview emit과 일반 `Thinking` emit 전에 정제기를 적용합니다. 정제 후 비어버린 summary는 이벤트 자체를 만들지 않아, 중간 응답의 `1`, `[`, `file_read]` 같은 파편이 timeline/history에 쌓이지 않습니다. -- `src/AxCopilot/Views/ChatWindow.V2LiveProgressPresentation.cs`, `src/AxCopilot/Views/ChatWindow.V2AgentEventPresentation.cs`, `src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs`는 렌더링 직전에도 같은 정제 로직을 사용합니다. 기존 세션의 오래된 low-signal thinking event가 다시 그려질 때도 빈약한 단문을 숨기고 process feed에는 `진행 내용 정리`로 폴백합니다. -- 테스트: `src/AxCopilot.Tests/Services/AgentProgressSummarySanitizerTests.cs` 추가, `src/AxCopilot.Tests/Services/AgentLoopResponseClassificationServiceTests.cs` 확장 -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_agent_progress_cleanup\\ -p:IntermediateOutputPath=obj\\verify_agent_progress_cleanup\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentProgressSummarySanitizerTests|AgentLoopResponseClassificationServiceTests|AgentStatusNarrativeCatalogTests|AgentLoopIterationPreparationServiceTests|AgentToolResultBudgetTests|ChatStorageServiceTests" -p:OutputPath=bin\\verify_agent_progress_cleanup_tests\\ -p:IntermediateOutputPath=obj\\verify_agent_progress_cleanup_tests\\` 통과 22 +업데이트: 2026-04-15 17:41 (KST) +- 워크스페이스 저장/복원 경로를 확장했습니다. `src/AxCopilot/Core/AppWorkspaceStateHelper.cs`는 파일 탐색기 현재 폴더 경로와 메모장 열린 파일 경로를 best-effort로 저장하고, `src/AxCopilot/Core/ProcessCommandLineHelper.cs`는 브라우저/메모장 공용 프로세스 명령줄 파싱을 담당합니다. +- `src/AxCopilot/Core/ContextManager.cs`는 브라우저 외에도 탐색기/메모장 상태가 저장된 창을 새로 실행해 해당 경로/파일을 다시 열 수 있게 했고, 복원 중 새 창을 연속 실행할 때는 CPU 사용률·메모리 사용률·이미 실행한 창 수를 반영한 적응형 지연을 넣어 저사양 PC에서 복원 폭주를 줄이도록 했습니다. +- `src/AxCopilot/Models/AppSettings.cs`, `src/AxCopilot/ViewModels/SettingsViewModel.cs`, `src/AxCopilot/Views/SettingsWindow.xaml`에는 워크스페이스 복원 속도 제어 설정(`복원 속도 자동 조절`, `복원 기본 간격`, `복원 최대 간격`)을 추가했습니다. +- `src/AxCopilot.Tests/Core/ContextManagerTests.cs`, `src/AxCopilot.Tests/Services/SettingsServiceTests.cs`에 탐색기/메모장 launch plan, 상태 직렬화, 복원 지연 계산 회귀 테스트를 추가했습니다. +- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_workspace_app_restore\\ -p:IntermediateOutputPath=obj\\verify_workspace_app_restore\\` 경고 0 / 오류 0 +- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "WorkspaceHandlerTests|ContextManagerTests|SettingsServiceTests" -p:OutputPath=bin\\verify_workspace_app_restore_tests\\ -p:IntermediateOutputPath=obj\\verify_workspace_app_restore_tests\\` 통과 54 +?낅뜲?댄듃: 2026-04-14 19:50 (KST) +?낅뜲?댄듃: 2026-04-15 12:51 (KST) +- ?낅뜲?댄듃: 2026-04-15 18:20 (KST) +- README, 濡쒕뱶留? ?ㅽ뻾 怨꾪쉷 臾몄꽌?먯꽌 鍮꾧탳쨌紐⑥궗 ?쒗쁽??以꾩씠怨?AX 湲곗? 媛쒕컻 怨꾪쉷怨?寃€利?湲곕줉 以묒떖?쇰줈 臾몄꽌紐낃낵 ?ㅻ챸???뺣━?덉뒿?덈떎. +- ?낅뜲?댄듃: 2026-04-15 16:49 (KST) +- ?곗쿂 `~` ?뚰겕?ㅽ럹?댁뒪 蹂듭썝 寃쎈줈瑜??ш??좏븯怨? 媛숈? `exe`??泥?踰덉㎏ 李??섎굹瑜?紐⑤뱺 ?ㅻ깄?룹뿉 ?ъ궗?⑺븯??蹂듭썝 留ㅼ묶 寃고븿???섏젙?덉뒿?덈떎. 湲곗〈 `src/AxCopilot/Core/ContextManager.cs`??媛??ㅻ깄?룸쭏??`exe`留?鍮꾧탳??HWND瑜?李얠븯湲??뚮Ц?? Chrome/Edge泥섎읆 ?щ윭 李쎌씠 ???덉쓣 ????李쎈쭔 諛섎났 ?대룞?섎ʼn 諛곗튂媛€ 臾대꼫吏€湲??ъ썱?듬땲?? +- `src/AxCopilot/Core/ContextManager.cs`???대┛ 李??꾨낫瑜??섏쭛????`exe + ?쒕ぉ 留ㅼ묶 ?먯닔 + ?대? ?ъ슜???몃뱾 ?쒖쇅` 湲곗??쇰줈 李쎌쓣 諛곗젙?섎룄濡?諛붽엥?듬땲?? exact title??理쒖슦?좎쑝濡??먭퀬, 釉뚮씪?곗? suffix ?쒓굅/?좏겙 鍮꾧탳瑜??듯빐 鍮꾩듂???쒕ぉ??蹂댁“?곸쑝濡?留ㅼ묶?⑸땲?? ?대? ?ㅻⅨ ?ㅻ깄?룹뿉 諛곗젙???몃뱾?€ ?ㅼ떆 ?곗? ?딆븘 multi-window 蹂듭썝 ?덉쭏???믪??듬땲?? +- `src/AxCopilot/Handlers/WorkspaceHandler.cs`??臾몄꽌?먮쭔 ?덉뿀??`~restore `怨?`~list`瑜??ㅼ젣 ?몃뱾?ъ뿉?쒕룄 吏€?먰븯?꾨줉 蹂댁셿?덉뒿?덈떎. ?꾨줈??紐⑸줉?€ 理쒓렐 ?앹꽦 ?쒖쑝濡??뺣젹?섍퀬 媛???ぉ??怨㏓컮濡?restore action??媛€吏€?꾨줉 ?뺣━?덉뒿?덈떎. +- ?뚯뒪?? `src/AxCopilot.Tests/Handlers/WorkspaceHandlerTests.cs`, `src/AxCopilot.Tests/Core/ContextManagerTests.cs` +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_workspace_restore_review\\ -p:IntermediateOutputPath=obj\\verify_workspace_restore_review\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "WorkspaceHandlerTests|ContextManagerTests" -p:OutputPath=bin\\verify_workspace_restore_review_tests\\ -p:IntermediateOutputPath=obj\\verify_workspace_restore_review_tests\\` ?듦낵 6 +- ?낅뜲?댄듃: 2026-04-15 16:12 (KST) +- 沅뚰븳 寃쎈줈 ?댁꽍怨??몄뀡 ?뱀씤 ?ъ궗?⑹쓣 workspace-aware 湲곗??쇰줈 ?뺣━?덉뒿?덈떎. ?곷? 寃쎈줈 `index.html` 媛숈? ?€?곸씠 沅뚰븳 ?앹뾽/?щ궡 紐⑤뱶 ?몃? 寃쎈줈 ?먯젙?먯꽌 ?꾨줈?몄뒪 ?꾩옱 ?대뜑(`dist`) 湲곗??쇰줈 ?섎せ ?덈?寃쎈줈?붾릺硫댁꽌, ?앹뾽 ?쒖떆媛€ ?€?댁?怨?`?대쾲 ?ㅽ뻾 ?숈븞 ?덉슜`??raw/absolute 寃쎈줈 遺덉씪移섎줈 ?ъ궗?⑸릺吏€ ?딅뜕 臾몄젣瑜??섏젙?덉뒿?덈떎. +- `src/AxCopilot/Services/Agent/IAgentTool.cs`??`ResolvePathForWorkspaceCheck(...)`瑜?異붽???`IsPathAllowed(...)`, `IsOutsideWorkspace(...)`媛€ ?곷? 寃쎈줈瑜??꾩옱 `WorkFolder` 湲곗??쇰줈 ?덈?寃쎈줈?뷀븳 ???먯젙?섎룄濡?蹂€寃쏀뻽?듬땲?? ?щ궡 紐⑤뱶?먯꽌???뚰겕?ㅽ럹?댁뒪 ?섏쐞 ?곷? 寃쎈줈???몃? 寃쎈줈濡??ㅽ뙋?섏? ?딆뒿?덈떎. +- `src/AxCopilot/Views/ChatWindow.xaml.cs`??沅뚰븳 肄쒕갚?먯꽌 `RuntimeWorkFolderOverride` ?먮뒗 ?꾩옱 ?€?붿쓽 `WorkFolder`瑜??ъ슜???€??寃쎈줈瑜?癒쇱? ?뺢퇋?뷀븯怨? ?먮룞 ?뱀씤 ?ъ궗?? ?몃? 寃쎈줈 notice, 沅뚰븳 ?앹뾽 ?쒖떆, ?몄뀡 洹쒖튃 ?€?μ뿉 紐⑤몢 媛숈? ?덈?寃쎈줈瑜??ъ슜?섎룄濡??뺣━?덉뒿?덈떎. +- ?뚯뒪?? `src/AxCopilot.Tests/Services/OperationModePolicyTests.cs`??`AgentContext_CheckToolPermissionAsync_InternalMode_BypassPermissions_AllowsRelativeWorkspacePathWithoutPrompt` 異붽? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_permission_workspace_path\\ -p:IntermediateOutputPath=obj\\verify_permission_workspace_path\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "OperationModePolicyTests|AgentLoopE2ETests" -p:OutputPath=bin\\verify_permission_workspace_path_tests\\ -p:IntermediateOutputPath=obj\\verify_permission_workspace_path_tests\\` ?듦낵 34 +- ?낅뜲?댄듃: 2026-04-15 15:56 (KST) +- AX Agent ?곷떒 ?쇱씠釉?吏꾪뻾 移대뱶 蹂듭썝 媛€?쒕? 異붽??덉뒿?덈떎. `src/AxCopilot/Views/ChatWindow.LiveProgressPresentation.cs`??`EnsureAgentLiveCardVisible(...)`瑜?留뚮뱾怨? Cowork/Code ?ㅽ뻾 以??쇱씠釉?移대뱶媛€ ?꾩쭅 ?앹꽦?섏? ?딆븯嫄곕굹 transcript ?ш뎄?깆쑝濡?鍮좎죱????利됱떆 ?ъ깮???щ?李⑸릺?꾨줉 ?덉뒿?덈떎. +- `src/AxCopilot/Views/ChatWindow.xaml.cs`??agent event ?섏떊怨?live hint ?쒖옉 ??eligible ??씠硫???helper瑜?癒쇱? ?몄텧????live card ?곹깭瑜?媛깆떊?섎룄濡?諛붽엥?듬땲?? 硫붿씤 猷⑦봽2 ?댄썑 ?대깽?몃뒗 ?ㅻ뒗??梨꾪똿李?諛붾줈 ???쇱씠釉?移대뱶留??щ씪吏€???뚭?瑜?留됰뒗 紐⑹쟻?낅땲?? +- `src/AxCopilot/Views/ChatWindow.V2Rendering.cs`??遺€遺??꾩껜 transcript ?щ젋?붾쭅 以?`_v2LiveContainer` 議댁옱 ?щ?留?蹂댁? ?딄퀬 `_isStreaming` ?곹깭硫?helper瑜??듯빐 ?쇱씠釉?移대뱶瑜??먮룞 蹂듭썝?⑸땲?? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_live_card_guard\\ -p:IntermediateOutputPath=obj\\verify_live_card_guard\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ChatWindowSlashPolicyTests" -p:OutputPath=bin\\verify_live_card_guard_tests\\ -p:IntermediateOutputPath=obj\\verify_live_card_guard_tests\\` ?듦낵 49 +- AX Agent 吏꾪뻾 ?대젰 ?뺤젣瑜??꾪빐 `src/AxCopilot/Services/Agent/AgentProgressSummarySanitizer.cs`瑜?異붽??덉뒿?덈떎. ?ㅽ듃由щ컢 以묎컙 preview, `Thinking` ?붿빟, `[?댁쟾 ?꾧뎄 ?몄텧: ...]` transcript 瑗щ━, ?レ옄/?€愿꾪샇 媛숈? ?€?덉쭏 議곌컖 臾몄옄?댁쓣 怨듯넻 洹쒖튃?쇰줈 ?뺣━?⑸땲?? +- `src/AxCopilot/Services/Agent/AgentLoopService.cs`???ㅽ듃由щ컢 `TextDelta` preview emit怨??쇰컲 `Thinking` emit ?꾩뿉 ?뺤젣湲곕? ?곸슜?⑸땲?? ?뺤젣 ??鍮꾩뼱踰꾨┛ summary???대깽???먯껜瑜?留뚮뱾吏€ ?딆븘, 以묎컙 ?묐떟??`1`, `[`, `file_read]` 媛숈? ?뚰렪??timeline/history???볦씠吏€ ?딆뒿?덈떎. +- `src/AxCopilot/Views/ChatWindow.V2LiveProgressPresentation.cs`, `src/AxCopilot/Views/ChatWindow.V2AgentEventPresentation.cs`, `src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs`???뚮뜑留?吏곸쟾?먮룄 媛숈? ?뺤젣 濡쒖쭅???ъ슜?⑸땲?? 湲곗〈 ?몄뀡???ㅻ옒??low-signal thinking event媛€ ?ㅼ떆 洹몃젮吏??뚮룄 鍮덉빟???⑤Ц???④린怨?process feed?먮뒗 `吏꾪뻾 ?댁슜 ?뺣━`濡??대갚?⑸땲?? +- ?뚯뒪?? `src/AxCopilot.Tests/Services/AgentProgressSummarySanitizerTests.cs` 異붽?, `src/AxCopilot.Tests/Services/AgentLoopResponseClassificationServiceTests.cs` ?뺤옣 +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_agent_progress_cleanup\\ -p:IntermediateOutputPath=obj\\verify_agent_progress_cleanup\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentProgressSummarySanitizerTests|AgentLoopResponseClassificationServiceTests|AgentStatusNarrativeCatalogTests|AgentLoopIterationPreparationServiceTests|AgentToolResultBudgetTests|ChatStorageServiceTests" -p:OutputPath=bin\\verify_agent_progress_cleanup_tests\\ -p:IntermediateOutputPath=obj\\verify_agent_progress_cleanup_tests\\` ?듦낵 22 -업데이트: 2026-04-14 21:25 (KST) -- 문서 생성 고도화 2차를 반영했습니다. `src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs`를 추가해 HTML/DOCX/XLSX 산출물에 대해 로컬 품질 점수와 보완 포인트를 계산하고, `HtmlSkill`, `DocxSkill`, `ExcelSkill`이 같은 리뷰 모델을 공유하도록 맞췄습니다. -- `src/AxCopilot/Services/Agent/DocxSkill.cs`는 `template_path`, `cover_subtitle`, `cover_meta`, `toc`를 지원하도록 확장했습니다. DOCX 템플릿 복제 후 본문을 재구성하고, 커버 페이지와 TOC 필드를 삽입한 뒤 structured review 결과를 함께 반환합니다. -- `src/AxCopilot/Services/Agent/ExcelSkill.cs`는 executive summary sheet에 detail sheet 링크를 자동 생성하고, KPI/highlights/actions 구조를 workbook quality review와 연결하도록 보강했습니다. -- `src/AxCopilot/Services/Agent/HtmlSkill.cs`는 로컬 품질 리뷰를 결과 요약에 포함하도록 바꿨고, 문서형 번들 스킬로 `executive-brief`, `kpi-workbook`, `board-report-html`을 추가했습니다. -- 테스트: `ArtifactQualityReviewServiceTests`, `DocxSkillTemplateFeaturesTests`, `ExcelSkillExecutiveSummaryLinkTests` 추가 -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_phase2\\ -p:IntermediateOutputPath=obj\\verify_doc_phase2\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|DocxSkillTemplateFeaturesTests|ExcelSkillExecutiveSummaryLinkTests|DocumentAssemblerSemanticTests|DocumentPlannerBusinessDocumentTests|HtmlSkillConsultingSectionsTests|ExcelSkillSummarySheetTests" -p:OutputPath=bin\\verify_doc_phase2_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_phase2_tests\\` 통과 9 +?낅뜲?댄듃: 2026-04-14 21:25 (KST) +- 臾몄꽌 ?앹꽦 怨좊룄??2李⑤? 諛섏쁺?덉뒿?덈떎. `src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs`瑜?異붽???HTML/DOCX/XLSX ?곗텧臾쇱뿉 ?€??濡쒖뺄 ?덉쭏 ?먯닔?€ 蹂댁셿 ?ъ씤?몃? 怨꾩궛?섍퀬, `HtmlSkill`, `DocxSkill`, `ExcelSkill`??媛숈? 由щ럭 紐⑤뜽??怨듭쑀?섎룄濡?留욎톬?듬땲?? +- `src/AxCopilot/Services/Agent/DocxSkill.cs`??`template_path`, `cover_subtitle`, `cover_meta`, `toc`瑜?吏€?먰븯?꾨줉 ?뺤옣?덉뒿?덈떎. DOCX ?쒗뵆由?蹂듭젣 ??蹂몃Ц???ш뎄?깊븯怨? 而ㅻ쾭 ?섏씠吏€?€ TOC ?꾨뱶瑜??쎌엯????structured review 寃곌낵瑜??④퍡 諛섑솚?⑸땲?? +- `src/AxCopilot/Services/Agent/ExcelSkill.cs`??executive summary sheet??detail sheet 留곹겕瑜??먮룞 ?앹꽦?섍퀬, KPI/highlights/actions 援ъ“瑜?workbook quality review?€ ?곌껐?섎룄濡?蹂닿컯?덉뒿?덈떎. +- `src/AxCopilot/Services/Agent/HtmlSkill.cs`??濡쒖뺄 ?덉쭏 由щ럭瑜?寃곌낵 ?붿빟???ы븿?섎룄濡?諛붽엥怨? 臾몄꽌??踰덈뱾 ?ㅽ궗濡?`executive-brief`, `kpi-workbook`, `board-report-html`??異붽??덉뒿?덈떎. +- ?뚯뒪?? `ArtifactQualityReviewServiceTests`, `DocxSkillTemplateFeaturesTests`, `ExcelSkillExecutiveSummaryLinkTests` 異붽? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_phase2\\ -p:IntermediateOutputPath=obj\\verify_doc_phase2\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|DocxSkillTemplateFeaturesTests|ExcelSkillExecutiveSummaryLinkTests|DocumentAssemblerSemanticTests|DocumentPlannerBusinessDocumentTests|HtmlSkillConsultingSectionsTests|ExcelSkillSummarySheetTests" -p:OutputPath=bin\\verify_doc_phase2_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_phase2_tests\\` ?듦낵 9 -업데이트: 2026-04-14 22:52 (KST) -- 문서 포맷 고도화와 PPTX 확장 포인트를 함께 반영했습니다. `src/AxCopilot/Services/Agent/ExcelSkill.cs`는 `conditional_formats`를 지원해 색상 스케일과 데이터 바 조건부서식을 OpenXML로 직접 생성하고, workbook quality review에도 조건부서식 개수를 반영합니다. -- `src/AxCopilot/Services/Agent/DocxSkill.cs`는 `style_map`을 지원하도록 확장했습니다. 템플릿에 정의된 제목/헤딩/본문 스타일을 실제 문단의 `ParagraphStyleId`로 연결해 사내 템플릿 기반 문서 품질을 높였습니다. -- `src/AxCopilot/Services/Agent/HtmlSkill.cs`는 `print_header`, `print_footer`를 받아 인쇄용 헤더/푸터 프레임을 렌더링하고, `src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs`는 HTML/DOCX/XLSX 품질 리뷰 문자열과 판정 로직을 공통 형식으로 정리했습니다. -- PPTX는 `src/AxCopilot/Services/Agent/PptxTemplatePackRegistry.cs`를 새로 추가해 `strategy`, `board`, `pmo`, `finance`, `sales`, `operating_model` 템플릿 팩을 정의했습니다. `src/AxCopilot/Services/Agent/PptxSkill.cs`는 `template_pack` 파라미터와 objective/audience 기반 pack suggestion을 받아 이후 목적형 deck 고도화를 이어가기 쉬운 구조가 됐습니다. -- 테스트: `ArtifactQualityReviewServiceTests`, `ExcelSkillDataValidationTests`, `ExcelSkillConditionalFormattingTests`, `DocxSkillStyleMapTests`, `HtmlSkillPrintFrameTests`, `PptxSkillTemplatePackTests` -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_next_doc_ppt\\ -p:IntermediateOutputPath=obj\\verify_next_doc_ppt\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|ExcelSkillDataValidationTests|ExcelSkillConditionalFormattingTests|ExcelSkillExecutiveSummaryLinkTests|ExcelSkillSummarySheetTests|DocxSkillTemplateFeaturesTests|DocxSkillStyleMapTests|HtmlSkillConsultingSectionsTests|HtmlSkillPrintFrameTests|DocumentAssemblerDocxFeaturesTests|PptxSkillConsultingDeckTests|PptxSkillAutoRepairTests|PptxSkillTemplatePackTests" -p:OutputPath=bin\\verify_next_doc_ppt_tests\\ -p:IntermediateOutputPath=obj\\verify_next_doc_ppt_tests\\` 통과 15 +?낅뜲?댄듃: 2026-04-14 22:52 (KST) +- 臾몄꽌 ?щ㎎ 怨좊룄?붿? PPTX ?뺤옣 ?ъ씤?몃? ?④퍡 諛섏쁺?덉뒿?덈떎. `src/AxCopilot/Services/Agent/ExcelSkill.cs`??`conditional_formats`瑜?吏€?먰빐 ?됱긽 ?ㅼ??쇨낵 ?곗씠??諛?議곌굔遺€?쒖떇??OpenXML濡?吏곸젒 ?앹꽦?섍퀬, workbook quality review?먮룄 議곌굔遺€?쒖떇 媛쒖닔瑜?諛섏쁺?⑸땲?? +- `src/AxCopilot/Services/Agent/DocxSkill.cs`??`style_map`??吏€?먰븯?꾨줉 ?뺤옣?덉뒿?덈떎. ?쒗뵆由우뿉 ?뺤쓽???쒕ぉ/?ㅻ뵫/蹂몃Ц ?ㅽ??쇱쓣 ?ㅼ젣 臾몃떒??`ParagraphStyleId`濡??곌껐???щ궡 ?쒗뵆由?湲곕컲 臾몄꽌 ?덉쭏???믪??듬땲?? +- `src/AxCopilot/Services/Agent/HtmlSkill.cs`??`print_header`, `print_footer`瑜?諛쏆븘 ?몄뇙???ㅻ뜑/?명꽣 ?꾨젅?꾩쓣 ?뚮뜑留곹븯怨? `src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs`??HTML/DOCX/XLSX ?덉쭏 由щ럭 臾몄옄?닿낵 ?먯젙 濡쒖쭅??怨듯넻 ?뺤떇?쇰줈 ?뺣━?덉뒿?덈떎. +- PPTX??`src/AxCopilot/Services/Agent/PptxTemplatePackRegistry.cs`瑜??덈줈 異붽???`strategy`, `board`, `pmo`, `finance`, `sales`, `operating_model` ?쒗뵆由??⑹쓣 ?뺤쓽?덉뒿?덈떎. `src/AxCopilot/Services/Agent/PptxSkill.cs`??`template_pack` ?뚮씪誘명꽣?€ objective/audience 湲곕컲 pack suggestion??諛쏆븘 ?댄썑 紐⑹쟻??deck 怨좊룄?붾? ?댁뼱媛€湲??ъ슫 援ъ“媛€ ?먯뒿?덈떎. +- ?뚯뒪?? `ArtifactQualityReviewServiceTests`, `ExcelSkillDataValidationTests`, `ExcelSkillConditionalFormattingTests`, `DocxSkillStyleMapTests`, `HtmlSkillPrintFrameTests`, `PptxSkillTemplatePackTests` +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_next_doc_ppt\\ -p:IntermediateOutputPath=obj\\verify_next_doc_ppt\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|ExcelSkillDataValidationTests|ExcelSkillConditionalFormattingTests|ExcelSkillExecutiveSummaryLinkTests|ExcelSkillSummarySheetTests|DocxSkillTemplateFeaturesTests|DocxSkillStyleMapTests|HtmlSkillConsultingSectionsTests|HtmlSkillPrintFrameTests|DocumentAssemblerDocxFeaturesTests|PptxSkillConsultingDeckTests|PptxSkillAutoRepairTests|PptxSkillTemplatePackTests" -p:OutputPath=bin\\verify_next_doc_ppt_tests\\ -p:IntermediateOutputPath=obj\\verify_next_doc_ppt_tests\\` ?듦낵 15 -업데이트: 2026-04-15 10:34 (KST) -- Agent loop 반복 진입부를 분리했습니다. `src/AxCopilot/Services/Agent/AgentLoopIterationPreparationService.cs`를 추가해 queued command 투영, tool_result 대기 요약 생성, `AgentQueryContextBuilder.Build()` 호출을 공통 준비 단계로 묶고, `AgentLoopService.RunAsync()`는 orchestration에 더 집중하도록 정리했습니다. -- `src/AxCopilot/Services/Agent/AgentMessageInvariantHelper.cs`는 tool result preview 스냅샷을 `ExplicitByToolResultId`, `ExplicitByFingerprint`, `SyntheticByToolResultId`로 분리합니다. 저장된 preview가 있으면 그것을 우선 쓰고, 다른 세션에서 `tool_use_id`가 바뀐 경우에는 fingerprint 재바인딩을 통해 안정적인 preview를 복원하며, 마지막에만 synthetic preview를 사용합니다. -- `src/AxCopilot/Services/Agent/AgentToolResultBudget.cs`는 source query view가 있을 때 source 기준 snapshot을 먼저 만들고, query view에는 그 결과를 재사용하도록 순서를 조정했습니다. 이로써 source 쪽 explicit preview가 local synthetic preview에 가려지지 않고, 첫 축약 결과도 source message에 다시 저장됩니다. -- 테스트: `src/AxCopilot.Tests/Services/AgentLoopIterationPreparationServiceTests.cs`, `src/AxCopilot.Tests/Services/AgentMessageInvariantHelperTests.cs`, `src/AxCopilot.Tests/Services/AgentToolResultBudgetTests.cs` -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_loop_pipeline\\ -p:IntermediateOutputPath=obj\\verify_loop_pipeline\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentQueuedCommandProjectorTests|AgentLoopIterationPreparationServiceTests|AgentMessageInvariantHelperTests|AgentToolResultBudgetTests|AgentQueryContextBuilderTests|ChatStorageServiceTests" -p:OutputPath=bin\\verify_loop_pipeline_tests\\ -p:IntermediateOutputPath=obj\\verify_loop_pipeline_tests\\` 통과 14 +?낅뜲?댄듃: 2026-04-15 10:34 (KST) +- Agent loop 諛섎났 吏꾩엯遺€瑜?遺꾨━?덉뒿?덈떎. `src/AxCopilot/Services/Agent/AgentLoopIterationPreparationService.cs`瑜?異붽???queued command ?ъ쁺, tool_result ?€湲??붿빟 ?앹꽦, `AgentQueryContextBuilder.Build()` ?몄텧??怨듯넻 以€鍮??④퀎濡?臾띔퀬, `AgentLoopService.RunAsync()`??orchestration????吏묒쨷?섎룄濡??뺣━?덉뒿?덈떎. +- `src/AxCopilot/Services/Agent/AgentMessageInvariantHelper.cs`??tool result preview ?ㅻ깄?룹쓣 `ExplicitByToolResultId`, `ExplicitByFingerprint`, `SyntheticByToolResultId`濡?遺꾨━?⑸땲?? ?€?λ맂 preview媛€ ?덉쑝硫?洹멸쾬???곗꽑 ?곌퀬, ?ㅻⅨ ?몄뀡?먯꽌 `tool_use_id`媛€ 諛붾€?寃쎌슦?먮뒗 fingerprint ?щ컮?몃뵫???듯빐 ?덉젙?곸씤 preview瑜?蹂듭썝?섎ʼn, 留덉?留됱뿉留?synthetic preview瑜??ъ슜?⑸땲?? +- `src/AxCopilot/Services/Agent/AgentToolResultBudget.cs`??source query view媛€ ?덉쓣 ??source 湲곗? snapshot??癒쇱? 留뚮뱾怨? query view?먮뒗 洹?寃곌낵瑜??ъ궗?⑺븯?꾨줉 ?쒖꽌瑜?議곗젙?덉뒿?덈떎. ?대줈??source 履?explicit preview媛€ local synthetic preview??媛€?ㅼ?吏€ ?딄퀬, 泥?異뺤빟 寃곌낵??source message???ㅼ떆 ?€?λ맗?덈떎. +- ?뚯뒪?? `src/AxCopilot.Tests/Services/AgentLoopIterationPreparationServiceTests.cs`, `src/AxCopilot.Tests/Services/AgentMessageInvariantHelperTests.cs`, `src/AxCopilot.Tests/Services/AgentToolResultBudgetTests.cs` +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_loop_pipeline\\ -p:IntermediateOutputPath=obj\\verify_loop_pipeline\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentQueuedCommandProjectorTests|AgentLoopIterationPreparationServiceTests|AgentMessageInvariantHelperTests|AgentToolResultBudgetTests|AgentQueryContextBuilderTests|ChatStorageServiceTests" -p:OutputPath=bin\\verify_loop_pipeline_tests\\ -p:IntermediateOutputPath=obj\\verify_loop_pipeline_tests\\` ?듦낵 14 -업데이트: 2026-04-15 10:57 (KST) -- Agent loop 마감 정리로 `src/AxCopilot/Services/Agent/AgentLoopNoToolResponseRecoveryService.cs`를 추가했습니다. `RunAsync()` 안에 섞여 있던 `도구 미호출 루프`와 `계획만 세우고 도구를 호출하지 않는 경우`의 복구 메시지/재시도 규칙/이벤트 요약을 별도 서비스로 분리해 orchestration 본문을 더 작게 유지합니다. -- `src/AxCopilot/Services/Agent/AgentLoopService.cs`는 위 helper를 호출해 assistant 텍스트 보존, recovery user message 추가, retry counter 갱신, event emit만 수행합니다. 이로써 복구 규칙 변경 시 서비스 테스트만으로 회귀를 잡기 쉬워졌습니다. -- 테스트: `src/AxCopilot.Tests/Services/AgentLoopNoToolResponseRecoveryServiceTests.cs` -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_closeout\\ -p:IntermediateOutputPath=obj\\verify_closeout\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentLoopNoToolResponseRecoveryServiceTests|AgentLoopIterationPreparationServiceTests|AgentLoopLlmRequestPreparationServiceTests|AgentQueuedCommandProjectorTests|AgentMessageInvariantHelperTests|AgentToolResultBudgetTests|AgentQueryContextBuilderTests|ChatStorageServiceTests|HtmlSkillGoldenReportTests|PptxSkillGoldenDeckTests|DocxSkillGoldenDocumentTests|ExcelSkillGoldenWorkbookTests" -p:OutputPath=bin\\verify_closeout_tests\\ -p:IntermediateOutputPath=obj\\verify_closeout_tests\\` 통과 27 +?낅뜲?댄듃: 2026-04-15 10:57 (KST) +- Agent loop 留덇컧 ?뺣━濡?`src/AxCopilot/Services/Agent/AgentLoopNoToolResponseRecoveryService.cs`瑜?異붽??덉뒿?덈떎. `RunAsync()` ?덉뿉 ?욎뿬 ?덈뜕 `?꾧뎄 誘명샇異?猷⑦봽`?€ `怨꾪쉷留??몄슦怨??꾧뎄瑜??몄텧?섏? ?딅뒗 寃쎌슦`??蹂듦뎄 硫붿떆吏€/?ъ떆??洹쒖튃/?대깽???붿빟??蹂꾨룄 ?쒕퉬?ㅻ줈 遺꾨━??orchestration 蹂몃Ц?????묎쾶 ?좎??⑸땲?? +- `src/AxCopilot/Services/Agent/AgentLoopService.cs`????helper瑜??몄텧??assistant ?띿뒪??蹂댁〈, recovery user message 異붽?, retry counter 媛깆떊, event emit留??섑뻾?⑸땲?? ?대줈??蹂듦뎄 洹쒖튃 蹂€寃????쒕퉬???뚯뒪?몃쭔?쇰줈 ?뚭?瑜??↔린 ?ъ썙議뚯뒿?덈떎. +- ?뚯뒪?? `src/AxCopilot.Tests/Services/AgentLoopNoToolResponseRecoveryServiceTests.cs` +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_closeout\\ -p:IntermediateOutputPath=obj\\verify_closeout\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentLoopNoToolResponseRecoveryServiceTests|AgentLoopIterationPreparationServiceTests|AgentLoopLlmRequestPreparationServiceTests|AgentQueuedCommandProjectorTests|AgentMessageInvariantHelperTests|AgentToolResultBudgetTests|AgentQueryContextBuilderTests|ChatStorageServiceTests|HtmlSkillGoldenReportTests|PptxSkillGoldenDeckTests|DocxSkillGoldenDocumentTests|ExcelSkillGoldenWorkbookTests" -p:OutputPath=bin\\verify_closeout_tests\\ -p:IntermediateOutputPath=obj\\verify_closeout_tests\\` ?듦낵 27 -업데이트: 2026-04-15 12:14 (KST) -- 사용자에게 보이는 AX Agent 진행 상태 문구를 richer narrative로 고도화했습니다. `src/AxCopilot/Services/Agent/AgentStatusNarrativeCatalog.cs`를 추가해 agent event를 `탭(Cowork/Code) + 도구 카테고리 + 대상 힌트 + transcript row presentation` 기준으로 해석하고, 현재 상태 메시지/상세 설명/phase label/meta를 한곳에서 생성합니다. -- `src/AxCopilot/Views/ChatWindow.xaml.cs`는 live pulse 상태 업데이트에 narrative 카탈로그를 적용하고, `src/AxCopilot/Views/ChatWindow.AgentStatusPresentation.cs`는 초기 준비 상태와 idle 상태를 같은 narrative 소스로 렌더링하도록 변경했습니다. `src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs`도 readable process feed summary와 phase label/meta를 동일 카탈로그에 맞춰 도구명 중심 문구 대신 의도 중심 문구를 재사용합니다. -- 이로써 Cowork/Code에서 보이는 현재 상태와 이력 요약이 `생각하는 중`, `작업 실행 중` 같은 일반 문구에서 `관련 코드 범위 확인`, `변경 적용`, `실행 결과 분석`, `문서 산출물 구성`, `권한 확인 대기`, `컨텍스트 정리`처럼 더 구체적인 문장으로 바뀝니다. -- 테스트: `src/AxCopilot.Tests/Services/AgentStatusNarrativeCatalogTests.cs` -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_status_narrative\\ -p:IntermediateOutputPath=obj\\verify_status_narrative\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentStatusNarrativeCatalogTests|AgentLoopIterationPreparationServiceTests|AgentToolResultBudgetTests|ChatStorageServiceTests|AgentMessageInvariantHelperTests" -p:OutputPath=bin\\verify_status_narrative_tests\\ -p:IntermediateOutputPath=obj\\verify_status_narrative_tests\\` 통과 15 +?낅뜲?댄듃: 2026-04-15 12:14 (KST) +- ?ъ슜?먯뿉寃?蹂댁씠??AX Agent 吏꾪뻾 ?곹깭 臾멸뎄瑜?richer narrative濡?怨좊룄?뷀뻽?듬땲?? `src/AxCopilot/Services/Agent/AgentStatusNarrativeCatalog.cs`瑜?異붽???agent event瑜?`??Cowork/Code) + ?꾧뎄 移댄뀒怨좊━ + ?€???뚰듃 + transcript row presentation` 湲곗??쇰줈 ?댁꽍?섍퀬, ?꾩옱 ?곹깭 硫붿떆吏€/?곸꽭 ?ㅻ챸/phase label/meta瑜??쒓납?먯꽌 ?앹꽦?⑸땲?? +- `src/AxCopilot/Views/ChatWindow.xaml.cs`??live pulse ?곹깭 ?낅뜲?댄듃??narrative 移댄깉濡쒓렇瑜??곸슜?섍퀬, `src/AxCopilot/Views/ChatWindow.AgentStatusPresentation.cs`??珥덇린 以€鍮??곹깭?€ idle ?곹깭瑜?媛숈? narrative ?뚯뒪濡??뚮뜑留곹븯?꾨줉 蹂€寃쏀뻽?듬땲?? `src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs`??readable process feed summary?€ phase label/meta瑜??숈씪 移댄깉濡쒓렇??留욎떠 ?꾧뎄紐?以묒떖 臾멸뎄 ?€???섎룄 以묒떖 臾멸뎄瑜??ъ궗?⑺빀?덈떎. +- ?대줈??Cowork/Code?먯꽌 蹂댁씠???꾩옱 ?곹깭?€ ?대젰 ?붿빟??`?앷컖?섎뒗 以?, `?묒뾽 ?ㅽ뻾 以? 媛숈? ?쇰컲 臾멸뎄?먯꽌 `愿€??肄붾뱶 踰붿쐞 ?뺤씤`, `蹂€寃??곸슜`, `?ㅽ뻾 寃곌낵 遺꾩꽍`, `臾몄꽌 ?곗텧臾?援ъ꽦`, `沅뚰븳 ?뺤씤 ?€湲?, `而⑦뀓?ㅽ듃 ?뺣━`泥섎읆 ??援ъ껜?곸씤 臾몄옣?쇰줈 諛붾€앸땲?? +- ?뚯뒪?? `src/AxCopilot.Tests/Services/AgentStatusNarrativeCatalogTests.cs` +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_status_narrative\\ -p:IntermediateOutputPath=obj\\verify_status_narrative\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentStatusNarrativeCatalogTests|AgentLoopIterationPreparationServiceTests|AgentToolResultBudgetTests|ChatStorageServiceTests|AgentMessageInvariantHelperTests" -p:OutputPath=bin\\verify_status_narrative_tests\\ -p:IntermediateOutputPath=obj\\verify_status_narrative_tests\\` ?듦낵 15 -업데이트: 2026-04-15 17:26 (KST) -- 런처 `~` 워크스페이스에 브라우저 세션 복원 경로를 추가했습니다. `src/AxCopilot/Core/BrowserWorkspaceStateHelper.cs`가 Chromium 계열과 Firefox의 실행 프로필 인자, 현재 탭 URL 목록, 활성 탭 인덱스를 수집하고, `src/AxCopilot/Core/ContextManager.cs`가 브라우저 상태가 저장된 창은 부분 제목 매칭으로 기존 창을 재사용하지 않고 새 창을 띄워 동일한 URL 세트를 복원한 뒤 위치/크기와 활성 탭을 맞춥니다. -- 설정 토글도 함께 연결했습니다. `src/AxCopilot/Models/AppSettings.cs`에 `Launcher.EnableBrowserSessionRestore` 기본값 `true`를 추가하고, `src/AxCopilot/ViewModels/SettingsViewModel.cs`와 `src/AxCopilot/Views/SettingsWindow.xaml`에 `브라우저 상태 복원` 항목을 노출해 탭 전환 기반 캡처를 사용자가 제어할 수 있게 했습니다. -- 테스트는 `src/AxCopilot.Tests/Core/ContextManagerTests.cs`에 브라우저 실행 인자/새 창 실행 정책 케이스를, `src/AxCopilot.Tests/Services/SettingsServiceTests.cs`에 기본값/직렬화 라운드트립 케이스를 추가했습니다. -- 검증: -- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_browser_restore\\ -p:IntermediateOutputPath=obj\\verify_browser_restore\\` → 경고 0 / 오류 0 -- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ContextManagerTests|SettingsServiceTests" -p:OutputPath=bin\\verify_browser_restore_tests\\ -p:IntermediateOutputPath=obj\\verify_browser_restore_tests\\` → 42개 통과 -- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "WorkspaceHandlerTests|ContextManagerTests|SettingsServiceTests" -p:OutputPath=bin\\verify_browser_restore_workspace_tests\\ -p:IntermediateOutputPath=obj\\verify_browser_restore_workspace_tests\\` → 44개 통과 +?낅뜲?댄듃: 2026-04-15 17:26 (KST) +- ?곗쿂 `~` ?뚰겕?ㅽ럹?댁뒪??釉뚮씪?곗? ?몄뀡 蹂듭썝 寃쎈줈瑜?異붽??덉뒿?덈떎. `src/AxCopilot/Core/BrowserWorkspaceStateHelper.cs`媛€ Chromium 怨꾩뿴怨?Firefox???ㅽ뻾 ?꾨줈???몄옄, ?꾩옱 ??URL 紐⑸줉, ?쒖꽦 ???몃뜳?ㅻ? ?섏쭛?섍퀬, `src/AxCopilot/Core/ContextManager.cs`媛€ 釉뚮씪?곗? ?곹깭媛€ ?€?λ맂 李쎌? 遺€遺??쒕ぉ 留ㅼ묶?쇰줈 湲곗〈 李쎌쓣 ?ъ궗?⑺븯吏€ ?딄퀬 ??李쎌쓣 ?꾩썙 ?숈씪??URL ?명듃瑜?蹂듭썝?????꾩튂/?ш린?€ ?쒖꽦 ??쓣 留욎땅?덈떎. +- ?ㅼ젙 ?좉????④퍡 ?곌껐?덉뒿?덈떎. `src/AxCopilot/Models/AppSettings.cs`??`Launcher.EnableBrowserSessionRestore` 湲곕낯媛?`true`瑜?異붽??섍퀬, `src/AxCopilot/ViewModels/SettingsViewModel.cs`?€ `src/AxCopilot/Views/SettingsWindow.xaml`??`釉뚮씪?곗? ?곹깭 蹂듭썝` ??ぉ???몄텧?????꾪솚 湲곕컲 罹≪쿂瑜??ъ슜?먭? ?쒖뼱?????덇쾶 ?덉뒿?덈떎. +- ?뚯뒪?몃뒗 `src/AxCopilot.Tests/Core/ContextManagerTests.cs`??釉뚮씪?곗? ?ㅽ뻾 ?몄옄/??李??ㅽ뻾 ?뺤콉 耳€?댁뒪瑜? `src/AxCopilot.Tests/Services/SettingsServiceTests.cs`??湲곕낯媛?吏곷젹???쇱슫?쒗듃由?耳€?댁뒪瑜?異붽??덉뒿?덈떎. +- 寃€利? +- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_browser_restore\\ -p:IntermediateOutputPath=obj\\verify_browser_restore\\` ??寃쎄퀬 0 / ?ㅻ쪟 0 +- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ContextManagerTests|SettingsServiceTests" -p:OutputPath=bin\\verify_browser_restore_tests\\ -p:IntermediateOutputPath=obj\\verify_browser_restore_tests\\` ??42媛??듦낵 +- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "WorkspaceHandlerTests|ContextManagerTests|SettingsServiceTests" -p:OutputPath=bin\\verify_browser_restore_workspace_tests\\ -p:IntermediateOutputPath=obj\\verify_browser_restore_workspace_tests\\` ??44媛??듦낵 -업데이트: 2026-04-14 19:50 (KST) -업데이트: 2026-04-15 15:45 (KST) -- Cowork PPT 생성 경로를 특정 업종 전용 archetype이 아니라 공통 품질 루프로 강화했습니다. `src/AxCopilot/Views/ChatWindow.SystemPromptBuilder.cs`와 `src/AxCopilot/Services/Agent/AgentLoopExplorationPolicy.cs`는 presentation/deck 요청에서 `document_plan`을 무조건 선행하지 않고, 계획 요청이 명시되지 않으면 `pptx_create`를 우선하도록 안내합니다. -- `src/AxCopilot/Services/Agent/DeckPlanningService.cs`에 `RefineForQuality(...)`를 추가했습니다. 이 루프는 executive summary, recommendation, comparison, roadmap, chart, KPI dashboard 슬라이드를 다시 점검해 summary takeaways, verdict/trade-off, timeline/owner/detail, KPI trend/note, chart takeaway, appendix evidence를 자동으로 보강합니다. -- `src/AxCopilot/Services/Agent/PptxSkill.cs`는 초기 `DeckQualityReviewService.ReviewDeck(...)` 결과가 약할 때 한 번 더 보정한 deck을 만들고, 실제로 점수/경고가 개선된 경우에만 refined deck을 최종 렌더링에 사용합니다. 결과적으로 weak deck은 한 번 더 자동으로 다듬어진 뒤 export됩니다. -- 테스트: `src/AxCopilot.Tests/Services/DeckPlanningServiceTests.cs`, `src/AxCopilot.Tests/Services/PptxSkillAutoRepairTests.cs` -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_ppt_generic_quality\\ -p:IntermediateOutputPath=obj\\verify_ppt_generic_quality\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DeckPlanningServiceTests|PptxSkillAutoRepairTests|PptxSkillGoldenDeckTests|DeckQualityReviewServiceTests" -p:OutputPath=bin\\verify_ppt_generic_quality_tests\\ -p:IntermediateOutputPath=obj\\verify_ppt_generic_quality_tests\\` 통과 14 -- Agent loop/queue/context 품질을 보강했습니다. `src/AxCopilot/Services/Agent/AgentCommandQueue.cs`로 실행 중 추가 입력을 우선순위와 interrupt 여부까지 포함해 관리하고, `AgentLoopService`는 이를 안전하게 반영합니다. -- `AgentToolResultBudget`, `AgentQueryContextBuilder`, `ChatModels`는 tool result preview를 메시지에 캐시해 긴 세션과 재질문에서도 같은 축약 결과를 재사용하도록 정리했습니다. -- 코드 탭의 내장 언어 지원을 `src/AxCopilot/Services/CodeLanguageCatalog.cs`로 통합했고, 설정의 코드 탭에 지원 언어(LSP)와 코드 탭 기본 지원 언어를 명시적으로 표시합니다. -- `PptxSkill`에 `executive_summary`, `recommendation`, `roadmap`, `comparison`, `kpi_dashboard` 레이아웃을 추가했고, `DocumentPlannerTool`은 발표 자료 계획을 `Executive Summary -> Situation & Imperative -> Key Findings -> Options & Recommendation -> Implementation Roadmap -> Impact & Ask` 구조로 생성합니다. `pptx-creator.skill.md`도 AX native `pptx_create` 중심으로 재작성했습니다. -- 테스트: `CodeLanguageCatalogTests`, `AgentCommandQueueTests`, `AgentToolResultBudgetTests`, `DocumentPlannerPresentationTests`, `PptxSkillConsultingDeckTests` 추가 및 기존 `WorkspaceContextGeneratorTests.cs(76)` nullable 경고 수정 -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_impl\\ -p:IntermediateOutputPath=obj\\verify_impl\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "CodeLanguageCatalogTests|AgentCommandQueueTests|AgentToolResultBudgetTests|DocumentPlannerPresentationTests|PptxSkillConsultingDeckTests" -p:OutputPath=bin\\verify_impl_tests\\ -p:IntermediateOutputPath=obj\\verify_impl_tests\\` 통과 15 +?낅뜲?댄듃: 2026-04-14 19:50 (KST) +?낅뜲?댄듃: 2026-04-15 15:45 (KST) +- Cowork PPT ?앹꽦 寃쎈줈瑜??뱀젙 ?낆쥌 ?꾩슜 archetype???꾨땲??怨듯넻 ?덉쭏 猷⑦봽濡?媛뺥솕?덉뒿?덈떎. `src/AxCopilot/Views/ChatWindow.SystemPromptBuilder.cs`?€ `src/AxCopilot/Services/Agent/AgentLoopExplorationPolicy.cs`??presentation/deck ?붿껌?먯꽌 `document_plan`??臾댁“嫄??좏뻾?섏? ?딄퀬, 怨꾪쉷 ?붿껌??紐낆떆?섏? ?딆쑝硫?`pptx_create`瑜??곗꽑?섎룄濡??덈궡?⑸땲?? +- `src/AxCopilot/Services/Agent/DeckPlanningService.cs`??`RefineForQuality(...)`瑜?異붽??덉뒿?덈떎. ??猷⑦봽??executive summary, recommendation, comparison, roadmap, chart, KPI dashboard ?щ씪?대뱶瑜??ㅼ떆 ?먭???summary takeaways, verdict/trade-off, timeline/owner/detail, KPI trend/note, chart takeaway, appendix evidence瑜??먮룞?쇰줈 蹂닿컯?⑸땲?? +- `src/AxCopilot/Services/Agent/PptxSkill.cs`??珥덇린 `DeckQualityReviewService.ReviewDeck(...)` 寃곌낵媛€ ?쏀븷 ????踰???蹂댁젙??deck??留뚮뱾怨? ?ㅼ젣濡??먯닔/寃쎄퀬媛€ 媛쒖꽑??寃쎌슦?먮쭔 refined deck??理쒖쥌 ?뚮뜑留곸뿉 ?ъ슜?⑸땲?? 寃곌낵?곸쑝濡?weak deck?€ ??踰????먮룞?쇰줈 ?ㅻ벉?댁쭊 ??export?⑸땲?? +- ?뚯뒪?? `src/AxCopilot.Tests/Services/DeckPlanningServiceTests.cs`, `src/AxCopilot.Tests/Services/PptxSkillAutoRepairTests.cs` +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_ppt_generic_quality\\ -p:IntermediateOutputPath=obj\\verify_ppt_generic_quality\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DeckPlanningServiceTests|PptxSkillAutoRepairTests|PptxSkillGoldenDeckTests|DeckQualityReviewServiceTests" -p:OutputPath=bin\\verify_ppt_generic_quality_tests\\ -p:IntermediateOutputPath=obj\\verify_ppt_generic_quality_tests\\` ?듦낵 14 +- Agent loop/queue/context ?덉쭏??蹂닿컯?덉뒿?덈떎. `src/AxCopilot/Services/Agent/AgentCommandQueue.cs`濡??ㅽ뻾 以?異붽? ?낅젰???곗꽑?쒖쐞?€ interrupt ?щ?源뚯? ?ы븿??愿€由ы븯怨? `AgentLoopService`???대? ?덉쟾?섍쾶 諛섏쁺?⑸땲?? +- `AgentToolResultBudget`, `AgentQueryContextBuilder`, `ChatModels`??tool result preview瑜?硫붿떆吏€??罹먯떆??湲??몄뀡怨??ъ쭏臾몄뿉?쒕룄 媛숈? 異뺤빟 寃곌낵瑜??ъ궗?⑺븯?꾨줉 ?뺣━?덉뒿?덈떎. +- 肄붾뱶 ??쓽 ?댁옣 ?몄뼱 吏€?먯쓣 `src/AxCopilot/Services/CodeLanguageCatalog.cs`濡??듯빀?덇퀬, ?ㅼ젙??肄붾뱶 ??뿉 吏€???몄뼱(LSP)?€ 肄붾뱶 ??湲곕낯 吏€???몄뼱瑜?紐낆떆?곸쑝濡??쒖떆?⑸땲?? +- `PptxSkill`??`executive_summary`, `recommendation`, `roadmap`, `comparison`, `kpi_dashboard` ?덉씠?꾩썐??異붽??덇퀬, `DocumentPlannerTool`?€ 諛쒗몴 ?먮즺 怨꾪쉷??`Executive Summary -> Situation & Imperative -> Key Findings -> Options & Recommendation -> Implementation Roadmap -> Impact & Ask` 援ъ“濡??앹꽦?⑸땲?? `pptx-creator.skill.md`??AX native `pptx_create` 以묒떖?쇰줈 ?ъ옉?깊뻽?듬땲?? +- ?뚯뒪?? `CodeLanguageCatalogTests`, `AgentCommandQueueTests`, `AgentToolResultBudgetTests`, `DocumentPlannerPresentationTests`, `PptxSkillConsultingDeckTests` 異붽? 諛?湲곗〈 `WorkspaceContextGeneratorTests.cs(76)` nullable 寃쎄퀬 ?섏젙 +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_impl\\ -p:IntermediateOutputPath=obj\\verify_impl\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "CodeLanguageCatalogTests|AgentCommandQueueTests|AgentToolResultBudgetTests|DocumentPlannerPresentationTests|PptxSkillConsultingDeckTests" -p:OutputPath=bin\\verify_impl_tests\\ -p:IntermediateOutputPath=obj\\verify_impl_tests\\` ?듦낵 15 --- -# AX Copilot - 媛쒕컻 臾몄꽌 +# AX Copilot - 揶쏆뮆而??얜챷苑? -> 理쒖쥌 ?낅뜲?댄듃: 2026-04-14 19:13 (KST) 쨌 踰꾩쟾 0.7.3 +> 筌ㅼ뮇伊???낅쑓??꾨뱜: 2026-04-14 19:13 (KST) 夷?甕곌쑴??0.7.3 -## ?낅뜲?댄듃 濡쒓렇 +## ??낅쑓??꾨뱜 嚥≪뮄?? -- ?낅뜲?댄듃: 2026-04-14 19:13 (KST) -- `기준 구조` 湲곗? Phase 4瑜??댁뼱??諛섏쁺?덉뒿?덈떎. `src/AxCopilot/Services/Agent/McpSkillCatalog.cs`瑜?異붽???MCP ?쒕쾭 硫뷀??곗씠?곕? `mcp` source scope??synthetic skill濡?蹂€?섑븯怨? `ToolRegistry.RegisterMcpToolsAsync()` ?댄썑 snapshot??媛깆떊?섎룄濡??곌껐?덉뒿?덈떎. -- `src/AxCopilot/Services/Agent/SkillService.cs`??source policy瑜?`managed/user/additional/project/plugin/mcp/legacy` ?⑥쐞濡??먮떒?섎룄濡??뺤옣?덇퀬, source ?곗꽑?쒖쐞 湲곕컲 dedupe?€ inline shell trust boundary瑜??④퍡 ?곸슜?⑸땲?? plugin-only mode媛€ 耳쒖졇 ?덉쑝硫?managed/plugin/bundled留??좎??섍퀬 ?섎㉧吏€ source???④퉩?덈떎. -- ?щ옒??紐낅졊 ?⑹꽦?€ `src/AxCopilot/Views/SlashCommandCatalog.cs`?€ `src/AxCopilot/Views/ChatWindow.xaml.cs`?먯꽌 ?ш뎄?깊뻽?듬땲?? builtin command?€ skill??怨듯넻 priority濡??⑹꽦??異⑸룎 ??????ぉ留??몄텧?섍퀬, builtin `/review` 媛숈? ?덉빟 紐낅졊??project skill蹂대떎 ?덉젙?곸쑝濡??곗꽑?⑸땲?? -- ?ㅼ젙/UI??`src/AxCopilot/Views/SettingsWindow.xaml`, `src/AxCopilot/Views/AgentSettingsWindow.xaml`, `src/AxCopilot/Views/AgentSettingsWindow.xaml.cs`, `src/AxCopilot/Views/SkillGalleryWindow.xaml.cs`???곌껐?덉뒿?덈떎. MCP ?ㅽ궗 source ?좉?, plugin-only mode, source蹂?inline shell ?덉슜 踰붿쐞, MCP 移댄뀒怨좊━/諛곗?, synthetic skill???뚯씪 ?≪뀡 李⑤떒???④퍡 諛섏쁺?덉뒿?덈떎. -- ?뚯뒪?몃뒗 `src/AxCopilot.Tests/Services/SkillServiceRuntimePolicyTests.cs`, `src/AxCopilot.Tests/Services/McpSkillCatalogTests.cs`, `src/AxCopilot.Tests/Views/SlashCommandCatalogTests.cs`??異붽??덉뒿?덈떎. -- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_phase4\\ -p:IntermediateOutputPath=obj\\verify_phase4\\` 寃쎄퀬 0 / ?ㅻ쪟 0 -- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "SkillServiceRuntimePolicyTests|SlashCommandCatalogTests|McpSkillCatalogTests" -p:OutputPath=bin\\verify_phase4_tests\\ -p:IntermediateOutputPath=obj\\verify_phase4_tests\\` ?듦낵 17 -- 李멸퀬: ?뚯뒪??鍮뚮뱶 以?湲곗〈 ?뚯씪 `src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs(76)`??nullable 寃쎄퀬 1嫄댁? ?좎??⑸땲?? +- ??낅쑓??꾨뱜: 2026-04-14 19:13 (KST) +- `湲곗? 援ъ“` 疫꿸퀣? Phase 4????곷선??獄쏆꼷???됰뮸??덈뼄. `src/AxCopilot/Services/Agent/McpSkillCatalog.cs`???곕떽???MCP ??뺤쒔 筌롫???怨쀬뵠?怨? `mcp` source scope??synthetic skill嚥?癰궰€??묐릭?? `ToolRegistry.RegisterMcpToolsAsync()` ??꾩뜎 snapshot??揶쏄퉮???롫즲嚥??怨뚭퍙??됰뮸??덈뼄. +- `src/AxCopilot/Services/Agent/SkillService.cs`??source policy??`managed/user/additional/project/plugin/mcp/legacy` ??μ맄嚥??癒?뼊??롫즲嚥??類ㅼ삢??뉙€? source ?怨쀪퐨??뽰맄 疫꿸퀡而?dedupe?? inline shell trust boundary????m뜞 ?怨몄뒠??몃빍?? plugin-only mode揶쎛€ ?녹뮇議???됱몵筌?managed/plugin/bundled筌??醫???랁€???롢돢筌왖€ source????m돥??덈뼄. +- ?????筌뤿굝議???밴쉐?? `src/AxCopilot/Views/SlashCommandCatalog.cs`?? `src/AxCopilot/Views/ChatWindow.xaml.cs`?癒?퐣 ????源딅뻥??щ빍?? builtin command?? skill???⑤벏??priority嚥???밴쉐???겸뫖猷????????됵쭕??紐꾪뀱??랁€? builtin `/review` 揶쏆늿? ??됰튋 筌뤿굝議??project skill癰귣?????됱젟?怨몄몵嚥??怨쀪퐨??몃빍?? +- ??쇱젟/UI??`src/AxCopilot/Views/SettingsWindow.xaml`, `src/AxCopilot/Views/AgentSettingsWindow.xaml`, `src/AxCopilot/Views/AgentSettingsWindow.xaml.cs`, `src/AxCopilot/Views/SkillGalleryWindow.xaml.cs`???怨뚭퍙??됰뮸??덈뼄. MCP ??쎄텢 source ?醫?, plugin-only mode, source癰?inline shell ??됱뒠 甕곕뗄?? MCP 燁삳똾?믤€⑥쥓??獄쏄퀣?, synthetic skill?????뵬 ??る€?筌△뫀?????m뜞 獄쏆꼷???됰뮸??덈뼄. +- ???뮞?紐껊뮉 `src/AxCopilot.Tests/Services/SkillServiceRuntimePolicyTests.cs`, `src/AxCopilot.Tests/Services/McpSkillCatalogTests.cs`, `src/AxCopilot.Tests/Views/SlashCommandCatalogTests.cs`???곕떽???됰뮸??덈뼄. +- 野꺜€筌? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_phase4\\ -p:IntermediateOutputPath=obj\\verify_phase4\\` 野껋럡??0 / ??살첒 0 +- 野꺜€筌? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "SkillServiceRuntimePolicyTests|SlashCommandCatalogTests|McpSkillCatalogTests" -p:OutputPath=bin\\verify_phase4_tests\\ -p:IntermediateOutputPath=obj\\verify_phase4_tests\\` ???궢 17 +- 筌〓㈇?? ???뮞????슢諭?餓?疫꿸퀣?????뵬 `src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs(76)`??nullable 野껋럡??1椰꾨똻? ?醫???몃빍?? -- ?낅뜲?댄듃: 2026-04-14 17:46 (KST) -- ?꾧뎄 ?대쫫 ?뺥빀??臾몄젣瑜?以꾩씠湲??꾪빐 `src/AxCopilot/Services/Agent/AgentToolCatalog.cs`瑜?異붽??덉뒿?덈떎. canonical id, legacy alias, ???몄텧, ?ㅼ젙 移댄뀒怨좊━, 蹂묐젹 read-only 遺꾨쪟瑜??쒓납?먯꽌 愿€由ы븯?꾨줉 ?뺣━?덉뒿?덈떎. -- `ToolRegistry`, `AgentLoopService`, `AgentLoopParallelExecution`, `IAgentTool`, `AgentHookRunner`, `SkillService`媛€ 紐⑤몢 媛숈? 移댄깉濡쒓렇瑜??ъ슜?섎룄濡??곌껐?덉뒿?덈떎. ?댁뿉 ?곕씪 `git/lsp/zip/project_rule/snippet_run` 媛숈? ?덉쟾 ?대쫫???고??꾩뿉???먮룞 ?뺢퇋?붾맗?덈떎. -- ?대??ㅼ젙 ?곕룞???④퍡 諛섏쁺?덉뒿?덈떎. `AgentSettingsWindow`?€ `SettingsWindow`???꾧뎄 移대뱶, ???몄쭛湲? 鍮꾪솢???꾧뎄 ?€?? ?꾧뎄 沅뚰븳 ?€?μ씠 canonical ?대쫫 湲곗??쇰줈 ?숈옉?섎ʼn 湲곗〈 ?€?κ컪?€ alias ?명솚?쇰줈 ?≪닔?⑸땲?? -- ?ㅽ궗 愿€???ㅻ챸?€ ?꾩옱 援ъ“??留욊쾶 ?꾪솕?덉뒿?덈떎. 湲곕낯 ?ㅽ궗 ?대뜑?€ 異붽? ?대뜑瑜??④퍡 濡쒕뱶?섎뒗 ?먮쫫, 吏곸젒 ?몄텧 ?ㅽ궗怨??고????뺤콉 ?곌껐 ?ㅽ궗??媛숈씠 蹂댁뿬二쇰뒗 諛⑺뼢?쇰줈 ?ㅼ젙/?ы봽 臾멸뎄瑜?蹂댁젙?덉뒿?덈떎. -- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_toolcat\\ -p:IntermediateOutputPath=obj\\verify_toolcat\\` 寃쎄퀬 0 / ?ㅻ쪟 0 -- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter AgentToolCatalogTests -p:OutputPath=bin\\verify_toolcat_tests\\ -p:IntermediateOutputPath=obj\\verify_toolcat_tests\\` ?듦낵 8 -- 李멸퀬: ?뚯뒪??鍮뚮뱶 以?湲곗〈 ?뚯씪 `src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs`??nullable 寃쎄퀬 1嫄댁씠 ?④퍡 ?쒖떆?섏뿀?쇰굹, ?대쾲 蹂€寃쎌뿉????寃쎄퀬瑜?異붽??섏????딆븯?듬땲?? +- ??낅쑓??꾨뱜: 2026-04-14 17:46 (KST) +- ?袁㏓럡 ??€已??類λ????얜챷?g몴?餓κ쑴?졿묾??袁る퉸 `src/AxCopilot/Services/Agent/AgentToolCatalog.cs`???곕떽???됰뮸??덈뼄. canonical id, legacy alias, ???紐꾪뀱, ??쇱젟 燁삳똾?믤€⑥쥓?? 癰귣쵎??read-only ?브쑬履잏몴???볥궔?癒?퐣 ?온€?귐뗫릭?袁⑥쨯 ?類b봺??됰뮸??덈뼄. +- `ToolRegistry`, `AgentLoopService`, `AgentLoopParallelExecution`, `IAgentTool`, `AgentHookRunner`, `SkillService`揶쎛€ 筌뤴뫀紐?揶쏆늿? 燁삳똾源됪에?볥젃???????롫즲嚥??怨뚭퍙??됰뮸??덈뼄. ??곷퓠 ?怨뺤뵬 `git/lsp/zip/project_rule/snippet_run` 揶쏆늿? ??됱읈 ??€已???怨??袁⑸퓠???癒?짗 ?類?뇣?遺얜쭢??덈뼄. +- ??€???쇱젟 ?怨뺣짗????m뜞 獄쏆꼷???됰뮸??덈뼄. `AgentSettingsWindow`?? `SettingsWindow`???袁㏓럡 燁삳?諭? ???紐꾩춿疫? ??쑵????袁㏓럡 ???? ?袁㏓럡 亦낅슦釉????關??canonical ??€已?疫꿸퀣???곗쨮 ??덉삂??렽?疫꿸퀣?????觀而?? alias ?紐낆넎??곗쨮 ??る땾??몃빍?? +- ??쎄텢 ?온€????살구?? ?袁⑹삺 ?닌듼€??筌띿쉳苡??袁れ넅??됰뮸??덈뼄. 疫꿸퀡????쎄텢 ??€??? ?곕떽? ??€?묊몴???m뜞 嚥≪뮆諭??롫뮉 ?癒?カ, 筌욊낯???紐꾪뀱 ??쎄텢???怨????類ㅼ퐠 ?怨뚭퍙 ??쎄텢??揶쏆늿??癰귣똻肉т틠?곕뮉 獄쎻뫚堉??곗쨮 ??쇱젟/??遊??얜㈇?꾤몴?癰귣똻???됰뮸??덈뼄. +- 野꺜€筌? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_toolcat\\ -p:IntermediateOutputPath=obj\\verify_toolcat\\` 野껋럡??0 / ??살첒 0 +- 野꺜€筌? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter AgentToolCatalogTests -p:OutputPath=bin\\verify_toolcat_tests\\ -p:IntermediateOutputPath=obj\\verify_toolcat_tests\\` ???궢 8 +- 筌〓㈇?? ???뮞????슢諭?餓?疫꿸퀣?????뵬 `src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs`??nullable 野껋럡??1椰꾨똻????m뜞 ??뽯뻻??뤿???곌돌, ??€苡?癰궰€野껋럩肉????野껋럡?х몴??곕떽????????녿릭??щ빍?? --- -## 1. ?꾨줈?앺듃 媛쒖슂 +## 1. ?袁⑥쨮??븍뱜 揶쏆뮇?? -AX Copilot?€ Windows???앹궛???곗쿂 + AI ?먯씠?꾪듃 ?곗뒪?ы넲 ?깆엯?덈떎. -- **?곗쿂**: Alfred/Raycast ?ㅽ??쇱쓽 ?쇱? 寃€?? 紐낅졊 ?ㅽ뻾, ?꾩젽 -- **?먯씠?꾪듃**: LLM 湲곕컲 ?€?뷀삎 肄붾뱶/臾몄꽌 ?묒뾽 ?먮룞??(?꾧뎄 ?몄텧 猷⑦봽) -- **??諛?*: ?쒖뒪??由ъ냼?? ?대┰蹂대뱶, ?ㅽ겕由곗꺑 ??鍮좊Ⅸ ?묎렐 +AX Copilot?? Windows????밴텦???怨쀬퓗 + AI ?癒?뵠?袁る뱜 ?怨쀫뮞?????源놁뿯??덈뼄. +- **?怨쀬퓗**: Alfred/Raycast ?????깆벥 ??? 野꺜€?? 筌뤿굝議???쎈뻬, ?袁⑹졐 +- **?癒?뵠?袁る뱜**: LLM 疫꿸퀡而????酉€???꾨뗀諭??얜챷苑??臾믩씜 ?癒?짗??(?袁㏓럡 ?紐꾪뀱 ?룐뫂遊? +- **??獄?*: ??뽯뮞???귐딅꺖?? ??€?계퉪?€諭? ??쎄쾿?깃퀣爰?????쥓???臾롫젏 --- -## 2. 湲곗닠 ?ㅽ깮 +## 2. 疫꿸퀣????쎄문 -| ??ぉ | 媛?| +| ????| 揶?| |------|-----| -| ?꾨젅?꾩썙??| .NET 8 (net8.0-windows10.0.17763.0) | -| UI | WPF + Windows Forms (?섏씠釉뚮━?? | -| ?몄뼱 | C# 12 | -| ?⑦꽩 | MVVM, ?대깽??湲곕컲, ?깃????쒕퉬??| -| ?뚯뒪??| xUnit 2.9 + FluentAssertions 6.12 | -| 鍮뚮뱶 | dotnet CLI, PublishSingleFile | +| ?袁⑥쟿?袁⑹뜖??| .NET 8 (net8.0-windows10.0.17763.0) | +| UI | WPF + Windows Forms (??륁뵠?됰슢??? | +| ?紐꾨선 | C# 12 | +| ???쉘 | MVVM, ??€源??疫꿸퀡而? ?源?????뺥돩??| +| ???뮞??| xUnit 2.9 + FluentAssertions 6.12 | +| ??슢諭?| dotnet CLI, PublishSingleFile | -### 二쇱슂 NuGet ?⑦궎吏€ +### 雅뚯눘??NuGet ???텕筌왖€ -| ?⑦궎吏€ | ?⑸룄 | +| ???텕筌왖€ | ??몃즲 | |--------|------| -| DocumentFormat.OpenXml 3.2.0 | DOCX/XLSX/PPTX ?앹꽦 | -| Markdig 0.37.0 | Markdown ??HTML ?뚮뜑留?| -| Microsoft.Data.Sqlite 8.0 | SQLite (?€???€?μ냼) | -| Microsoft.Web.WebView2 | HTML 誘몃━蹂닿린, 媛€?대뱶 酉곗뼱 | -| QRCoder 1.6.0 | QR 肄붾뱶 ?앹꽦 | -| System.Security.Cryptography.ProtectedData | DPAPI ?뷀샇??| -| UglyToad.PdfPig | PDF ?쎄린 | +| DocumentFormat.OpenXml 3.2.0 | DOCX/XLSX/PPTX ??밴쉐 | +| Markdig 0.37.0 | Markdown ??HTML ???쐭筌?| +| Microsoft.Data.Sqlite 8.0 | SQLite (???????關?? | +| Microsoft.Web.WebView2 | HTML 沃섎챶?곮퉪?용┛, 揶쎛€??€諭??됯퀣堉?| +| QRCoder 1.6.0 | QR ?꾨뗀諭???밴쉐 | +| System.Security.Cryptography.ProtectedData | DPAPI ?酉€???| +| UglyToad.PdfPig | PDF ??꾨┛ | --- -## 3. ?붾(??援ъ“ +## 3. ?遺억펷???닌듼€? ``` src/ -?쒋??€ AxCopilot/ # 硫붿씤 WPF ??(v0.7.3) -?? ?쒋??€ Assets/ # ?꾩씠肄? ?꾨━??JSON, ?뷀샇?붾맂 媛€?대뱶, 留덉뒪肄뷀듃 -?? ?쒋??€ Core/ # FuzzyEngine, CommandResolver, InputListener, PluginHost -?? ?쒋??€ Handlers/ # 136媛?鍮뚰듃??紐낅졊 ?몃뱾???? ?쒋??€ Models/ # AppSettings, ChatModels, McpSettings -?? ?쒋??€ Security/ # AntiTamper (?붾쾭嫄??붿뺨?뚯씪???먯?) -?? ?쒋??€ Services/ # 60媛??쒕퉬???? ?? ?붴??€ Agent/ # ?먯씠?꾪듃 猷⑦봽 + 114媛??꾧뎄 -?? ?쒋??€ Themes/ # 9媛??뚮쭏 (Dark, Light, OLED, Nord, Monokai ?? -?? ?쒋??€ ViewModels/ # LauncherViewModel, SettingsViewModel, StatisticsViewModel -?? ?붴??€ Views/ # 30媛?XAML ?덈룄???쒋??€ AxCopilot.SDK/ # ?뚮윭洹몄씤 SDK (IActionHandler ?명꽣?섏씠?? -?쒋??€ AxCopilot.Installer/ # Windows Forms ?ㅼ튂 ?꾨줈洹몃옩 (.NET Framework 4.8) -?쒋??€ AxCopilot.Tests/ # xUnit ?⑥쐞/?듯빀 ?뚯뒪???붴??€ AxKeyEncryptor/ # API ??DPAPI ?뷀샇???좏떥由ы떚 +????? AxCopilot/ # 筌롫뗄??WPF ??(v0.7.3) +?? ????? Assets/ # ?袁⑹뵠?? ?袁ⓥ봺??JSON, ?酉€??遺얜쭆 揶쎛€??€諭? 筌띾뜆?よ굜酉€?? +?? ????? Core/ # FuzzyEngine, CommandResolver, InputListener, PluginHost +?? ????? Handlers/ # 136揶???슦???筌뤿굝議??紐껊굶???? ????? Models/ # AppSettings, ChatModels, McpSettings +?? ????? Security/ # AntiTamper (?遺얠쒔椰??遺용벰???뵬???癒?) +?? ????? Services/ # 60揶???뺥돩???? ?? ?遺??? Agent/ # ?癒?뵠?袁る뱜 ?룐뫂遊?+ 114揶??袁㏓럡 +?? ????? Themes/ # 9揶????춳 (Dark, Light, OLED, Nord, Monokai ?? +?? ????? ViewModels/ # LauncherViewModel, SettingsViewModel, StatisticsViewModel +?? ?遺??? Views/ # 30揶?XAML ??덈즲??????? AxCopilot.SDK/ # ???쑎域밸챷??SDK (IActionHandler ?紐낃숲??륁뵠?? +????? AxCopilot.Installer/ # Windows Forms ??쇳뒄 ?袁⑥쨮域밸챶??(.NET Framework 4.8) +????? AxCopilot.Tests/ # xUnit ??μ맄/???? ???뮞???遺??? AxKeyEncryptor/ # API ??DPAPI ?酉€????醫뤿뼢?귐뗫뼒 ``` --- -## 4. ???쒖옉 ?먮쫫 (App.xaml.cs) +## 4. ????뽰삂 ?癒?カ (App.xaml.cs) ``` OnStartup() - ?쒋? AntiTamper ?붾쾭嫄?媛먯? (Release 鍮뚮뱶) - ?쒋? ?⑥씪 ?몄뒪?댁뒪 裕ㅽ뀓???뺤씤 - ?쒋? SettingsService 珥덇린??+ ?ㅼ젙 濡쒕뱶 - ?쒋? ChatStorageService 蹂닿? ?뺤콉 ?ㅽ뻾 (留뚮즺 ?€???뺣━) - ?쒋? L10n ?몄뼱 珥덇린?? ?쒋? ?쒕퉬??珥덇린?? ?? ?쒋? AgentMemoryService - ?? ?쒋? ChatSessionStateService - ?? ?쒋? AppStateService - ?? ?쒋? IndexService (諛깃렇?쇱슫???뚯씪 ?몃뜳?? - ?? ?쒋? FuzzyEngine + CommandResolver - ?? ?쒋? ContextManager - ?? ?쒋? SessionTrackingService - ?? ?쒋? WorktimeReminderService - ?? ?붴? ClipboardHistoryService - ?쒋? 鍮뚰듃???몃뱾???깅줉 (136媛? - ?쒋? SchedulerService + PluginHost 珥덇린?? ?쒋? InputListener ?쒖옉 (湲€濡쒕쾶 ?ロ궎) - ?붴? ?곗쿂/?ㅼ젙/?몃젅???덈룄???앹꽦 + ??? AntiTamper ?遺얠쒔椰?揶쏅Ŋ? (Release ??슢諭? + ??? ??μ뵬 ?紐꾨뮞??곷뮞 獒뺛끋????類ㅼ뵥 + ??? SettingsService ?λ뜃由??+ ??쇱젟 嚥≪뮆諭? + ??? ChatStorageService 癰귣떯? ?類ㅼ퐠 ??쎈뻬 (筌띾슢利??????類b봺) + ??? L10n ?紐꾨선 ?λ뜃由?? ??? ??뺥돩???λ뜃由?? ?? ??? AgentMemoryService + ?? ??? ChatSessionStateService + ?? ??? AppStateService + ?? ??? IndexService (獄쏄퉫???깆뒲?????뵬 ?紐껊쑔?? + ?? ??? FuzzyEngine + CommandResolver + ?? ??? ContextManager + ?? ??? SessionTrackingService + ?? ??? WorktimeReminderService + ?? ?遺? ClipboardHistoryService + ??? ??슦????紐껊굶???源낆쨯 (136揶? + ??? SchedulerService + PluginHost ?λ뜃由?? ??? InputListener ??뽰삂 (疫꼲€嚥≪뮆苡????텕) + ?遺? ?怨쀬퓗/??쇱젟/?紐껋쟿????덈즲????밴쉐 ``` --- -## 5. ?듭떖 ?꾪궎?띿쿂 +## 5. ???뼎 ?袁り텕??우퓗 -### 5.1 ?곗쿂 (Launcher) +### 5.1 ?怨쀬퓗 (Launcher) -**寃€???뚯씠?꾨씪??*: ?ъ슜???낅젰 ??`CommandResolver` (?묐몢??留ㅼ묶) ??`FuzzyEngine` (?쇱? 寃€?? ??寃곌낵 ?뺣젹 ??UI ?뚮뜑留? -- `FuzzyEngine`: ?뚯씪 ?몃뜳??湲곕컲 ?쇱? 留ㅼ묶, ?먯닔 ?쒖쐞 -- `CommandResolver`: ?몃뱾???쇱슦??(?묐몢??`@`, `!`, `#`, `~`, `>`, `$` ?? -- `IndexService`: 諛깃렇?쇱슫???뚯씪 ?몃뜳??(`.git`, `node_modules` ???쒖쇅) +**野꺜€?????뵠?袁⑥뵬??*: ???????낆젾 ??`CommandResolver` (?臾먮あ??筌띲끉臾? ??`FuzzyEngine` (??? 野꺜€?? ??野껉퀗???類l졊 ??UI ???쐭筌? +- `FuzzyEngine`: ???뵬 ?紐껊쑔??疫꿸퀡而???? 筌띲끉臾? ?癒?땾 ??뽰맄 +- `CommandResolver`: ?紐껊굶????깆뒭??(?臾먮あ??`@`, `!`, `#`, `~`, `>`, `$` ?? +- `IndexService`: 獄쏄퉫???깆뒲?????뵬 ?紐껊쑔??(`.git`, `node_modules` ????뽰뇚) -**?꾩젽**: ?깅뒫 紐⑤땲?? ?щえ?꾨줈, 硫붾え, ?좎뵪, 罹섎┛?? 諛고꽣由? -### 5.2 ?먯씠?꾪듃 (Agent Loop) +**?袁⑹졐**: ?源낅뮟 筌뤴뫀??? ????袁⑥쨮, 筌롫뗀?? ?醫롫뎁, 筌?꼶??? 獄쏄퀬苑g뵳? +### 5.2 ?癒?뵠?袁る뱜 (Agent Loop) ``` -?ъ슜??硫붿떆吏€ - ??LlmService.StreamAsync() (LLM API ?몄텧) - ???묐떟 ?ㅽ듃由щ컢 ?섏떊 - ???꾧뎄 ?몄텧 媛먯? ?? - ??ToolRegistry?먯꽌 ?꾧뎄 議고쉶 - ??沅뚰븳 ?뺤씤 (AskPermissionCallback) - ???꾧뎄 ?ㅽ뻾 - ??寃곌낵瑜?而⑦뀓?ㅽ듃??異붽? - ??LLM ?ы샇異?(諛섎났) - ??理쒖쥌 ?띿뒪???묐떟 諛섑솚 +?????筌롫뗄?놅쭪? + ??LlmService.StreamAsync() (LLM API ?紐꾪뀱) + ???臾먮뼗 ??쎈뱜?귐됱빪 ??뤿뻿 + ???袁㏓럡 ?紐꾪뀱 揶쏅Ŋ? ?? + ??ToolRegistry?癒?퐣 ?袁㏓럡 鈺곌퀬?? + ??亦낅슦釉??類ㅼ뵥 (AskPermissionCallback) + ???袁㏓럡 ??쎈뻬 + ??野껉퀗?든몴??뚢뫂???쎈뱜???곕떽? + ??LLM ???뉒빊?(獄쏆꼶?? + ??筌ㅼ뮇伊???용뮞???臾먮뼗 獄쏆꼹?? ``` -**?듭떖 ?대옒??*: -- `AgentLoopService` ??猷⑦봽 ?붿쭊 (諛섎났, ?쇱떆?뺤?/?ш컻, ?대깽??諛쒗뻾) -- `AxAgentExecutionEngine` ???꾧뎄 ?ㅽ뻾 議곗쑉 -- `AgentLoopParallelExecution` ??蹂묐젹 ?꾧뎄 ?ㅽ뻾 -- `AgentLoopTransitions` / `.Execution` ???곹깭 ?꾩씠 濡쒖쭅 -- `ToolRegistry` ???꾧뎄 ?깅줉/議고쉶 -- `ContextCondenser` ??而⑦뀓?ㅽ듃 ?뺤텞 (?좏겙 愿€由? +**???뼎 ??€???*: +- `AgentLoopService` ???룐뫂遊??遺우춭 (獄쏆꼶?? ??깅뻻?類?/??而? ??€源??獄쏆뮉六? +- `AxAgentExecutionEngine` ???袁㏓럡 ??쎈뻬 鈺곌퀣?? +- `AgentLoopParallelExecution` ??癰귣쵎???袁㏓럡 ??쎈뻬 +- `AgentLoopTransitions` / `.Execution` ???怨밴묶 ?袁⑹뵠 嚥≪뮇彛? +- `ToolRegistry` ???袁㏓럡 ?源낆쨯/鈺곌퀬?? +- `ContextCondenser` ???뚢뫂???쎈뱜 ?類ㅽ뀧 (?醫뤾쿃 ?온€?? -**?꾧뎄 移댄뀒怨좊━** (114媛?: -| 移댄뀒怨좊━ | ?덉떆 | +**?袁㏓럡 燁삳똾?믤€⑥쥓??* (114揶?: +| 燁삳똾?믤€⑥쥓??| ??됰뻻 | |---------|------| -| ?뚯씪 I/O | FileReadTool, FileEditTool, FileManageTool, FileWriteTool | -| 寃€??| GlobTool, GrepTool, CodeSearchTool, FileSearchTool | -| 臾몄꽌 | DocumentReaderTool, ExcelSkill, DocxSkill, PptxSkill, CsvSkill, HtmlSkill | -| 肄붾뱶 | BuildRunTool, SnippetRunnerTool, CodeReviewTool, TestLoopTool, LspTool | -| ?곗씠??| JsonTool, XmlTool, SqlTool, DataPivotTool, RegexTool | -| ?쒖뒪??| ProcessTool, EnvTool, ZipTool, ClipboardTool | -| 怨꾪쉷/異붿쟻 | TodoWriteTool, TaskTrackerTool, CheckpointTool, PlaybookTool | -| ?ъ슜??| UserAskTool, SuggestActionsTool, NotifyTool | +| ???뵬 I/O | FileReadTool, FileEditTool, FileManageTool, FileWriteTool | +| 野꺜€??| GlobTool, GrepTool, CodeSearchTool, FileSearchTool | +| ?얜챷苑?| DocumentReaderTool, ExcelSkill, DocxSkill, PptxSkill, CsvSkill, HtmlSkill | +| ?꾨뗀諭?| BuildRunTool, SnippetRunnerTool, CodeReviewTool, TestLoopTool, LspTool | +| ?怨쀬뵠??| JsonTool, XmlTool, SqlTool, DataPivotTool, RegexTool | +| ??뽯뮞??| ProcessTool, EnvTool, ZipTool, ClipboardTool | +| ?④쑵???곕뗄??| TodoWriteTool, TaskTrackerTool, CheckpointTool, PlaybookTool | +| ?????| UserAskTool, SuggestActionsTool, NotifyTool | | MCP | McpTool, McpListResourcesTool, McpReadResourceTool | -**??퀎 ?꾧뎄 ?꾪꽣留?* (`ToolRegistry.ToolTabOverrides`): +**?????袁㏓럡 ?袁り숲筌?* (`ToolRegistry.ToolTabOverrides`): -`IAgentTool.TabCategory` ?먮뒗 `ToolTabOverrides` ?뺤뀛?덈━濡??꾧뎄瑜???퀎濡?遺꾨쪟?⑸땲?? -`GetActiveToolsForTab(activeTab)` 硫붿꽌?쒓? ?꾩옱 ??뿉 留욌뒗 ?꾧뎄留?LLM???꾩넚?섏뿬 ?좏겙???덉빟?⑸땲?? +`IAgentTool.TabCategory` ?癒?뮉 `ToolTabOverrides` ?類ㅻ€??댿봺嚥??袁㏓럡?????롦에??브쑬履??몃빍?? +`GetActiveToolsForTab(activeTab)` 筌롫뗄苑??? ?袁⑹삺 ??肉?筌띿쉶???袁㏓럡筌?LLM???袁⑸꽊??뤿연 ?醫뤾쿃????됰튋??몃빍?? -| ??| ?쒖꽦 ?꾧뎄 踰붿쐞 | ?ㅻ챸 | +| ??| ??뽮쉐 ?袁㏓럡 甕곕뗄??| ??살구 | |------|--------------|------| -| **Chat** | 0媛?| ?쒖닔 ?€?? ?꾧뎄 ?놁씠 LLM留??묐떟 | -| **Cowork** | ~50媛?| ?뚯씪/寃€??+ 臾몄꽌?앹꽦(xlsx, docx, pptx...) + ?곗씠???좏떥 | -| **Code** | ~50媛?| ?뚯씪/寃€??+ 媛쒕컻(git, build, lsp...) + ?쒖뒪???뚰겕?몃━ + ?좏떥 | +| **Chat** | 0揶?| ??뽯땾 ???? ?袁㏓럡 ??곸뵠 LLM筌??臾먮뼗 | +| **Cowork** | ~50揶?| ???뵬/野꺜€??+ ?얜챷苑??밴쉐(xlsx, docx, pptx...) + ?怨쀬뵠???醫뤿뼢 | +| **Code** | ~50揶?| ???뵬/野꺜€??+ 揶쏆뮆而?git, build, lsp...) + ??뽯뮞????곌쾿?紐꺿봺 + ?醫뤿뼢 | -- Chat ???좏겙 ?덉빟: ~14,400?좏겙 ??0 (?꾧뎄 ?뺤쓽 ?꾩쟾 ?쒓굅) -- Cowork/Code: 援먯감 ?쒖쇅濡?媛?~3,600?좏겙 異붽? ?덉빟 +- Chat ???醫뤾쿃 ??됰튋: ~14,400?醫뤾쿃 ??0 (?袁㏓럡 ?類ㅼ벥 ?袁⑹읈 ??볤탢) +- Cowork/Code: ?대Ŋ媛???뽰뇚嚥?揶?~3,600?醫뤾쿃 ?곕떽? ??됰튋 -### 5.3 LLM ?쒕퉬?? -**吏€??怨듦툒??*: -| ?쒕퉬??| ?ㅻ챸 | +### 5.3 LLM ??뺥돩?? +**筌왖€???⑤벀???*: +| ??뺥돩??| ??살구 | |--------|------| -| `claude` / `sigmoid` | Anthropic Claude (Sigmoid API 寃쎌쑀) | +| `claude` / `sigmoid` | Anthropic Claude (Sigmoid API 野껋럩?€) | | `gemini` | Google Gemini API | -| `vllm` | OpenAI ?명솚 vLLM (IBM CP4D 吏€???ы븿) | -| `ollama` | 濡쒖뺄 Ollama 紐⑤뜽 | +| `vllm` | OpenAI ?紐낆넎 vLLM (IBM CP4D 筌왖€????釉? | +| `ollama` | 嚥≪뮇類?Ollama 筌뤴뫀??| -**紐⑤뜽 ?쇱슦??*: `ModelRouterService`瑜??듯븳 ?ㅻ쾭?쇱씠???ㅽ깮 ???€??以?紐⑤뜽/?쒕퉬?ㅻ? ?숈쟻?쇰줈 ?꾪솚 媛€?? -**?좏겙 愿€由?*: `TokenEstimator`濡?而⑦뀓?ㅽ듃 湲몄씠 異붿젙, ?ㅻ쾭?뚮줈????`ContextCondenser`媛€ ?먮룞 ?뺤텞 -- `EstimateBaseOverhead(systemPromptLength, toolCount)`: ?쒖뒪???꾨\?꾪듃 + ?꾧뎄 ?뺤쓽 ?ㅻ쾭?ㅻ뱶 異붿젙 -- `_tool_use_blocks` 硫붿떆吏€ 0.6x, `tool_result` 硫붿떆吏€ 0.7x ?좎씤 ?곸슜 -- 而⑦뀓?ㅽ듃 ?ъ슜???쒖떆???쒖뒪???꾨\?꾪듃 + ?꾧뎄 ?ㅻ쾭?ㅻ뱶 ?ы븿 +**筌뤴뫀????깆뒭??*: `ModelRouterService`?????립 ??살쒔??깆뵠????쎄문 ??????餓?筌뤴뫀????뺥돩??? ??덉읅??곗쨮 ?袁れ넎 揶쎛€?? +**?醫뤾쿃 ?온€??*: `TokenEstimator`嚥??뚢뫂???쎈뱜 疫뀀챷???곕뗄?? ??살쒔???쨮????`ContextCondenser`揶쎛€ ?癒?짗 ?類ㅽ뀧 +- `EstimateBaseOverhead(systemPromptLength, toolCount)`: ??뽯뮞???袁⑨세?袁る뱜 + ?袁㏓럡 ?類ㅼ벥 ??살쒔??삳굡 ?곕뗄?? +- `_tool_use_blocks` 筌롫뗄?놅쭪? 0.6x, `tool_result` 筌롫뗄?놅쭪? 0.7x ?醫롮뵥 ?怨몄뒠 +- ?뚢뫂???쎈뱜 ???????뽯뻻????뽯뮞???袁⑨세?袁る뱜 + ?袁㏓럡 ??살쒔??삳굡 ??釉? -### 5.4 ?€???€?μ냼 +### 5.4 ???????關?? -- `ChatStorageService`: SQLite 湲곕컲 ?€???곸냽??- `ChatSessionStateService`: 硫붾え由????몄뀡 ?곹깭 愿€由?- `ChatConversation`: 硫붿떆吏€ 紐⑸줉 + ?ㅽ뻾 ?대깽???€?꾨씪??+ `Archived` ?꾩뭅?대툕 ?뚮옒洹? +- `ChatStorageService`: SQLite 疫꿸퀡而??????怨몃꺗??- `ChatSessionStateService`: 筌롫뗀?덄뵳????紐꾨€??怨밴묶 ?온€??- `ChatConversation`: 筌롫뗄?놅쭪? 筌뤴뫖以?+ ??쎈뻬 ??€源?????袁⑥뵬??+ `Archived` ?袁⑸춦??€?????삋域? --- -## 6. UI 怨꾩링 +## 6. UI ?④쑴留? -### 二쇱슂 ?덈룄?? -| ?덈룄??| ??븷 | +### 雅뚯눘????덈즲?? +| ??덈즲??| ??釉?| |--------|------| -| `LauncherWindow` | 硫붿씤 ?곗쿂 (寃€?? ?꾩젽, 寃곌낵 紐⑸줉) | -| `ChatWindow` | AI ?먯씠?꾪듃 ?€??(梨꾪똿/Cowork/肄붾뱶 ?? | -| `DockBarWindow` | ??諛?(?쒖뒪??由ъ냼?? 鍮좊Ⅸ ?묎렐) | -| `SettingsWindow` | ?ㅼ젙 愿€由?| -| `AgentSettingsWindow` | ?먯씠?꾪듃 ?꾩슜 ?ㅼ젙 | -| `AgentStatsDashboardWindow` | ?먯씠?꾪듃 ?듦퀎 ?€?쒕낫??| -| `SkillEditorWindow` | ?ㅽ궗 ?몄쭛湲?| -| `SkillGalleryWindow` | ?ㅽ궗 媛ㅻ윭由?| -| `TrayMenuWindow` | ?쒖뒪???몃젅??硫붾돱 | -| `PreviewWindow` | 臾몄꽌 誘몃━蹂닿린 (WebView2) | +| `LauncherWindow` | 筌롫뗄???怨쀬퓗 (野꺜€?? ?袁⑹졐, 野껉퀗??筌뤴뫖以? | +| `ChatWindow` | AI ?癒?뵠?袁る뱜 ????(筌?쑵??Cowork/?꾨뗀諭??? | +| `DockBarWindow` | ??獄?(??뽯뮞???귐딅꺖?? ??쥓???臾롫젏) | +| `SettingsWindow` | ??쇱젟 ?온€??| +| `AgentSettingsWindow` | ?癒?뵠?袁る뱜 ?袁⑹뒠 ??쇱젟 | +| `AgentStatsDashboardWindow` | ?癒?뵠?袁る뱜 ???€?????뺣궖??| +| `SkillEditorWindow` | ??쎄텢 ?紐꾩춿疫?| +| `SkillGalleryWindow` | ??쎄텢 揶쎼끇??뵳?| +| `TrayMenuWindow` | ??뽯뮞???紐껋쟿??筌롫뗀??| +| `PreviewWindow` | ?얜챷苑?沃섎챶?곮퉪?용┛ (WebView2) | -### ChatWindow 遺꾪븷 援ъ“ +### ChatWindow ?브쑵釉??닌듼€? -`ChatWindow.xaml.cs`??partial class濡?湲곕뒫蹂?遺꾪븷: +`ChatWindow.xaml.cs`??partial class嚥?疫꿸퀡?ヨ퉪??브쑵釉? -| ?뚯씪 | ??븷 | +| ???뵬 | ??釉?| |------|------| -| `ChatWindow.xaml.cs` | 硫붿씤 ?ㅼ??ㅽ듃?덉씠?? ?ㅽ듃由щ컢, ?낅젰 泥섎━ | -| `ChatWindow.AgentEventProcessor.cs` | ?먯씠?꾪듃 ?대깽???섏떊/?쇱슦??| -| `ChatWindow.AgentEventRendering.cs` | ?먯씠?꾪듃 ?대깽??諛곕꼫/移대뱶 ?뚮뜑留?(SessionStart/UserPromptSubmit ?④?) | -| `ChatWindow.AgentStatusPresentation.cs` | ?먯씠?꾪듃 ?ㅼ떆媛??곹깭 ?쒖떆 | -| `ChatWindow.ComposerQueuePresentation.cs` | ?묒꽦湲???UI | -| `ChatWindow.ContextUsagePresentation.cs` | 而⑦뀓?ㅽ듃 ?ъ슜??留??앹뾽 | -| `ChatWindow.ConversationFilterPresentation.cs` | ?€???꾪꽣留?| -| `ChatWindow.ConversationListPresentation.cs` | ?ъ씠?쒕컮 ?€??紐⑸줉 | -| `ChatWindow.ConversationManagementPresentation.cs` | ?€???앹꽦/??젣/愿€由?| -| `ChatWindow.FileBrowserPresentation.cs` | ?뚯씪 釉뚮씪?곗? UI | -| `ChatWindow.FooterPresentation.cs` | ?섎떒 諛?(?대뜑, 沅뚰븳) | -| `ChatWindow.GitBranchPresentation.cs` | Git 釉뚮옖移??쒖떆/?꾪솚 | -| `ChatWindow.LiveProgressPresentation.cs` | ?ㅼ떆媛?吏꾪뻾 ?곹깭 | -| `ChatWindow.MessageBubblePresentation.cs` | 硫붿떆吏€ 踰꾨툝 ?뚮뜑留?| -| `ChatWindow.MessageInteractions.cs` | 硫붿떆吏€ 蹂듭궗/?몄쭛/?ъ쟾??| -| `ChatWindow.PermissionPresentation.cs` | 沅뚰븳 ?앹뾽/諛곕꼫 UI | -| `ChatWindow.PlanApprovalPresentation.cs` | 怨꾪쉷 ?뱀씤 移대뱶 | -| `ChatWindow.PopupPresentation.cs` | 怨듯넻 ?앹뾽 援ъ꽦 | -| `ChatWindow.PreviewPresentation.cs` | ?뚯씪 誘몃━蹂닿린 ??| -| `ChatWindow.SelectionPopupPresentation.cs` | ?뚰겕?몃━ ?좏깮 ?앹뾽 | -| `ChatWindow.SidebarInteractionPresentation.cs` | ?ъ씠?쒕컮 ?곹샇?묒슜 | -| `ChatWindow.StatusPresentation.cs` | ?곹깭 諛곗?/?ㅽ듃由?| -| `ChatWindow.SurfaceVisualPresentation.cs` | ?쒓컖 ?④낵 (湲€濡쒖슦, ?꾩뒪 ?? | -| `ChatWindow.TaskSummary.cs` | ?묒뾽 ?붿빟 移대뱶 | -| `ChatWindow.TimelinePresentation.cs` | ?€?꾨씪???뺣젹, 罹먯떆, ?대깽???꾪꽣留?| -| `ChatWindow.TopicPresetPresentation.cs` | 二쇱젣 ?꾨━??UI | -| `ChatWindow.TranscriptHost.cs` | ?몃옖?ㅽ겕由쏀듃 ?몄뒪??而⑦뀒?대꼫 | -| `ChatWindow.TranscriptPolicy.cs` | ?몃옖?ㅽ겕由쏀듃 ?쒖떆 ?뺤콉 | -| `ChatWindow.TranscriptRenderExecution.cs` | ?몃옖?ㅽ겕由쏀듃 ?뚮뜑 ?ㅽ뻾 | -| `ChatWindow.TranscriptRenderPlanner.cs` | ?몃옖?ㅽ겕由쏀듃 ?뚮뜑 怨꾪쉷 | -| `ChatWindow.TranscriptRendering.cs` | ?몃옖?ㅽ겕由쏀듃 ?뚮뜑留?| -| `ChatWindow.TranscriptVirtualization.cs` | ?몃옖?ㅽ겕由쏀듃 媛€?곹솕 (?€洹쒕え ?€?? | -| `ChatWindow.SystemPromptBuilder.cs` | ?쒖뒪???꾨\?꾪듃 ?숈쟻 議곕┰ (???꾨━??而⑦뀓?ㅽ듃 二쇱엯) | -| `ChatWindow.OverlaySettingsPresentation.cs` | ?몃씪???ㅼ젙 ?앹뾽 (紐⑤뜽, 鍮좊Ⅸ?≪뀡) | -| `ChatWindow.UserAskPresentation.cs` | ?ъ슜??吏덈Ц ?몃씪??移대뱶 | -| `ChatWindow.VisualInteractionHelpers.cs` | ?쒓컖 ?곹샇?묒슜 ?ы띁 | +| `ChatWindow.xaml.cs` | 筌롫뗄???????쎈뱜??됱뵠?? ??쎈뱜?귐됱빪, ??낆젾 筌l꼶??| +| `ChatWindow.AgentEventProcessor.cs` | ?癒?뵠?袁る뱜 ??€源????뤿뻿/??깆뒭??| +| `ChatWindow.AgentEventRendering.cs` | ?癒?뵠?袁る뱜 ??€源??獄쏄퀡瑗?燁삳?諭????쐭筌?(SessionStart/UserPromptSubmit ???) | +| `ChatWindow.AgentStatusPresentation.cs` | ?癒?뵠?袁る뱜 ??쇰뻻揶??怨밴묶 ??뽯뻻 | +| `ChatWindow.ComposerQueuePresentation.cs` | ?臾믨쉐疫???UI | +| `ChatWindow.ContextUsagePresentation.cs` | ?뚢뫂???쎈뱜 ?????筌???밸씜 | +| `ChatWindow.ConversationFilterPresentation.cs` | ?????袁り숲筌?| +| `ChatWindow.ConversationListPresentation.cs` | ?????뺤뺍 ????筌뤴뫖以?| +| `ChatWindow.ConversationManagementPresentation.cs` | ??????밴쉐/?????온€??| +| `ChatWindow.FileBrowserPresentation.cs` | ???뵬 ?됰슢??怨? UI | +| `ChatWindow.FooterPresentation.cs` | ??롫뼊 獄?(??€?? 亦낅슦釉? | +| `ChatWindow.GitBranchPresentation.cs` | Git ?됰슢?뽫㎉???뽯뻻/?袁れ넎 | +| `ChatWindow.LiveProgressPresentation.cs` | ??쇰뻻揶?筌욊쑵六??怨밴묶 | +| `ChatWindow.MessageBubblePresentation.cs` | 筌롫뗄?놅쭪? 甕곌쑬?????쐭筌?| +| `ChatWindow.MessageInteractions.cs` | 筌롫뗄?놅쭪? 癰귣벊沅??紐꾩춿/?????| +| `ChatWindow.PermissionPresentation.cs` | 亦낅슦釉???밸씜/獄쏄퀡瑗?UI | +| `ChatWindow.PlanApprovalPresentation.cs` | ?④쑵???諭€??燁삳?諭?| +| `ChatWindow.PopupPresentation.cs` | ?⑤벏????밸씜 ?닌딄쉐 | +| `ChatWindow.PreviewPresentation.cs` | ???뵬 沃섎챶?곮퉪?용┛ ??| +| `ChatWindow.SelectionPopupPresentation.cs` | ??곌쾿?紐꺿봺 ?醫뤾문 ??밸씜 | +| `ChatWindow.SidebarInteractionPresentation.cs` | ?????뺤뺍 ?怨뱀깈?臾믪뒠 | +| `ChatWindow.StatusPresentation.cs` | ?怨밴묶 獄쏄퀣?/??쎈뱜??| +| `ChatWindow.SurfaceVisualPresentation.cs` | ??볦퍟 ??k궢 (疫꼲€嚥≪뮇?? ?袁⑸뮞 ?? | +| `ChatWindow.TaskSummary.cs` | ?臾믩씜 ?遺용튋 燁삳?諭?| +| `ChatWindow.TimelinePresentation.cs` | ???袁⑥뵬???類l졊, 筌?Ŋ?? ??€源???袁り숲筌?| +| `ChatWindow.TopicPresetPresentation.cs` | 雅뚯눘???袁ⓥ봺??UI | +| `ChatWindow.TranscriptHost.cs` | ?紐껋삏??쎄쾿?깆????紐꾨뮞???뚢뫂???€瑗?| +| `ChatWindow.TranscriptPolicy.cs` | ?紐껋삏??쎄쾿?깆?????뽯뻻 ?類ㅼ퐠 | +| `ChatWindow.TranscriptRenderExecution.cs` | ?紐껋삏??쎄쾿?깆??????쐭 ??쎈뻬 | +| `ChatWindow.TranscriptRenderPlanner.cs` | ?紐껋삏??쎄쾿?깆??????쐭 ?④쑵??| +| `ChatWindow.TranscriptRendering.cs` | ?紐껋삏??쎄쾿?깆??????쐭筌?| +| `ChatWindow.TranscriptVirtualization.cs` | ?紐껋삏??쎄쾿?깆???揶쎛€?怨뱀넅 (??域뱀뮆?????? | +| `ChatWindow.SystemPromptBuilder.cs` | ??뽯뮞???袁⑨세?袁る뱜 ??덉읅 鈺곌퀡??(???袁ⓥ봺???뚢뫂???쎈뱜 雅뚯눘?? | +| `ChatWindow.OverlaySettingsPresentation.cs` | ?紐껋뵬????쇱젟 ??밸씜 (筌뤴뫀?? ??쥓???る€? | +| `ChatWindow.UserAskPresentation.cs` | ?????筌욌뜄揆 ?紐껋뵬??燁삳?諭?| +| `ChatWindow.VisualInteractionHelpers.cs` | ??볦퍟 ?怨뱀깈?臾믪뒠 ????| -### ?뚮쭏 ?쒖뒪?? -9媛??뚮쭏 XAML 由ъ냼???뺤뀛?덈━: `Dark`, `Light`, `OLED`, `Nord`, `Monokai`, `Catppuccin`, `Sepia`, `Alfred`, `AlfredLight` +### ???춳 ??뽯뮞?? +9揶????춳 XAML ?귐딅꺖???類ㅻ€??댿봺: `Dark`, `Light`, `OLED`, `Nord`, `Monokai`, `Catppuccin`, `Sepia`, `Alfred`, `AlfredLight` -?고????뚮쭏 ?꾪솚: `SettingsService.Settings.Launcher.Theme` 蹂€寃???由ъ냼???뺤뀛?덈━ 援먯껜 +?怨??????춳 ?袁れ넎: `SettingsService.Settings.Launcher.Theme` 癰궰€野????귐딅꺖???類ㅻ€??댿봺 ?대Ŋ猿? --- -## 7. ?ㅼ젙 援ъ“ (AppSettings) +## 7. ??쇱젟 ?닌듼€?(AppSettings) -### 理쒖긽???ㅼ젙 +### 筌ㅼ뮇湲????쇱젟 -| ?띿꽦 | 湲곕낯媛?| ?ㅻ챸 | +| ??욧쉐 | 疫꿸퀡??첎?| ??살구 | |------|--------|------| -| `AiEnabled` | true | AI 湲곕뒫 ?쒖꽦??| -| `OperationMode` | "internal" | ?댁쁺 紐⑤뱶 (internal/external) | -| `Hotkey` | "Alt+Space" | ?곗쿂 ?⑥텞??| -| `CleanupPeriodDays` | 30 | ?€??蹂닿? 湲곌컙 (?? | -| `InternalModeEnabled` | true | ?щ궡 紐⑤뱶 ?щ? | +| `AiEnabled` | true | AI 疫꿸퀡????뽮쉐??| +| `OperationMode` | "internal" | ??곸겫 筌뤴뫀諭?(internal/external) | +| `Hotkey` | "Alt+Space" | ?怨쀬퓗 ??ν뀧??| +| `CleanupPeriodDays` | 30 | ????癰귣떯? 疫꿸퀗而?(?? | +| `InternalModeEnabled` | true | ??沅?筌뤴뫀諭???? | -### LauncherSettings (以묒꺽) +### LauncherSettings (餓λ쵐爰? -| 洹몃9 | 二쇱슂 ?띿꽦 | +| 域밸챶竊?| 雅뚯눘????욧쉐 | |------|----------| -| ?쒖떆 | `Theme`, `Opacity`, `Position`, `Width`, `MaxResults` | -| 湲€濡쒖슦 | `EnableRainbowGlow`, `EnableSelectionGlow`, `ShowLauncherBorder` | -| ?꾩젽 | `ShowWidgetPerf`, `ShowWidgetPomo`, `ShowWidgetNote`, `ShowWidgetWeather`, `ShowWidgetCalendar`, `ShowWidgetBattery` | -| ??諛?| `DockBarItems`, `DockBarAutoShow`, `DockBarOpacity`, `DockBarRainbowGlow` | -| 湲곕뒫 | `EnableFavorites`, `EnableRecent`, `EnableActionMode`, `EnableClipboardAutoCategory` | +| ??뽯뻻 | `Theme`, `Opacity`, `Position`, `Width`, `MaxResults` | +| 疫꼲€嚥≪뮇??| `EnableRainbowGlow`, `EnableSelectionGlow`, `ShowLauncherBorder` | +| ?袁⑹졐 | `ShowWidgetPerf`, `ShowWidgetPomo`, `ShowWidgetNote`, `ShowWidgetWeather`, `ShowWidgetCalendar`, `ShowWidgetBattery` | +| ??獄?| `DockBarItems`, `DockBarAutoShow`, `DockBarOpacity`, `DockBarRainbowGlow` | +| 疫꿸퀡??| `EnableFavorites`, `EnableRecent`, `EnableActionMode`, `EnableClipboardAutoCategory` | -### LlmSettings (以묒꺽) +### LlmSettings (餓λ쵐爰? -?먯씠?꾪듃??LLM ?곌껐 ?ㅼ젙: ?쒕퉬???좏깮, 紐⑤뜽, API ??(DPAPI ?뷀샇??, ?붾뱶?ъ씤?? ?⑤룄, 理쒕? ?좏겙 ?? -| ?띿꽦 | 湲곕낯媛?| ?ㅻ챸 | +?癒?뵠?袁る뱜??LLM ?怨뚭퍙 ??쇱젟: ??뺥돩???醫뤾문, 筌뤴뫀?? API ??(DPAPI ?酉€???, ?遺얜굡????? ??ㅻ즲, 筌ㅼ뮆? ?醫뤾쿃 ?? +| ??욧쉐 | 疫꿸퀡??첎?| ??살구 | |------|--------|------| -| `UseAutomaticProfileTemperature` | true | ?깅줉 紐⑤뜽 ?꾨줈?뚯씪???먮룞 temperature ?뺤콉 | -| `EnableDetailedLog` | false | ?뚰겕?뚮줈???곸꽭 濡쒓렇 (LLM ?붿껌/?묐떟, ?꾧뎄 ?대젰) | -| `DetailedLogRetentionDays` | 3 | ?곸꽭 濡쒓렇 蹂닿? 湲곌컙 (?? | -| `EnableRawLlmLog` | false | LLM ?붿껌/?묐떟 ?먮Ц 湲곕줉 (?붾쾭源낆슜) | +| `UseAutomaticProfileTemperature` | true | ?源낆쨯 筌뤴뫀???袁⑥쨮???뵬???癒?짗 temperature ?類ㅼ퐠 | +| `EnableDetailedLog` | false | ??곌쾿???쨮???怨멸쉭 嚥≪뮄??(LLM ?遺욧퍕/?臾먮뼗, ?袁㏓럡 ??€?? | +| `DetailedLogRetentionDays` | 3 | ?怨멸쉭 嚥≪뮄??癰귣떯? 疫꿸퀗而?(?? | +| `EnableRawLlmLog` | false | LLM ?遺욧퍕/?臾먮뼗 ?癒??疫꿸퀡以?(?遺얠쒔繹먮굞?? | -### RegisteredModel ?ㅽ뻾 ?꾨줈?뚯씪 +### RegisteredModel ??쎈뻬 ?袁⑥쨮???뵬 -紐⑤뜽蹂?`ExecutionProfile`濡??꾧뎄 ?몄텧 媛뺣룄, ?ъ떆?? 硫붾え由??뺤텞 二쇱엯?됱쓣 議곗젅: +筌뤴뫀?썼퉪?`ExecutionProfile`嚥??袁㏓럡 ?紐꾪뀱 揶쏅베猷? ????? 筌롫뗀?덄뵳??類ㅽ뀧 雅뚯눘???깆뱽 鈺곌퀣?? -| ?꾨줈?뚯씪 | ?ㅻ챸 | +| ?袁⑥쨮???뵬 | ??살구 | |---------|------| -| `balanced` | 湲곕낯 洹좏삎 紐⑤뱶 | -| `tool_call_strict` | ?꾧뎄 ?몄텧 媛뺤젣/?꾧꺽 紐⑤뱶 | -| `reasoning_first` | 異붾줎 ?곗꽑 紐⑤뱶 | -| `fast_readonly` | 鍮좊Ⅸ ?쎄린 ?꾩슜 紐⑤뱶 | -| `document_heavy` | 臾몄꽌 泥섎━ 吏묒쨷 紐⑤뱶 | +| `balanced` | 疫꿸퀡??域뱀쥚??筌뤴뫀諭?| +| `tool_call_strict` | ?袁㏓럡 ?紐꾪뀱 揶쏅벡???袁㏐봄 筌뤴뫀諭?| +| `reasoning_first` | ?곕뗀以??怨쀪퐨 筌뤴뫀諭?| +| `fast_readonly` | ??쥓????꾨┛ ?袁⑹뒠 筌뤴뫀諭?| +| `document_heavy` | ?얜챷苑?筌l꼶??筌욌쵐夷?筌뤴뫀諭?| --- -## 8. ?뚮윭洹몄씤 ?쒖뒪?? +## 8. ???쑎域밸챷????뽯뮞?? ### SDK (AxCopilot.SDK) ```csharp public interface IActionHandler { - string? Prefix { get; } // ?묐몢??(null?대㈃ ?쇱? 寃€?됰쭔) + string? Prefix { get; } // ?臾먮あ??(null??€????? 野꺜€??곗춸) PluginMetadata Metadata { get; } Task> GetItemsAsync(string query, CancellationToken ct); Task ExecuteAsync(LauncherItem item, CancellationToken ct); } ``` -### 媛쒕컻 諛⑸쾿 +### 揶쏆뮆而?獄쎻뫖苡? -1. `AxCopilot.SDK` 李몄“?섏뿬 `IActionHandler` 援ы쁽 -2. 鍮뚮뱶??`.dll`??`settings.json`??`Plugins` 諛곗뿴??寃쎈줈 ?깅줉 -3. `PluginHost`媛€ ???쒖옉 ???숈쟻 濡쒕뱶 +1. `AxCopilot.SDK` 筌〓챷???뤿연 `IActionHandler` ?닌뗭겱 +2. ??슢諭??`.dll`??`settings.json`??`Plugins` 獄쏄퀣肉??野껋럥以??源낆쨯 +3. `PluginHost`揶쎛€ ????뽰삂 ????덉읅 嚥≪뮆諭? --- -## 9. 鍮뚮뱶 諛??ㅽ뻾 +## 9. ??슢諭?獄???쎈뻬 -### 媛쒕컻 鍮뚮뱶 +### 揶쏆뮆而???슢諭? ```bash dotnet build src/AxCopilot/AxCopilot.csproj ``` -### 鍮좊Ⅸ 鍮뚮뱶 (?뷀샇???ㅼ튂?꾨줈洹몃옩 ?앸왂) +### ??쥓????슢諭?(?酉€?????쇳뒄?袁⑥쨮域밸챶????몄셽) ```bash ./build-quick.sh ``` -硫붿씤 ?깅쭔 self-contained ?⑥씪 ?뚯씪濡?鍮뚮뱶?⑸땲?? AxKeyEncryptor/Installer/?쒕룆?붾? 嫄대꼫?곗뼱 鍮좊Ⅸ 媛쒕컻 諛섎났???곹빀?⑸땲?? +筌롫뗄???源낆춸 self-contained ??μ뵬 ???뵬嚥???슢諭??몃빍?? AxKeyEncryptor/Installer/??뺣즴?遺? 椰꾨?瑗?怨쀫선 ??쥓??揶쏆뮆而?獄쏆꼶????怨밸???몃빍?? -### 由대━??鍮뚮뱶 (?⑥씪 ?뚯씪) +### ?깅??????슢諭?(??μ뵬 ???뵬) ```bash dotnet publish src/AxCopilot/AxCopilot.csproj -c Release -r win-x64 --self-contained ``` -由대━??鍮뚮뱶 ?듭뀡: -- `PublishSingleFile`: ?⑥씪 ?ㅽ뻾 ?뚯씪 -- `EnableCompressionInSingleFile`: ?뺤텞 ?곸슜 -- `PublishReadyToRun`: AOT ?꾨━而댄뙆??- `DebugType=none`: ?붾쾭洹??щ낵 ?쒓굅 -- `TrimMode=partial`: IL ?몃━諛? -### ?뚯뒪?? +?깅??????슢諭????€? +- `PublishSingleFile`: ??μ뵬 ??쎈뻬 ???뵬 +- `EnableCompressionInSingleFile`: ?類ㅽ뀧 ?怨몄뒠 +- `PublishReadyToRun`: AOT ?袁ⓥ봺?뚮똾???- `DebugType=none`: ?遺얠쒔域???????볤탢 +- `TrimMode=partial`: IL ?紐꺿봺獄? +### ???뮞?? ```bash dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj ``` --- -## 10. 踰꾩쟾 愿€由? -- `AxCopilot.csproj`??`` ?쒓렇 ?섎굹留?蹂€寃쏀븯硫????꾩껜??諛섏쁺 -- ?ㅼ젙 ?ㅽ궎留?踰꾩쟾?€ `SettingsService.cs` ??`CurrentSettingsVersion`?먯꽌 蹂꾨룄 愿€由?- 留덉씠洹몃젅?댁뀡: `SettingsService`媛€ ?댁쟾 踰꾩쟾 ?ㅼ젙 ?뚯씪???먮룞 ?낃렇?덉씠?? +## 10. 甕곌쑴???온€?? +- `AxCopilot.csproj`??`` ??볥젃 ??롪돌筌?癰궰€野껋?釉?쭖????袁⑷퍥??獄쏆꼷?? +- ??쇱젟 ??쎄텕筌?甕곌쑴??? `SettingsService.cs` ??`CurrentSettingsVersion`?癒?퐣 癰귢쑬猷??온€??- 筌띾뜆?졿뉩紐껋쟿??곷€? `SettingsService`揶쎛€ ??곸읈 甕곌쑴????쇱젟 ???뵬???癒?짗 ??껊젃??됱뵠?? --- -## 11. 蹂댁븞 +## 11. 癰귣똻釉? -| ??ぉ | 援ы쁽 | +| ????| ?닌뗭겱 | |------|------| -| API ???€??| DPAPI ?뷀샇??(System.Security.Cryptography.ProtectedData) | -| ??愿€由??꾧뎄 | AxKeyEncryptor (蹂꾨룄 ?좏떥由ы떚) | -| ?덊떚 ?ы띁 | ?붾쾭嫄??붿뺨?뚯씪??媛먯? (Release 鍮뚮뱶, `Security/AntiTamper.cs`) | -| Unsafe 肄붾뱶 | `AllowUnsafeBlocks=true` (ScreenCaptureHandler ?ъ씤???곗궛?? | +| API ??????| DPAPI ?酉€???(System.Security.Cryptography.ProtectedData) | +| ???온€???袁㏓럡 | AxKeyEncryptor (癰귢쑬猷??醫뤿뼢?귐뗫뼒) | +| ??딅뼒 ????| ?遺얠쒔椰??遺용벰???뵬??揶쏅Ŋ? (Release ??슢諭? `Security/AntiTamper.cs`) | +| Unsafe ?꾨뗀諭?| `AllowUnsafeBlocks=true` (ScreenCaptureHandler ??????怨쀪텦?? | --- -## 12. ?깅뒫 理쒖쟻???댁뿭 +## 12. ?源낅뮟 筌ㅼ뮇?????곷열 -### ?좏쑕 CPU 理쒖쟻??(2026-04-09) +### ?醫륁몧 CPU 筌ㅼ뮇???(2026-04-09) -| ?€??| 蹂€寃???| 蹂€寃???| +| ????| 癰궰€野???| 癰궰€野???| |------|---------|---------| -| PerformanceMonitorService ?대쭅 | 2珥?| 5珥?| -| ?꾩젽 ?€?대㉧ | 1珥?| 3珥?| -| ?덉씤蹂댁슦 湲€濡쒖슦 ?€?대㉧ | 150ms | 300ms | -| ServerStatusService ??| 15珥?| 60珥?| +| PerformanceMonitorService ??€彛?| 2??| 5??| +| ?袁⑹졐 ????€??| 1??| 3??| +| ??됱뵥癰귣똻??疫꼲€嚥≪뮇??????€??| 150ms | 300ms | +| ServerStatusService ??| 15??| 60??| -### ?ㅽ듃由щ컢 ?뚮뜑留?理쒖쟻??(2026-04-09) +### ??쎈뱜?귐됱빪 ???쐭筌?筌ㅼ뮇???(2026-04-09) -- **TypingTimer**: 50ms ??80ms, `string.Concat` ??`char[]` 踰꾪띁 ?ъ궗??- **CursorTimer**: ?꾩껜 臾몄옄???ъ깮????留덉?留?臾몄옄留?援먯껜 -- **StringBuilder.ToString()**: 30ms 理쒖냼 媛꾧꺽 ?곕줈?€留?- **RenderMessages**: ?ㅽ듃由щ컢 以?遺덊븘?뷀븳 ?꾩껜 ?щ젋?붾쭅 諛⑹? (議곌린 諛섑솚) -- **?€?꾨씪???대깽??*: ?묓엺 紐⑤뱶?먯꽌 ?곗냽 ?숈씪 ToolCall 蹂묓빀 +- **TypingTimer**: 50ms ??80ms, `string.Concat` ??`char[]` 甕곌쑵????沅??- **CursorTimer**: ?袁⑷퍥 ?얜챷?????源????筌띾뜆?筌??얜챷?꾬쭕??대Ŋ猿? +- **StringBuilder.ToString()**: 30ms 筌ㅼ뮇??揶쏄쑨爰??怨뺤쨮??筌?- **RenderMessages**: ??쎈뱜?귐됱빪 餓??븍뜇釉?酉€釉??袁⑷퍥 ????遺얠춦 獄쎻뫗? (鈺곌퀗由?獄쏆꼹?? +- **???袁⑥뵬????€源??*: ?臾볦뿺 筌뤴뫀諭?癒?퐣 ?怨쀫꺗 ??덉뵬 ToolCall 癰귣쵑鍮€ -### ?고????덉젙???섏젙 (2026-04-09) +### ?怨?????됱젟????륁젟 (2026-04-09) -| ?뚯씪 | ?섏젙 ?댁슜 | +| ???뵬 | ??륁젟 ??곸뒠 | |------|----------| -| `CsvSkill.cs` | JSON 諛곗뿴 泥??붿냼 `ValueKind` 寃€利?異붽? | -| `HtmlSkill.cs` | gradient `Split(',')` 寃곌낵 `Length >= 2` 媛€??異붽? | -| `ChatWindow.xaml.cs` | `ParseGenericAction` 鍮?諛곗뿴 媛€?? `ShowDropActionMenu` null 媛€?? `GetAgentLoop` `.FirstOrDefault()` ?꾪솚 | -| `ChatWindow.GitBranchPresentation.cs` | async void ?몃뱾??try/catch 蹂댄샇 | -| `ChatWindow.xaml.cs` (BtnGitBranch_Click) | async void ?몃뱾??try/catch 蹂댄샇 | +| `CsvSkill.cs` | JSON 獄쏄퀣肉?筌??遺용꺖 `ValueKind` 野꺜€筌??곕떽? | +| `HtmlSkill.cs` | gradient `Split(',')` 野껉퀗??`Length >= 2` 揶쎛€???곕떽? | +| `ChatWindow.xaml.cs` | `ParseGenericAction` ??獄쏄퀣肉?揶쎛€?? `ShowDropActionMenu` null 揶쎛€?? `GetAgentLoop` `.FirstOrDefault()` ?袁れ넎 | +| `ChatWindow.GitBranchPresentation.cs` | async void ?紐껊굶??try/catch 癰귣똾??| +| `ChatWindow.xaml.cs` (BtnGitBranch_Click) | async void ?紐껊굶??try/catch 癰귣똾??| -### UI ?ㅻ젅??遺€??理쒖쟻??2李?(2026-04-09) +### UI ??살쟿???봔€??筌ㅼ뮇???2筌?(2026-04-09) -| ?€??| 蹂€寃???| 蹂€寃???| ?④낵 | +| ????| 癰궰€野???| 癰궰€野???| ??k궢 | |------|---------|---------|------| -| ?ㅽ겕濡??좊땲硫붿씠??| 留ㅻ쾲 ??16ms ?€?대㉧ ?앹꽦 | ?ъ궗??32ms ?€?대㉧ 1媛?| GC ?뺣젰 + ?€?대㉧ ?꾩쟻 ?댁냼 | -| ?ъ씠?쒕컮 ?좊땲硫붿씠??| 留ㅻ쾲 ??10ms ?€?대㉧ ?앹꽦 | ?ъ궗??32ms ?€?대㉧ 1媛?| ?숈씪 | -| Git 釉뚮옖移?UI | `Dispatcher.Invoke` (釉붾줈?? | `Dispatcher.InvokeAsync` (?쇰툝濡쒗궧) | UI ?ㅻ젅??李⑤떒 ?댁냼 | -| ?좏겙 ?ъ슜????| 留?250ms PathGeometry ?ъ깮??| 1% 誘몃쭔 蹂€?????뚮뜑留??앸왂 | 遺덊븘?뷀븳 ?덉씠?꾩썐 ?곗궛 ?쒓굅 | -| ?€??寃€???€?대㉧ | 140ms | 300ms | 珥덈떦 7????3??| -| ?먯씠?꾪듃 ?대깽???€?대㉧ | 140ms (?ㅽ듃由щ컢: 300/420) | 200ms (?ㅽ듃由щ컢: 350/500) | ?대깽??泥섎━ 鍮덈룄 ?꾪솕 | -| 諛섏쓳???덉씠?꾩썐 ?€?대㉧ | 120ms | 250ms | 由ъ궗?댁쫰 ?붾컮?댁뒪 媛뺥솕 | -| ?€??紐⑸줉 LINQ | Where횞2 + Count횞3 = 由ъ뒪??5???쒗쉶 | Where 1??蹂묓빀 + ?⑥씪 猷⑦봽 移댁슫??| ?좊떦/?쒗쉶 ?€??媛먯냼 | +| ??쎄쾿嚥??醫딅빍筌롫뗄???| 筌띲끇苡???16ms ????€????밴쉐 | ??沅??32ms ????€??1揶?| GC ?類l젾 + ????€???袁⑹읅 ??곷꺖 | +| ?????뺤뺍 ?醫딅빍筌롫뗄???| 筌띲끇苡???10ms ????€????밴쉐 | ??沅??32ms ????€??1揶?| ??덉뵬 | +| Git ?됰슢?뽫㎉?UI | `Dispatcher.Invoke` (?됰뗀以?? | `Dispatcher.InvokeAsync` (??고닜嚥≪뮉沅? | UI ??살쟿??筌△뫀????곷꺖 | +| ?醫뤾쿃 ???????| 筌?250ms PathGeometry ??源??| 1% 沃섎챶彛?癰궰€???????쐭筌???몄셽 | ?븍뜇釉?酉€釉???됱뵠?袁⑹뜍 ?怨쀪텦 ??볤탢 | +| ????野꺜€??????€??| 140ms | 300ms | ?λ뜄??7????3??| +| ?癒?뵠?袁る뱜 ??€源??????€??| 140ms (??쎈뱜?귐됱빪: 300/420) | 200ms (??쎈뱜?귐됱빪: 350/500) | ??€源??筌l꼶????뜄猷??袁れ넅 | +| 獄쏆꼷?????됱뵠?袁⑹뜍 ????€??| 120ms | 250ms | ?귐딄텢??곸グ ?遺얠뺍??곷뮞 揶쏅벤??| +| ????筌뤴뫖以?LINQ | Where?? + Count?? = ?귐딅뮞??5????쀬돳 | Where 1??癰귣쵑鍮€ + ??μ뵬 ?룐뫂遊?燁삳똻???| ?醫딅뼣/??쀬돳 ????揶쏅Ŋ??| -### 援ъ“??硫붾え由??덉젙???섏젙 (2026-04-09) +### ?닌듼€??筌롫뗀?덄뵳???됱젟????륁젟 (2026-04-09) -| 臾몄젣 | ?꾩튂 | ?섏젙 | +| ?얜챷??| ?袁⑺뒄 | ??륁젟 | |------|------|------| -| Events 而щ젆??臾댄븳 ?깆옣 | `AgentLoopService.cs` | 500媛?珥덇낵 ???ㅻ옒???대깽???먮룞 ?쒓굅 | -| ?뚯씪 釉뚮씪?곗? ?€?대㉧ 醫€鍮?| `ChatWindow.FileBrowserPresentation.cs` | 留ㅻ쾲 ???€?대㉧ ?앹꽦 ???ъ궗???⑦꽩 | -| ?섎━癒쇳듃 罹먯떆 誘몄젙由?| `ChatWindow.TranscriptVirtualization.cs` | 蹂댁쑀 ?쒕룄 240??20, 1.5諛?珥덇낵 ???뺣━ | -| WorkflowAnalyzer UI 釉붾줈??| `WorkflowAnalyzerWindow.xaml.cs` | `Dispatcher.Invoke` ??`InvokeAsync` | +| Events ?뚎됱젂???얜똾釉??源놁삢 | `AgentLoopService.cs` | 500揶??λ뜃??????살삋????€源???癒?짗 ??볤탢 | +| ???뵬 ?됰슢??怨? ????€???ヂ€??| `ChatWindow.FileBrowserPresentation.cs` | 筌띲끇苡???????€????밴쉐 ????沅?????쉘 | +| ??롡봺?믪눛??筌?Ŋ??沃섎챷?숂뵳?| `ChatWindow.TranscriptVirtualization.cs` | 癰귣똻?€ ??뺣즲 240??20, 1.5獄??λ뜃?????類b봺 | +| WorkflowAnalyzer UI ?됰뗀以??| `WorkflowAnalyzerWindow.xaml.cs` | `Dispatcher.Invoke` ??`InvokeAsync` | -### 援ъ“??由ы뙥?좊쭅 P1 (2026-04-09) +### ?닌듼€???귐뗫솯?醫딆춦 P1 (2026-04-09) -| ?€??| ?뚯씪 | 蹂€寃?| +| ????| ???뵬 | 癰궰€野?| |------|------|------| -| ?명겕由щ찘???뚮뜑 hiddenCount ?덉젙??| `ChatWindow.TranscriptRenderPlanner.cs` | ?ㅽ듃由щ컢 以?hiddenCount 媛먯냼 李⑤떒 ??prefix ??遺덉씪移섎줈 ?명븳 ?꾩껜 ?щ퉴???대갚 諛⑹? | -| 鍮꾧????뚮뜑 李⑤떒 | `ChatWindow.TranscriptRendering.cs` | 理쒖냼???④? ?곹깭?먯꽌 RenderMessages 利됱떆 諛섑솚 ??遺덊븘?뷀븳 UI ?ш뎄異??쒓굅 | -| ConversationList ?대깽???꾩엫 | `ChatWindow.ConversationListPresentation.cs` | ??ぉ??5媛??뚮떎 ?몃뱾????ConversationPanel???⑥씪 ?꾩엫 ?몃뱾??(Tag 湲곕컲 遺꾧린). ???꾪솚 ??250媛??몃뱾???꾩쟻 ?댁냼 | -| TopicPreset ?대깽???꾩엫 | `ChatWindow.TopicPresetPresentation.cs` | 移대뱶??3媛??뚮떎 ?몃뱾????TopicButtonPanel???⑥씪 ?꾩엫 ?몃뱾?? ???꾪솚 ??45媛??몃뱾???꾩쟻 ?댁냼 | -| 怨듯넻 VisualTree ?ы띁 | `ChatWindow.VisualInteractionHelpers.cs` | `FindAncestorWithTag`, `FindAncestor` ?좏떥 異붽? | +| ?紐낃쾿?귐됱컲?????쐭 hiddenCount ??됱젟??| `ChatWindow.TranscriptRenderPlanner.cs` | ??쎈뱜?귐됱빪 餓?hiddenCount 揶쏅Ŋ??筌△뫀????prefix ???븍뜆?ょ㎉?롮쨮 ?紐낅립 ?袁⑷퍥 ???????€媛?獄쎻뫗? | +| ??쑨??????쐭 筌△뫀??| `ChatWindow.TranscriptRendering.cs` | 筌ㅼ뮇?????? ?怨밴묶?癒?퐣 RenderMessages 筌앸맩??獄쏆꼹?????븍뜇釉?酉€釉?UI ???꾤빊???볤탢 | +| ConversationList ??€源???袁⑹뿫 | `ChatWindow.ConversationListPresentation.cs` | ?????5揶????뼄 ?紐껊굶????ConversationPanel????μ뵬 ?袁⑹뿫 ?紐껊굶??(Tag 疫꿸퀡而??브쑨由?. ???袁れ넎 ??250揶??紐껊굶???袁⑹읅 ??곷꺖 | +| TopicPreset ??€源???袁⑹뿫 | `ChatWindow.TopicPresetPresentation.cs` | 燁삳?諭??3揶????뼄 ?紐껊굶????TopicButtonPanel????μ뵬 ?袁⑹뿫 ?紐껊굶?? ???袁れ넎 ??45揶??紐껊굶???袁⑹읅 ??곷꺖 | +| ?⑤벏??VisualTree ????| `ChatWindow.VisualInteractionHelpers.cs` | `FindAncestorWithTag`, `FindAncestor` ?醫뤿뼢 ?곕떽? | -### 援ъ“??由ы뙥?좊쭅 P2 (2026-04-09) +### ?닌듼€???귐뗫솯?醫딆춦 P2 (2026-04-09) -| ?€??| ?뚯씪 | 蹂€寃?| +| ????| ???뵬 | 癰궰€野?| |------|------|------| -| _agentLiveContainer ?명겕由щ찘???덉슜 | `TranscriptRenderPlanner.cs`, `TranscriptRenderExecution.cs` | ?쇱씠釉?而⑦뀒?대꼫瑜?expectedChildCount???ы븿, ?명겕由щ찘?????꾩떆 遺꾨━/?ъ궫????`hasExternalChildren` 李⑤떒 ?댁냼 | -| ?ㅽ듃由щ컢 append-only ?뚮뜑 | `TranscriptRenderExecution.cs`, `TranscriptRendering.cs` | prefix 鍮꾧탳 ?고쉶?섎뒗 `TryApplyStreamingAppendRender` 異붽? ??stable ??遺€遺꾩쭛??愿€怨꾨쭔 ?뺤씤, ????ぉ留?異붽? | -| Permission ?대깽???꾩엫 | `ChatWindow.PermissionPresentation.cs` | ?됰떦 4媛??뚮떎 ??PermissionItems???⑥씪 ?꾩엫 ?몃뱾??+ `PermissionItemTag` | -| Preview ???대깽???꾩엫 | `ChatWindow.PreviewPresentation.cs` | ??떦 7媛??뚮떎 ??PreviewTabPanel???⑥씪 ?꾩엫 ?몃뱾??+ `PreviewTabTag` | -| GitBranch ?대깽???꾩엫 | `ChatWindow.GitBranchPresentation.cs`, `SelectionPopupPresentation.cs` | `CreateFlatPopupRow`/`CreatePopupMenuRow` ?됱쓽 ?뚮떎 ??GitBranchItems???⑥씪 ?꾩엫 + `PopupRowTag` | +| _agentLiveContainer ?紐낃쾿?귐됱컲????됱뒠 | `TranscriptRenderPlanner.cs`, `TranscriptRenderExecution.cs` | ??깆뵠???뚢뫂???€瑗ョ몴?expectedChildCount????釉? ?紐낃쾿?귐됱컲?????袁⑸뻻 ?브쑬????沅????`hasExternalChildren` 筌△뫀????곷꺖 | +| ??쎈뱜?귐됱빪 append-only ???쐭 | `TranscriptRenderExecution.cs`, `TranscriptRendering.cs` | prefix ??쑨???怨좎돳??롫뮉 `TryApplyStreamingAppendRender` ?곕떽? ??stable ???봔€?브쑴彛???온€?④쑬彛??類ㅼ뵥, ?????됵쭕??곕떽? | +| Permission ??€源???袁⑹뿫 | `ChatWindow.PermissionPresentation.cs` | ??곕뼣 4揶????뼄 ??PermissionItems????μ뵬 ?袁⑹뿫 ?紐껊굶??+ `PermissionItemTag` | +| Preview ????€源???袁⑹뿫 | `ChatWindow.PreviewPresentation.cs` | ????7揶????뼄 ??PreviewTabPanel????μ뵬 ?袁⑹뿫 ?紐껊굶??+ `PreviewTabTag` | +| GitBranch ??€源???袁⑹뿫 | `ChatWindow.GitBranchPresentation.cs`, `SelectionPopupPresentation.cs` | `CreateFlatPopupRow`/`CreatePopupMenuRow` ??깆벥 ???뼄 ??GitBranchItems????μ뵬 ?袁⑹뿫 + `PopupRowTag` | -### 援ъ“??由ы뙥?좊쭅 P3 (2026-04-09) +### ?닌듼€???귐뗫솯?醫딆춦 P3 (2026-04-09) -| ?€??| ?뚯씪 | 蹂€寃?| +| ????| ???뵬 | 癰궰€野?| |------|------|------| -| FileBrowser 紐낆떆???댁젣 | `ChatWindow.FileBrowserPresentation.cs` | TreeViewItem ?뚮떎?믩챸紐?硫붿꽌??`FileTreeItem_Expanded/DoubleClick/RightClick`) ?꾪솚. `BuildFileTree()` ??`DetachFileTreeHandlers()` ?ш? ?몄텧濡?Clear ???몃뱾???댁젣. ?몃━ ?ш뎄異뺣떦 300媛??몃뱾???꾩쟻 ?댁냼 | +| FileBrowser 筌뤿굞?????곸젫 | `ChatWindow.FileBrowserPresentation.cs` | TreeViewItem ???뼄?誘⑹구筌?筌롫뗄苑??`FileTreeItem_Expanded/DoubleClick/RightClick`) ?袁れ넎. `BuildFileTree()` ??`DetachFileTreeHandlers()` ??? ?紐꾪뀱嚥?Clear ???紐껊굶????곸젫. ?紐꺿봺 ???꾤빊類k뼣 300揶??紐껊굶???袁⑹읅 ??곷꺖 | -> ?꾩껜 怨꾪쉷 ?꾨즺. `docs/STRUCTURAL_REFACTORING_PLAN.md` 李몄“. +> ?袁⑷퍥 ?④쑵???袁⑥┷. `docs/STRUCTURAL_REFACTORING_PLAN.md` 筌〓챷?? -### ?곗쿂 쨌 ?먯씠?꾪듃 由ъ냼???덉젙???섏젙 (2026-04-09) +### ?怨쀬퓗 夷??癒?뵠?袁る뱜 ?귐딅꺖????됱젟????륁젟 (2026-04-09) -| ?€??| ?뚯씪 | 蹂€寃?| +| ????| ???뵬 | 癰궰€野?| |------|------|------| -| LauncherWindow ?대깽???꾩닔 | `LauncherWindow.xaml.cs` | `vm.CloseRequested`, `vm.PropertyChanged`, `app.IndexService.IndexRebuilt` ?몃뱾?щ? ?꾨뱶 ?€????`OnClosed`?먯꽌 `-=` ?댁젣. ViewModel蹂대떎 Window媛€ 癒쇱? ?ロ옄 ??GC ?꾩닔 諛⑹? | -| ChatWindow ?€?대㉧ ?뺣━ | `ChatWindow.xaml.cs` | `Closed` ?몃뱾?ъ뿉 ?꾨씫??8媛??€?대㉧ 紐낆떆??`Stop()` 異붽? + `StopAgentEventProcessor()` ?몄텧 | -| Events ?ㅻ젅???덉쟾 | `AgentLoopService.cs` | Dispatcher ?놁쓣 ??`Events` ?묎렐??`lock(Events)` 異붽? ???숈떆 EmitEvent ?몄텧 ??IndexOutOfRange ?щ옒??諛⑹? | -| NotifyTool ?€?대㉧ ?꾩쟻 | `NotifyTool.cs` | ?뚮┝??`new DispatcherTimer` ??`DoubleAnimation.Completed` 肄쒕갚?쇰줈 ?€泥? 100媛??뚮┝ ??100媛??€?대㉧ ?숈떆 議댁옱 ?댁냼 | -| LauncherWindow ?좎뒪???€?대㉧ | `LauncherWindow.xaml.cs` | `ShowToast()` 留??몄텧 `new DispatcherTimer` ???ъ궗???⑦꽩 + 紐낅챸 硫붿꽌??`ToastTimer_Tick`) | -| LauncherWindow ?€?대㉧ ?뺣━ | `LauncherWindow.xaml.cs` | `OnClosed`??`_toastTimer?.Stop()`, `_indexStatusTimer?.Stop()` 異붽? | +| LauncherWindow ??€源???袁⑸땾 | `LauncherWindow.xaml.cs` | `vm.CloseRequested`, `vm.PropertyChanged`, `app.IndexService.IndexRebuilt` ?紐껊굶??? ?袁⑤굡 ??????`OnClosed`?癒?퐣 `-=` ??곸젫. ViewModel癰귣???Window揶쎛€ ?믪눘? ???쁽 ??GC ?袁⑸땾 獄쎻뫗? | +| ChatWindow ????€???類b봺 | `ChatWindow.xaml.cs` | `Closed` ?紐껊굶??肉??袁⑥뵭??8揶?????€??筌뤿굞???`Stop()` ?곕떽? + `StopAgentEventProcessor()` ?紐꾪뀱 | +| Events ??살쟿????됱읈 | `AgentLoopService.cs` | Dispatcher ??곸뱽 ??`Events` ?臾롫젏??`lock(Events)` ?곕떽? ????덈뻻 EmitEvent ?紐꾪뀱 ??IndexOutOfRange ?????獄쎻뫗? | +| NotifyTool ????€???袁⑹읅 | `NotifyTool.cs` | ???뵝??`new DispatcherTimer` ??`DoubleAnimation.Completed` ?꾩뮆媛??곗쨮 ??筌? 100揶????뵝 ??100揶?????€????덈뻻 鈺곕똻????곷꺖 | +| LauncherWindow ?醫롫뮞??????€??| `LauncherWindow.xaml.cs` | `ShowToast()` 筌??紐꾪뀱 `new DispatcherTimer` ????沅?????쉘 + 筌뤿굝梨?筌롫뗄苑??`ToastTimer_Tick`) | +| LauncherWindow ????€???類b봺 | `LauncherWindow.xaml.cs` | `OnClosed`??`_toastTimer?.Stop()`, `_indexStatusTimer?.Stop()` ?곕떽? | -### Hot path 쨌 由ъ냼??異붽? 理쒖쟻??(2026-04-09) +### Hot path 夷??귐딅꺖???곕떽? 筌ㅼ뮇???(2026-04-09) -| ?€??| ?뚯씪 | 蹂€寃?| +| ????| ???뵬 | 癰궰€野?| |------|------|------| -| GetRuntimeActiveTools 罹먯떆 | `AgentLoopService.cs` | 諛섎났??1~4???몄텧 ??`cachedActiveTools` 濡쒖뺄 蹂€?섎줈 1??罹먯떆. foreach ??`activeToolNames` 怨꾩궛??猷⑦봽 諛뽰쑝濡??몄씠?ㅽ듃 | -| SubAgentTool 痍⑥냼 ?꾪뙆 | `SubAgentTool.cs` | `CancellationTokenSource.CreateLinkedTokenSource(ct)` ?곕룞. Task.Run + loop.RunAsync???좏겙 ?꾨떖. 遺€紐?以묒? ???먯떇 利됱떆 痍⑥냼 | -| ?꾩씠肄??좊땲硫붿씠???ш? ?쒖뼱 | `LauncherWindow.xaml.cs` | `sb.Completed`?먯꽌 利됱떆 ?ш? ??`_iconAnimationDelayTimer` 8珥??쒕젅?? ?좊떦 鍮덈룄 75% 媛먯냼. ?대┃ ???쒕젅??痍⑥냼 ??利됱떆 ?꾪솚 | -| JsonSerializerOptions 怨듭쑀 | `AgentLoopService.cs` | `s_jsonOpts` ?뺤쟻 ?꾨뱶 異붽?, 4媛?`JsonSerializer.Serialize` ?몄텧???곸슜. L4096 `System.Text.Json.` ?묐몢???뺢퇋??| +| GetRuntimeActiveTools 筌?Ŋ??| `AgentLoopService.cs` | 獄쏆꼶???1~4???紐꾪뀱 ??`cachedActiveTools` 嚥≪뮇類?癰궰€??롮쨮 1??筌?Ŋ?? foreach ??`activeToolNames` ?④쑴沅???룐뫂遊?獄쏅쉼?앮에??紐꾩뵠??쎈뱜 | +| SubAgentTool ?띯뫁???袁る솁 | `SubAgentTool.cs` | `CancellationTokenSource.CreateLinkedTokenSource(ct)` ?怨뺣짗. Task.Run + loop.RunAsync???醫뤾쿃 ?袁⑤뼎. ?봔€筌?餓λ쵐? ???癒?뻼 筌앸맩???띯뫁??| +| ?袁⑹뵠???醫딅빍筌롫뗄?????? ??뽯선 | `LauncherWindow.xaml.cs` | `sb.Completed`?癒?퐣 筌앸맩????? ??`_iconAnimationDelayTimer` 8????뺤쟿?? ?醫딅뼣 ??뜄猷?75% 揶쏅Ŋ?? ??€??????뺤쟿???띯뫁????筌앸맩???袁れ넎 | +| JsonSerializerOptions ?⑤벊?€ | `AgentLoopService.cs` | `s_jsonOpts` ?類ㅼ읅 ?袁⑤굡 ?곕떽?, 4揶?`JsonSerializer.Serialize` ?紐꾪뀱???怨몄뒠. L4096 `System.Text.Json.` ?臾먮あ???類?뇣??| -### 업무형 데스크톱 UI 개선 (2026-04-09) +### ?낅Т???곗뒪?ы넲 UI 媛쒖꽑 (2026-04-09) -| ??ぉ | ?뚯씪 | ?섏젙 ?댁슜 | +| ????| ???뵬 | ??륁젟 ??곸뒠 | |------|------|----------| -| 誘몃━蹂닿린 Split Button | `ChatWindow.xaml` | 湲곗〈 `BtnPreviewToggle` (Ellipse ??+ "?꾨━酉?) ??`[??誘몃━蹂닿린 | ??` Split Button?쇰줈 援먯껜. 醫뚯륫 ?좉?, ?곗륫 ?곕툕濡??쒕∼?ㅼ슫 | -| 誘몃━蹂닿린 ?쒕∼?ㅼ슫 | `ChatWindow.PreviewPresentation.cs` | `ShowPreviewTabDropdown()` ???대┛ ??紐⑸줉 ?앹뾽, ?뚯씪 ?뺤옣?먮퀎 ?꾩씠肄? ?쒖꽦 ???섏씠?쇱씠??| -| PreviewDot ??PreviewIcon | `ChatWindow.PreviewPresentation.cs` | `PreviewDot.Fill` 4怨???`PreviewIcon.Foreground` (AccentColor/SecondaryText) ?꾪솚 | -| ?곕툕濡??숆린??| `ChatWindow.PreviewPresentation.cs` | `UpdatePreviewChevronState()` ??`_previewTabs.Count` 湲곕컲 IsHitTestVisible/Opacity ?쒖뼱 | -| 怨꾪쉷 踰꾪듉 ?대룞 | `ChatWindow.xaml` | MoodIconPanel ?숈쟻 二쇱엯 ??StatusBar XAML ?좎뼵 ?붿냼 `BtnPlanViewer`濡??대룞 | -| ShowPlanButton 由ы뙥?좊쭅 | `ChatWindow.PlanApprovalPresentation.cs` | ?숈쟻 Add/Remove ??`Visibility` ?좉? ?⑥닚??+ ?덇굅???뺣━ ?좎? | +| 沃섎챶?곮퉪?용┛ Split Button | `ChatWindow.xaml` | 疫꿸퀣??`BtnPreviewToggle` (Ellipse ??+ "?袁ⓥ봺??) ??`[??沃섎챶?곮퉪?용┛ | ??` Split Button??곗쨮 ?대Ŋ猿? ?ル슣瑜??醫?, ?怨쀫? ?怨뺥닏嚥???뺚댘??쇱뒲 | +| 沃섎챶?곮퉪?용┛ ??뺚댘??쇱뒲 | `ChatWindow.PreviewPresentation.cs` | `ShowPreviewTabDropdown()` ????€????筌뤴뫖以???밸씜, ???뵬 ?類ㅼ삢?癒?€??袁⑹뵠?? ??뽮쉐 ????륁뵠??깆뵠??| +| PreviewDot ??PreviewIcon | `ChatWindow.PreviewPresentation.cs` | `PreviewDot.Fill` 4????`PreviewIcon.Foreground` (AccentColor/SecondaryText) ?袁れ넎 | +| ?怨뺥닏嚥???녿┛??| `ChatWindow.PreviewPresentation.cs` | `UpdatePreviewChevronState()` ??`_previewTabs.Count` 疫꿸퀡而?IsHitTestVisible/Opacity ??뽯선 | +| ?④쑵??甕곌쑵????€猷?| `ChatWindow.xaml` | MoodIconPanel ??덉읅 雅뚯눘????StatusBar XAML ?醫롫섧 ?遺용꺖 `BtnPlanViewer`嚥???€猷?| +| ShowPlanButton ?귐뗫솯?醫딆춦 | `ChatWindow.PlanApprovalPresentation.cs` | ??덉읅 Add/Remove ??`Visibility` ?醫? ??λ떄??+ ??뉕탢???類b봺 ?醫? | -### UX 媛쒖꽑 諛???퀎 ?꾧뎄 ?꾪꽣留?(2026-04-09) +### UX 揶쏆뮇苑?獄??????袁㏓럡 ?袁り숲筌?(2026-04-09) -| ??ぉ | ?뚯씪 | ?섏젙 ?댁슜 | +| ????| ???뵬 | ??륁젟 ??곸뒠 | |------|------|----------| -| ??퀎 ?꾧뎄 ?꾪꽣留?| `IAgentTool.cs`, `ToolRegistry.cs`, `AgentLoopService.cs` | `TabCategory` ?띿꽦 + `ToolTabOverrides` ?뺤뀛?덈━濡?Chat/Cowork/Code ??퀎 ?꾧뎄 遺꾨쪟. Chat=0媛? Cowork=臾몄꽌/?곗씠?? Code=媛쒕컻/?쒖뒪??| -| FolderMapTool 湲곕낯媛?蹂€寃?| `FolderMapTool.cs` | `include_files` 湲곕낯媛?`false` ??`true`. Description???ъ슜 ?쒗븳 媛€?대뱶 異붽? | -| ?먯씠?꾪듃 ?대깽???④? | `AgentEventRendering.cs`, `TimelinePresentation.cs` | `SessionStart`/`UserPromptSubmit` ?대? ?대깽???€?꾨씪??鍮꾪몴??| -| ?ъ슜??硫붿떆吏€ ?뚮뜑留?| `ChatWindow.xaml.cs` | ?꾩넚 ??`InvalidateTimelineCache()` + `preserveViewport:false`濡?利됱떆 ?쒖떆 蹂댁옣 | -| ?꾩뭅?대툕 湲곕뒫 | `ChatModels.cs`, `ConversationManagementPresentation.cs`, `ConversationFilterPresentation.cs`, `ConversationListPresentation.cs` | `Archived` ?띿꽦, 而⑦뀓?ㅽ듃 硫붾돱 ?꾩뭅?대툕 ?좉?, ?ъ씠?쒕컮 ?꾪꽣 踰꾪듉 | -| 而ㅼ뒪?€ ?щ┝ ?ㅽ겕濡ㅻ컮 | `ChatWindow.xaml` | 6px ?щ┝ ScrollBar + Thumb ?쇱슫?? ScrollViewer 留덉슦???ㅻ쾭 fade in/out ?좊땲硫붿씠??| -| ?ㅽ듃由щ컢 硫뷀듃由??덉씠釉?| `ChatWindow.xaml`, `StatusPresentation.cs` | ?낅젰 諛뺤뒪 ?꾩뿉 `StreamMetricsLabel` (寃쎄낵?쒓컙 쨌 ???좏겙 ?? ?ㅼ떆媛??쒖떆 | -| ?꾨━??移대뱶 ?대┃ ?덉젙??| `ChatWindow.xaml`, `ChatWindow.xaml.cs` | WrapPanel `Background="Transparent"` + Dispatcher ?곗꽑?쒖쐞 `Loaded`濡??곹뼢 | -| 而⑦뀓?ㅽ듃 ?좏겙 ?뺥솗??| `TokenEstimator.cs`, `ContextUsagePresentation.cs`, `ILlmService.cs` | ?쒖뒪???꾨\?꾪듃 + ?꾧뎄 ?ㅻ쾭?ㅻ뱶 異붿젙, `_tool_use_blocks`/`tool_result` ?좎씤 | -| UI ?꾨━吏?諛⑹? | `ChatWindow.xaml.cs` | `SaveLastConversations()`/`PersistConversationSnapshot()` ???뚮뜑留???`Task.Run()` 鍮꾨룞湲??ㅽ뻾 | -| 鍮좊Ⅸ 鍮뚮뱶 ?ㅽ겕由쏀듃 | `build-quick.sh` | ?뷀샇???쒕룆???ㅼ튂?꾨줈洹몃옩 嫄대꼫?곕뒗 媛쒕컻??鍮뚮뱶 ?ㅽ겕由쏀듃 | +| ?????袁㏓럡 ?袁り숲筌?| `IAgentTool.cs`, `ToolRegistry.cs`, `AgentLoopService.cs` | `TabCategory` ??욧쉐 + `ToolTabOverrides` ?類ㅻ€??댿봺嚥?Chat/Cowork/Code ?????袁㏓럡 ?브쑬履? Chat=0揶? Cowork=?얜챷苑??怨쀬뵠?? Code=揶쏆뮆而???뽯뮞??| +| FolderMapTool 疫꿸퀡??첎?癰궰€野?| `FolderMapTool.cs` | `include_files` 疫꿸퀡??첎?`false` ??`true`. Description????????쀫립 揶쎛€??€諭??곕떽? | +| ?癒?뵠?袁る뱜 ??€源????? | `AgentEventRendering.cs`, `TimelinePresentation.cs` | `SessionStart`/`UserPromptSubmit` ??€? ??€源?????袁⑥뵬????쑵紐??| +| ?????筌롫뗄?놅쭪? ???쐭筌?| `ChatWindow.xaml.cs` | ?袁⑸꽊 ??`InvalidateTimelineCache()` + `preserveViewport:false`嚥?筌앸맩????뽯뻻 癰귣똻??| +| ?袁⑸춦??€??疫꿸퀡??| `ChatModels.cs`, `ConversationManagementPresentation.cs`, `ConversationFilterPresentation.cs`, `ConversationListPresentation.cs` | `Archived` ??욧쉐, ?뚢뫂???쎈뱜 筌롫뗀???袁⑸춦??€???醫?, ?????뺤뺍 ?袁り숲 甕곌쑵??| +| ?뚣끉??? ??????쎄쾿嚥▲끇而?| `ChatWindow.xaml` | 6px ????ScrollBar + Thumb ??깆뒲?? ScrollViewer 筌띾뜆?????살쒔 fade in/out ?醫딅빍筌롫뗄???| +| ??쎈뱜?귐됱빪 筌롫??껆뵳???됱뵠??| `ChatWindow.xaml`, `StatusPresentation.cs` | ??낆젾 獄쏅벡???袁⑸퓠 `StreamMetricsLabel` (野껋럡???볦퍢 夷????醫뤾쿃 ?? ??쇰뻻揶???뽯뻻 | +| ?袁ⓥ봺??燁삳?諭???€????됱젟??| `ChatWindow.xaml`, `ChatWindow.xaml.cs` | WrapPanel `Background="Transparent"` + Dispatcher ?怨쀪퐨??뽰맄 `Loaded`嚥??怨밸샨 | +| ?뚢뫂???쎈뱜 ?醫뤾쿃 ?類μ넇??| `TokenEstimator.cs`, `ContextUsagePresentation.cs`, `ILlmService.cs` | ??뽯뮞???袁⑨세?袁る뱜 + ?袁㏓럡 ??살쒔??삳굡 ?곕뗄?? `_tool_use_blocks`/`tool_result` ?醫롮뵥 | +| UI ?袁ⓥ봺筌?獄쎻뫗? | `ChatWindow.xaml.cs` | `SaveLastConversations()`/`PersistConversationSnapshot()` ?????쐭筌???`Task.Run()` ??쑬猷욄묾???쎈뻬 | +| ??쥓????슢諭???쎄쾿?깆???| `build-quick.sh` | ?酉€?????뺣즴????쇳뒄?袁⑥쨮域밸챶??椰꾨?瑗?怨뺣뮉 揶쏆뮆而????슢諭???쎄쾿?깆???| -### ?먯씠?꾪듃 猷⑦봽 臾몄꽌 ?앹꽦 ?먮쫫 ?섏젙 (2026-04-09) +### ?癒?뵠?袁る뱜 ?룐뫂遊??얜챷苑???밴쉐 ?癒?カ ??륁젟 (2026-04-09) -| ?뚯씪 | ?섏젙 ?댁슜 | +| ???뵬 | ??륁젟 ??곸뒠 | |------|----------| -| `AgentLoopTransitions.Documents.cs` | `TryHandleTerminalDocumentCompletionTransitionAsync`?먯꽌 `document_plan` ?놁씠 諛붾줈 臾몄꽌 ?꾧뎄 ?몄텧 ??議곌린 醫낅즺 諛⑹? ??LLM??異붽? 諛섎났?쇰줈 ?댁슜??蹂닿컯?????덈룄濡??덉슜 | -| `HtmlSkill.cs` | `MarkdownToHtml`?먯꽌 LLM???쎌엯??`
` ?쒓렇媛€ ?댁뒪耳€?댄봽?섎뒗 踰꾧렇 ?섏젙 ???댁뒪耳€?댄봽 ???뚮젅?댁뒪?€?붾줈 蹂댁〈 ??蹂듭썝 | +| `AgentLoopTransitions.Documents.cs` | `TryHandleTerminalDocumentCompletionTransitionAsync`?癒?퐣 `document_plan` ??곸뵠 獄쏅뗀以??얜챷苑??袁㏓럡 ?紐꾪뀱 ??鈺곌퀗由??ル굝利?獄쎻뫗? ??LLM???곕떽? 獄쏆꼶???곗쨮 ??곸뒠??癰귣떯而??????덈즲嚥???됱뒠 | +| `HtmlSkill.cs` | `MarkdownToHtml`?癒?퐣 LLM????뚯뿯??`
` ??볥젃揶쎛€ ??곷뮞?냈€??꾨늄??롫뮉 甕곌쑨????륁젟 ????곷뮞?냈€??꾨늄 ?????쟿??곷뮞???遺얠쨮 癰귣똻????癰귣벊??| -### Cowork 臾몄꽌 誘몄깮??쨌 ?ㅽ겕濡?쨌 ?꾩넚 ??10珥?硫덉땄 ?섏젙 (2026-04-09) +### Cowork ?얜챷苑?沃섎챷源??夷???쎄쾿嚥?夷??袁⑸꽊 ??10??筌롫뜆????륁젟 (2026-04-09) -#### 臾몄꽌 ?앹꽦 ?먯깋 ?뺤콉 ?섏젙 +#### ?얜챷苑???밴쉐 ?癒?퉳 ?類ㅼ퐠 ??륁젟 -| ?뚯씪 | ?섏젙 ?댁슜 | +| ???뵬 | ??륁젟 ??곸뒠 | |------|----------| -| `AgentLoopExplorationPolicy.cs` | `ExplorationScope.DirectCreation` ?좉퇋 ?ㅼ퐫??異붽?. `HasDocumentCreationIntent()`濡?"?묒꽦?댁쨾/留뚮뱾?댁쨾/?⑥쨾" ???앹꽦 ?숈궗 + 臾몄꽌/蹂닿퀬???€???ㅼ썙??媛먯? | -| `AgentLoopExplorationPolicy.cs` | `DirectCreation` ?ㅼ퐫?꾩뿉??glob/grep/folder_map ?먯깋 李⑤떒 ??`document_plan ??docx_create/html_create` 諛붾줈 ?대룞 | -| `AgentLoopExplorationPolicy.cs` | `FilterExplorationToolsForCurrentIteration`?먯꽌 臾몄꽌 ?앹꽦 ?꾧뎄瑜?理쒖슦???쒖쐞濡?諛곗튂 | -| `AgentLoopExplorationPolicy.cs` | `ShouldInjectExplorationCorrection`?먯꽌 DirectCreation ???먯깋 ?꾧뎄 1???몄텧留뚯쑝濡?利됱떆 援먯젙 二쇱엯 | -| `TaskTypePolicy.cs` | docs 媛€?대뜕?ㅻ? ?앹꽦 vs ?쎄린濡?遺꾧린 ???앹꽦 ??"諛섎뱶???ㅼ젣 ?뚯씪??留뚮뱾?대씪" 紐낆떆 | -| `AgentLoopService.cs` | DirectCreation ?ㅼ퐫???대깽??硫붿떆吏€: "臾몄꽌 ?앹꽦 紐⑤뱶 쨌 諛붾줈 臾몄꽌瑜?留뚮뱶??以? | +| `AgentLoopExplorationPolicy.cs` | `ExplorationScope.DirectCreation` ?醫됲뇣 ??쇳맜???곕떽?. `HasDocumentCreationIntent()`嚥?"?臾믨쉐??곸㉭/筌띾슢諭??곸㉭/??μ㉭" ????밴쉐 ??덇텢 + ?얜챷苑?癰귣떯?????????쇱뜖??揶쏅Ŋ? | +| `AgentLoopExplorationPolicy.cs` | `DirectCreation` ??쇳맜?袁⑸퓠??glob/grep/folder_map ?癒?퉳 筌△뫀????`document_plan ??docx_create/html_create` 獄쏅뗀以???€猷?| +| `AgentLoopExplorationPolicy.cs` | `FilterExplorationToolsForCurrentIteration`?癒?퐣 ?얜챷苑???밴쉐 ?袁㏓럡??筌ㅼ뮇?????뽰맄嚥?獄쏄퀣??| +| `AgentLoopExplorationPolicy.cs` | `ShouldInjectExplorationCorrection`?癒?퐣 DirectCreation ???癒?퉳 ?袁㏓럡 1???紐꾪뀱筌띾슣?앮에?筌앸맩???대Ŋ??雅뚯눘??| +| `TaskTypePolicy.cs` | docs 揶쎛€??€???? ??밴쉐 vs ??꾨┛嚥??브쑨由?????밴쉐 ??"獄쏆꼶諭????쇱젫 ???뵬??筌띾슢諭??€?? 筌뤿굞??| +| `AgentLoopService.cs` | DirectCreation ??쇳맜????€源??筌롫뗄?놅쭪?: "?얜챷苑???밴쉐 筌뤴뫀諭?夷?獄쏅뗀以??얜챷苑뚨몴?筌띾슢諭??餓? | -#### ?ㅽ겕濡?踰꾧렇 ?섏젙 +#### ??쎄쾿嚥?甕곌쑨????륁젟 -| ?뚯씪 | ?섏젙 ?댁슜 | +| ???뵬 | ??륁젟 ??곸뒠 | |------|----------| -| `ChatWindow.xaml.cs` | 硫붿떆吏€ ?꾩넚/?щ옒??而ㅻ㎤??而댄뙥????`RenderMessages(preserveViewport: true)` + `ForceScrollToEnd()` 議고빀 ??`RenderMessages(preserveViewport: false)`濡?蹂€寃? viewport 蹂듭썝怨?ForceScrollToEnd 寃쏀빀 ?쒓굅 | +| `ChatWindow.xaml.cs` | 筌롫뗄?놅쭪? ?袁⑸꽊/??????뚣끇????뚮똾?????`RenderMessages(preserveViewport: true)` + `ForceScrollToEnd()` 鈺곌퀬鍮€ ??`RenderMessages(preserveViewport: false)`嚥?癰궰€野? viewport 癰귣벊?앮€?ForceScrollToEnd 野껋?鍮€ ??볤탢 | -**?먯씤**: `preserveViewport: true`???뚮뜑留????댁쟾 ?ㅽ겕濡??꾩튂瑜?蹂듭썝?섎뒗 肄붾뱶瑜?`DispatcherPriority.Background`濡??덉빟. `ForceScrollToEnd()`??媛숈? ?곗꽑?쒖쐞濡??섎떒 ?ㅽ겕濡ㅼ쓣 ?덉빟?섏뿬 ??肄붾뱶媛€ 寃쏀빀, ?ㅽ겕濡ㅼ씠 ?섎떒?쇰줈 ??媛€??臾몄젣 諛쒖깮. +**?癒?뵥**: `preserveViewport: true`?????쐭筌?????곸읈 ??쎄쾿嚥??袁⑺뒄??癰귣벊???롫뮉 ?꾨뗀諭띄몴?`DispatcherPriority.Background`嚥???됰튋. `ForceScrollToEnd()`??揶쏆늿? ?怨쀪퐨??뽰맄嚥???롫뼊 ??쎄쾿嚥▲끉????됰튋??뤿연 ???꾨뗀諭뜹첎? 野껋?鍮€, ??쎄쾿嚥▲끉????롫뼊??곗쨮 ??揶쎛€???얜챷??獄쏆뮇源? -#### ?꾩넚 ??10珥?硫덉땄 ?섏젙 (Critical Performance Fix) +#### ?袁⑸꽊 ??10??筌롫뜆????륁젟 (Critical Performance Fix) -| ?뚯씪 | ?섏젙 ?댁슜 | +| ???뵬 | ??륁젟 ??곸뒠 | |------|----------| -| `ChatWindow.AgentStatusPresentation.cs` | `BuildFeedbackContext()` ??`_storage.LoadAllMeta()` (紐⑤뱺 .axchat ?뚯씪 蹂듯샇?? + `_storage.Load()` x20?뚮? 留??꾩넚留덈떎 ?숆린 ?ㅽ뻾 ??1遺?罹먯떆 + ?꾩옱 ?€???쇰뱶諛깅쭔 利됱떆 諛섏쁺 + ?꾩껜 媛깆떊?€ 諛깃렇?쇱슫??| -| `ChatWindow.xaml.cs` | `Dispatcher.Invoke()` (?숆린 釉붾줈?? ??`Dispatcher.InvokeAsync()` (鍮꾨룞湲?. background task?먯꽌 UI ?ㅻ젅??釉붾줈???쒓굅 | -| `ChatWindow.xaml.cs` | `PrepareExecutionForConversation()` (?쒖뒪???꾨\?꾪듃 鍮뚮뱶: ?꾨줈?앺듃 洹쒖튃/硫붾え由??쇰뱶諛??붿뒪??I/O) ??`await Task.Run()`?쇰줈 諛깃렇?쇱슫???ㅽ뻾. UI ?ㅻ젅??利됱떆 ?대갑 | +| `ChatWindow.AgentStatusPresentation.cs` | `BuildFeedbackContext()` ??`_storage.LoadAllMeta()` (筌뤴뫀諭?.axchat ???뵬 癰귣벏??? + `_storage.Load()` x20??? 筌??袁⑸꽊筌띾뜄????녿┛ ??쎈뻬 ??1??筌?Ŋ??+ ?袁⑹삺 ??????곕굡獄쏄퉭彛?筌앸맩??獄쏆꼷??+ ?袁⑷퍥 揶쏄퉮??? 獄쏄퉫???깆뒲??| +| `ChatWindow.xaml.cs` | `Dispatcher.Invoke()` (??녿┛ ?됰뗀以?? ??`Dispatcher.InvokeAsync()` (??쑬猷욄묾?. background task?癒?퐣 UI ??살쟿???됰뗀以????볤탢 | +| `ChatWindow.xaml.cs` | `PrepareExecutionForConversation()` (??뽯뮞???袁⑨세?袁る뱜 ??슢諭? ?袁⑥쨮??븍뱜 域뱀뮇??筌롫뗀?덄뵳???곕굡獄??遺용뮞??I/O) ??`await Task.Run()`??곗쨮 獄쏄퉫???깆뒲????쎈뻬. UI ??살쟿??筌앸맩????€媛?| -**?먯씤 遺꾩꽍**: `BuildFeedbackContext()`媛€ `LoadAllMeta()` (紐⑤뱺 `.axchat` ?뚯씪 蹂듯샇?붋룻뙆?? + `Load()` x20 (20媛??€???꾩껜 濡쒕뱶쨌蹂듯샇?? 瑜?UI ?ㅻ젅?쒖뿉???숆린 ?ㅽ뻾. ?€??30媛??댁긽?대㈃ 5~10珥?釉붾줈??諛쒖깮. +**?癒?뵥 ?브쑴苑?*: `BuildFeedbackContext()`揶쎛€ `LoadAllMeta()` (筌뤴뫀諭?`.axchat` ???뵬 癰귣벏??遺뗫;??? + `Load()` x20 (20揶??????袁⑷퍥 嚥≪뮆諭띠쮯癰귣벏??? ??UI ??살쟿??뽯퓠????녿┛ ??쎈뻬. ????30揶???곴맒??€??5~10???됰뗀以??獄쏆뮇源? -### ?ㅽ듃由щ컢 以?UI 踰꾨쾮???€??媛쒖꽑 (2026-04-09) +### ??쎈뱜?귐됱빪 餓?UI 甕곌쑬苡??????揶쏆뮇苑?(2026-04-09) -업무형 데스크톱 UI와 비교했을 때 WPF transcript가 과하게 다시 그려지던 문제를 분석하고 수정했습니다. +?낅Т???곗뒪?ы넲 UI?€ 鍮꾧탳?덉쓣 ??WPF transcript媛€ 怨쇳븯寃??ㅼ떆 洹몃젮吏€??臾몄젣瑜?遺꾩꽍?섍퀬 ?섏젙?덉뒿?덈떎. -**洹쇰낯 ?먯씤**: React virtual DOM?€ 蹂€寃쎈맂 遺€遺꾨쭔 diff/patch?섏?留? WPF??留??뚮뜑留덈떎 ?꾩껜 ?쒓컖???몃━瑜??뚭눼 ???ъ깮?? +**域뱀눖???癒?뵥**: React virtual DOM?? 癰궰€野껋럥留??봔€?브쑬彛?diff/patch???筌? WPF??筌????쐭筌띾뜄???袁⑷퍥 ??볦퍟???紐꺿봺?????댘 ????源?? -| ?먯씤 | ?뚯씪 | ?섏젙 | +| ?癒?뵥 | ???뵬 | ??륁젟 | |------|------|------| -| `ItemsSource = null/?ъ뿰寃? ???꾩껜 ?쒓컖???몃━ ?뚭눼 + VirtualizingStackPanel 而⑦뀒?대꼫 ?ъ깮??| `TranscriptRenderExecution.cs` | ?ㅽ듃由щ컢 以묒뿉??ItemsSource 遺꾨━/?ъ뿰寃?嫄대꼫?€ ??ObservableCollection 吏곸젒 蹂€寃쎌쑝濡??덉씠?꾩썐 ?⑥뒪 理쒖냼??| -| ?쇱씠釉?吏꾪뻾 移대뱶 留ㅻ쾲 ?ъ깮?????ㅻ뜑/援щ텇???ㅽ뀦 ?꾩껜瑜?0遺€???ㅼ떆 ?앹꽦 + ?좊땲硫붿씠???ъ쟻??| `AgentEventRendering.cs` | `_liveProgressCard` 罹먯떆 + `UpdateLiveProgressStepsInPlace()` ??移대뱶 1???앹꽦 ?????ㅽ뀦留?異붽?, 湲곗〈 ?ㅽ뀦?€ ?곗튂 ????| -| ?뚮뜑 ?€?대㉧ 媛꾧꺽 1.5~2.2珥???WPF ?꾩껜 ?щ퉴?쒖뿉 鍮꾪빐 ?덈Т 怨듦꺽??| `ChatWindow.xaml.cs` | lightweight: 2.2s??s, normal: 1.5s??s ???뚮뜑 媛?異⑸텇???ъ쑀 ?뺣낫 | -| 留??뚮뜑留덈떎 3媛??좊땲硫붿씠??Opacity + ScaleX + ScaleY) ?ъ쟻??| `AgentEventRendering.cs` | ?쇱씠釉?移대뱶 in-place ?낅뜲?댄듃濡?湲곗〈 ?좊땲硫붿씠??蹂댁〈, ???ㅽ뀦?먮쭔 ?좊땲硫붿씠???곸슜 | +| `ItemsSource = null/??肉겼칰? ???袁⑷퍥 ??볦퍟???紐꺿봺 ???댘 + VirtualizingStackPanel ?뚢뫂???€瑗???源??| `TranscriptRenderExecution.cs` | ??쎈뱜?귐됱빪 餓λ쵐肉??ItemsSource ?브쑬????肉겼칰?椰꾨?瑗?? ??ObservableCollection 筌욊낯??癰궰€野껋럩?앮에???됱뵠?袁⑹뜍 ??λ뮞 筌ㅼ뮇???| +| ??깆뵠??筌욊쑵六?燁삳?諭?筌띲끇苡???源??????삳쐭/?닌됲뀋????쎈€??袁⑷퍥??0?봔€????쇰뻻 ??밴쉐 + ?醫딅빍筌롫뗄????????| `AgentEventRendering.cs` | `_liveProgressCard` 筌?Ŋ??+ `UpdateLiveProgressStepsInPlace()` ??燁삳?諭?1????밴쉐 ??????쎈€?쭕??곕떽?, 疫꿸퀣????쎈€?? ?怨쀭뒄 ????| +| ???쐭 ????€??揶쏄쑨爰?1.5~2.2????WPF ?袁⑷퍥 ?????뽯퓠 ??쑵鍮???댭??⑤벀爰??| `ChatWindow.xaml.cs` | lightweight: 2.2s??s, normal: 1.5s??s ?????쐭 揶??겸뫖??????€ ?類k궖 | +| 筌????쐭筌띾뜄??3揶??醫딅빍筌롫뗄???Opacity + ScaleX + ScaleY) ?????| `AgentEventRendering.cs` | ??깆뵠??燁삳?諭?in-place ??낅쑓??꾨뱜嚥?疫꿸퀣???醫딅빍筌롫뗄???癰귣똻?? ????쎈€?癒?춸 ?醫딅빍筌롫뗄????怨몄뒠 | -**鍮꾧탳**: +**??쑨??*: -| ??ぉ | ?섏젙 ??(WPF) | ?섏젙 ??| 업무형 데스크톱 UI (React) | +| ????| ??륁젟 ??(WPF) | ??륁젟 ??| ?낅Т???곗뒪?ы넲 UI (React) | |------|-------------|---------|----------------------| -| ?낅뜲?댄듃 ?꾨왂 | ?꾩껜 ?몃━ ?뚭눼?믪옱?앹꽦 | 4?④퀎: StreamingAppend ??Incremental ??**DiffRender** ??FullRender | Virtual DOM diff | -| ?뚮뜑 媛꾧꺽 | 1.5~2.2珥?| 3~4珥?| ~16ms (requestAnimationFrame) | -| ?붿냼 ?ъ궗??| Clear?믪옱?앹꽦 | 罹먯떆?믪옱?ъ슜 + ??湲곕컲 diff | Recycled/Memoized | -| ?좊땲硫붿씠??| 留ㅻ쾲 ?ъ쟻??(3媛??붿냼) | 1???곸슜 ??蹂댁〈 | CSS transform (GPU) | +| ??낅쑓??꾨뱜 ?袁⑥셽 | ?袁⑷퍥 ?紐꺿봺 ???댘?誘れ삺??밴쉐 | 4??m€? StreamingAppend ??Incremental ??**DiffRender** ??FullRender | Virtual DOM diff | +| ???쐭 揶쏄쑨爰?| 1.5~2.2??| 3~4??| ~16ms (requestAnimationFrame) | +| ?遺용꺖 ??沅??| Clear?誘れ삺??밴쉐 | 筌?Ŋ??誘れ삺????+ ??疫꿸퀡而?diff | Recycled/Memoized | +| ?醫딅빍筌롫뗄???| 筌띲끇苡??????(3揶??遺용꺖) | 1???怨몄뒠 ??癰귣똻??| CSS transform (GPU) | --- -### 12-3. Virtual DOM Diff ?뚮뜑 (`TryApplyDiffRender`) +### 12-3. Virtual DOM Diff ???쐭 (`TryApplyDiffRender`) -React??reconciliation怨??숈씪???먮━瑜?WPF???곸슜????湲곕컲 diff ?뚮뜑?낅땲?? +React??reconciliation????덉뵬???癒?봺??WPF???怨몄뒠????疫꿸퀡而?diff ???쐭??낅빍?? -**?뚮뜑 泥댁씤 (?곗꽑?쒖쐞 ??:** +**???쐭 筌k똻??(?怨쀪퐨??뽰맄 ??:** ``` StreamingAppend ??Incremental(prefix-match) ??DiffRender(key-based) ??FullRender ``` -| ?④퀎 | 議곌굔 | ?숈옉 | +| ??m€?| 鈺곌퀗援?| ??덉삂 | |------|------|------| -| StreamingAppend | ?ㅽ듃由щ컢 以?+ 湲곗〈 stable ?ㅺ? 遺€遺꾩쭛??| ???ㅻ쭔 append | -| Incremental | prefix媛€ ?꾩쟾 ?쇱튂 | 瑗щ━ 遺€遺꾨쭔 異붽? | -| **DiffRender** | hiddenCount ?숈씪 + ??吏묓빀 蹂€???덉쓬 | old?먮쭔 ?덈뒗 ????젣(?ㅲ넂?? + new?먮쭔 ?덈뒗 ??異붽? | -| FullRender | ??3媛?紐⑤몢 ?ㅽ뙣 | ?꾩껜 Clear?믪옱?앹꽦 | +| StreamingAppend | ??쎈뱜?귐됱빪 餓?+ 疫꿸퀣??stable ??? ?봔€?브쑴彛??| ????살춸 append | +| Incremental | prefix揶쎛€ ?袁⑹읈 ??깊뒄 | ?쀑됤봺 ?봔€?브쑬彛??곕떽? | +| **DiffRender** | hiddenCount ??덉뵬 + ??筌욌쵑鍮€ 癰궰€????됱벉 | old?癒?춸 ??덈뮉 ????????뀀꼥?? + new?癒?춸 ??덈뮉 ???곕떽? | +| FullRender | ??3揶?筌뤴뫀紐???쎈솭 | ?袁⑷퍥 Clear?誘れ삺??밴쉐 | -**?듭떖 ?뚭퀬由ъ쬁:** -1. `oldKeys` ??index ?뺤뀛?덈━ / `newKeys` ??HashSet 援ъ텞 -2. ?쇱씠釉?而⑦뀒?대꼫 ?꾩떆 遺꾨━ -3. `oldKeys` ?ㅼ뿉?쒕????쒗쉶?섎ʼn `newKeySet`???녿뒗 ??ぉ ?쒓굅 (?몃뜳???덉젙?? -4. `renderPlan.VisibleTimeline`?먯꽌 `oldKeyIndex`???녿뒗 ??ぉ留?`Render()` -5. ?쇱씠釉?而⑦뀒?대꼫 ?ъ궫?? -**?뚯씪:** `ChatWindow.TranscriptRenderExecution.cs`, `ChatWindow.TranscriptRendering.cs` (泥댁씤 ?쎌엯) +**???뼎 ???€х뵳?弛?** +1. `oldKeys` ??index ?類ㅻ€??댿봺 / `newKeys` ??HashSet ?닌딇뀧 +2. ??깆뵠???뚢뫂???€瑗??袁⑸뻻 ?브쑬?? +3. `oldKeys` ??쇰퓠???????쀬돳??렽?`newKeySet`????용뮉 ??????볤탢 (?紐껊쑔????됱젟?? +4. `renderPlan.VisibleTimeline`?癒?퐣 `oldKeyIndex`????용뮉 ???됵쭕?`Render()` +5. ??깆뵠???뚢뫂???€瑗???沅?? +**???뵬:** `ChatWindow.TranscriptRenderExecution.cs`, `ChatWindow.TranscriptRendering.cs` (筌k똻????뚯뿯) --- -### 12-4. LSP 肄붾뱶 ?명뀛由ъ쟾???꾧뎄 ?뺤옣 +### 12-4. LSP ?꾨뗀諭??紐낅€쏁뵳?????袁㏓럡 ?類ㅼ삢 -`lsp_code_intel` ?꾧뎄瑜?6媛??≪뀡?먯꽌 9媛쒕줈 ?뺤옣?섏뿬 援ъ“??肄붾뱶 ?먯깋???€??媛뺥솕?덉뒿?덈떎. +`lsp_code_intel` ?袁㏓럡??6揶???る€?癒?퐣 9揶쏆뮆以??類ㅼ삢??뤿연 ?닌듼€???꾨뗀諭??癒?퉳??????揶쏅벤???됰뮸??덈뼄. -| ?≪뀡 | ?⑸룄 | ?좉퇋 | +| ??る€?| ??몃즲 | ?醫됲뇣 | |------|------|------| -| `goto_definition` | ?щ낵 ?뺤쓽 ?꾩튂 | | -| `find_references` | ?щ낵 ?ъ슜 ?꾩튂 | | -| `hover` | ?€??臾몄꽌 ?뺣낫 | ??| -| `goto_implementation` | ?명꽣?섏씠??異붿긽 援ы쁽 ?꾩튂 | ??| -| `symbols` | ?뚯씪 ???щ낵 紐⑸줉 | | -| `workspace_symbols` | ?뚰겕?ㅽ럹?댁뒪 ?꾩껜 ?щ낵 寃€??| ??| -| `prepare_call_hierarchy` | ?몄텧 怨꾩링 湲곗? ?щ낵 | ??| -| `incoming_calls` | ?곸쐞 ?몄텧??| ??| -| `outgoing_calls` | ?섏쐞 ?몄텧 ?€??| ??| +| `goto_definition` | ?????類ㅼ벥 ?袁⑺뒄 | | +| `find_references` | ?????????袁⑺뒄 | | +| `hover` | ?????얜챷苑??類k궖 | ??| +| `goto_implementation` | ?紐낃숲??륁뵠???곕뗄湲??닌뗭겱 ?袁⑺뒄 | ??| +| `symbols` | ???뵬 ??????筌뤴뫖以?| | +| `workspace_symbols` | ??곌쾿??쎈읂??곷뮞 ?袁⑷퍥 ????野꺜€??| ??| +| `prepare_call_hierarchy` | ?紐꾪뀱 ?④쑴留?疫꿸퀣? ????| ??| +| `incoming_calls` | ?怨몄맄 ?紐꾪뀱??| ??| +| `outgoing_calls` | ??륁맄 ?紐꾪뀱 ????| ??| -**二쇱슂 蹂€寃?** -- `line`/`character` ?낅젰: 1-based 湲곕? ???대??먯꽌 0-based ?먮룞 蹂€??(`NormalizePosition`) -- `query` ?뚮씪誘명꽣 異붽? (workspace_symbols?? -- 寃곌낵???뚯씪 ?? ?€???꾩튂, 泥?寃곌낵 ?붿빟 ?ы븿 -- LSP ?꾨줈?좎퐳: `textDocument/implementation`, `textDocument/hover`, `workspace/symbol`, `textDocument/prepareCallHierarchy`, `callHierarchy/incomingCalls`, `callHierarchy/outgoingCalls` +**雅뚯눘??癰궰€野?** +- `line`/`character` ??낆젾: 1-based 疫꿸퀡? ????€??癒?퐣 0-based ?癒?짗 癰궰€??(`NormalizePosition`) +- `query` ???뵬沃섎챸苑??곕떽? (workspace_symbols?? +- 野껉퀗??????뵬 ?? ?????袁⑺뒄, 筌?野껉퀗???遺용튋 ??釉? +- LSP ?袁⑥쨮?醫롰맫: `textDocument/implementation`, `textDocument/hover`, `workspace/symbol`, `textDocument/prepareCallHierarchy`, `callHierarchy/incomingCalls`, `callHierarchy/outgoingCalls` -**?뚯씪:** `LspTool.cs`, `LspClientService.cs` +**???뵬:** `LspTool.cs`, `LspClientService.cs` --- -### 12-5. IBM/Qwen ?꾧뎄 ?대젰 ?됲깂?? -IBM watsonx + Qwen 諛고룷?뺤뿉??`tool_calls`/`role=tool` ?대젰 寃€?ш? ?꾧꺽??臾몄젣瑜??닿껐?⑸땲?? +### 12-5. IBM/Qwen ?袁㏓럡 ??€????꿸퉪?? +IBM watsonx + Qwen 獄쏄퀬猷?類ㅻ퓠??`tool_calls`/`role=tool` ??€??野꺜€??? ?袁㏐봄???얜챷?g몴???욧퍙??몃빍?? -**蹂€寃???** +**癰궰€野???** ``` assistant { tool_calls: [...] } ?? tool { tool_call_id, content } ``` -**蹂€寃???(?됲깂 transcript):** +**癰궰€野???(??꿸퉪 transcript):** ``` -assistant: "?띿뒪??n\n{name,arguments}\n" +assistant: "??용뮞??n\n{name,arguments}\n" user: "[Tool Result: tool_name] (id=xxx)\ncontent" ``` -**?듭떖 硫붿꽌??** -- `BuildIbmAssistantTranscript()` ??tool_use 釉붾줉 ??`` ?쒓렇 吏곷젹??- `BuildIbmToolResultTranscript()` ??tool_result ??`[Tool Result]` ?ㅻ뜑 + ?댁슜 -- `TryExtractTextContent()` ??string/array/nested ?뺥깭 紐⑤몢 ?띿뒪??異붿텧 -- `TryParseContentArrayToolBlock()` ??content 諛곗뿴 ??tool_use/tool_call 釉붾줉 ?뚯떛 +**???뼎 筌롫뗄苑??** +- `BuildIbmAssistantTranscript()` ??tool_use ?됰뗀以???`` ??볥젃 筌욊낮???- `BuildIbmToolResultTranscript()` ??tool_result ??`[Tool Result]` ??삳쐭 + ??곸뒠 +- `TryExtractTextContent()` ??string/array/nested ?類κ묶 筌뤴뫀紐???용뮞???곕뗄?? +- `TryParseContentArrayToolBlock()` ??content 獄쏄퀣肉???tool_use/tool_call ?됰뗀以????뼓 -**?뚯씪:** `LlmService.ToolUse.cs` +**???뵬:** `LlmService.ToolUse.cs` --- -### 12-6. ?꾧뎄 ?몄텧 ?쒖꽌 ?뺣젹 諛??꾨\?꾪듃 ?꾪솕 +### 12-6. ?袁㏓럡 ?紐꾪뀱 ??뽮퐣 ?類l졊 獄??袁⑨세?袁る뱜 ?袁れ넅 -**?꾧뎄 ?쒖꽌 (`ToolRegistry.OrderToolsForExposure`):** +**?袁㏓럡 ??뽮퐣 (`ToolRegistry.OrderToolsForExposure`):** -| 踰꾪궥 | ?꾧뎄 | +| 甕곌쑵沅?| ?袁㏓럡 | |------|------| -| 0 (理쒖슦?? | file_read, file_edit, glob, grep, lsp_code_intel, build_run, document_plan, ?앹꽦 ?꾧뎄 ??| +| 0 (筌ㅼ뮇??? | file_read, file_edit, glob, grep, lsp_code_intel, build_run, document_plan, ??밴쉐 ?袁㏓럡 ??| | 1 | document_review, format_convert, tool_search, code_search | | 2 | mcp_*, spawn_agent, wait_agents | | 3 | task_* | -**?꾨\?꾪듃 ?꾪솕 (SystemPromptBuilder):** +**?袁⑨세?袁る뱜 ?袁れ넅 (SystemPromptBuilder):** - "Tools First, Always" ??"Tools First When Needed" -- `tool_search`: ?꾨낫?먯꽌 諛붾줈 ?좏깮 媛€?ν븯硫?吏곸젒 ?몄텧, 紐⑦샇???뚮쭔 ?ъ슜 -- `spawn_agent`: 蹂묐젹 議곗궗媛€ ?ㅼ젣濡??꾩??????뚮쭔 ?ъ슜 -- `document_review`: ??臾몄꽌/紐낆떆???붿껌 ?쒖뿉留?沅뚯옣 -- Code ?먯깋: ?뺤쓽/李몄“/援ы쁽/?몄텧愿€怨???`lsp_code_intel` ?곗꽑 +- `tool_search`: ?袁⑤궖?癒?퐣 獄쏅뗀以??醫뤾문 揶쎛€?館釉?쭖?筌욊낯???紐꾪뀱, 筌뤴뫂??????춸 ???? +- `spawn_agent`: 癰귣쵎??鈺곌퀣沅쀥첎? ??쇱젫嚥??袁????????춸 ???? +- `document_review`: ???얜챷苑?筌뤿굞????遺욧퍕 ??뽯퓠筌?亦낅슣?? +- Code ?癒?퉳: ?類ㅼ벥/筌〓챷???닌뗭겱/?紐꾪뀱?온€????`lsp_code_intel` ?怨쀪퐨 -**?뚯씪:** `ToolRegistry.cs`, `ChatWindow.SystemPromptBuilder.cs`, `AgentLoopService.cs`, `TaskTypePolicy.cs`, `AgentLoopExplorationPolicy.cs` +**???뵬:** `ToolRegistry.cs`, `ChatWindow.SystemPromptBuilder.cs`, `AgentLoopService.cs`, `TaskTypePolicy.cs`, `AgentLoopExplorationPolicy.cs` --- -## 13. ?붾젆?좊━蹂?媛€?대뱶 +## 13. ?遺얠젂?醫듼봺癰?揶쎛€??€諭? -| ?붾젆?좊━ | ?섏젙 ??二쇱쓽?ы빆 | +| ?遺얠젂?醫듼봺 | ??륁젟 ??雅뚯눘???鍮?| |---------|----------------| -| `Core/` | `FuzzyEngine` ?먯닔 怨듭떇 蹂€寃???寃€???덉쭏??吏곸젒 ?곹뼢 | -| `Handlers/` | ???몃뱾??異붽? ??`App.xaml.cs`???깅줉 ?꾩슂 | -| `Services/Agent/` | ???꾧뎄 異붽? ??`ToolRegistry`???깅줉 + ?ㅽ궗 ?뚯씪(`.skill.md`) ?묒꽦 + `ToolTabOverrides`????移댄뀒怨좊━ 吏€??| -| `Themes/` | 由ъ냼????蹂€寃???紐⑤뱺 ?뚮쭏???숈씪?섍쾶 ?곸슜 ?꾩슂 | -| `Models/AppSettings.cs` | ?띿꽦 異붽? ??`SettingsService` 留덉씠洹몃젅?댁뀡 怨좊젮 | -| `Views/ChatWindow.*` | partial class 遺꾪븷 ??愿€??湲곕뒫?€ ?대떦 ?뚯씪?먯꽌 ?섏젙 | +| `Core/` | `FuzzyEngine` ?癒?땾 ?⑤벊??癰궰€野???野꺜€????됱춳??筌욊낯???怨밸샨 | +| `Handlers/` | ???紐껊굶???곕떽? ??`App.xaml.cs`???源낆쨯 ?袁⑹뒄 | +| `Services/Agent/` | ???袁㏓럡 ?곕떽? ??`ToolRegistry`???源낆쨯 + ??쎄텢 ???뵬(`.skill.md`) ?臾믨쉐 + `ToolTabOverrides`????燁삳똾?믤€⑥쥓??筌왖€??| +| `Themes/` | ?귐딅꺖????癰궰€野???筌뤴뫀諭????춳????덉뵬??띿쓺 ?怨몄뒠 ?袁⑹뒄 | +| `Models/AppSettings.cs` | ??욧쉐 ?곕떽? ??`SettingsService` 筌띾뜆?졿뉩紐껋쟿??곷€??⑥쥓??| +| `Views/ChatWindow.*` | partial class ?브쑵釉????온€??疫꿸퀡??? ??€?????뵬?癒?퐣 ??륁젟 | --- -### 12-7. PPT 怨좏뭹吏??쒗뵆由??쒖뒪?? -`template` ?뚮씪誘명꽣濡?8媛?怨좏뭹吏??묒떇???됱긽/?덉씠?꾩썐???ъ슜?????덉뒿?덈떎. +### 12-7. PPT ?⑥쥚萸뱄쭪???쀫탣????뽯뮞?? +`template` ???뵬沃섎챸苑f에?8揶??⑥쥚萸뱄쭪??臾믩뻼????깃맒/??됱뵠?袁⑹뜍???????????됰뮸??덈뼄. -**?꾩옱 援ы쁽 (諛⑸쾿 1 ???댁옣 硫뷀??곗씠??:** -- 媛??쒗뵆由우쓽 ?뚮쭏 ?됱긽??`FullThemes` ?뺤뀛?덈━???섎뱶肄붾뵫 (0KB 異붽?) -- ?먮낯 .pptx ?놁씠???숈씪 ?됱긽+?덉씠?꾩썐?쇰줈 PPT ?앹꽦 媛€??- ?먮낯 .pptx媛€ `Assets/ppt/` ?먮뒗 `%APPDATA%/AXCopilot/templates/ppt/`???덉쑝硫?留덉뒪??蹂듭젣(怨좏뭹吏? ?먮룞 ?낃렇?덉씠?? -| ?쒗뵆由??대쫫 | ?먮낯 ?뚯씪 | ?됱긽 ?뱀쭠 | +**?袁⑹삺 ?닌뗭겱 (獄쎻뫖苡?1 ????곸삢 筌롫???怨쀬뵠??:** +- 揶???쀫탣?깆슦?????춳 ??깃맒??`FullThemes` ?類ㅻ€??댿봺????롫굡?꾨뗀逾?(0KB ?곕떽?) +- ?癒?궚 .pptx ??곸뵠????덉뵬 ??깃맒+??됱뵠?袁⑹뜍??곗쨮 PPT ??밴쉐 揶쎛€??- ?癒?궚 .pptx揶쎛€ `Assets/ppt/` ?癒?뮉 `%APPDATA%/AXCopilot/templates/ppt/`????됱몵筌?筌띾뜆???癰귣벊???⑥쥚萸뱄쭪? ?癒?짗 ??껊젃??됱뵠?? +| ??쀫탣????€已?| ?癒?궚 ???뵬 | ??깃맒 ?諭€彛?| |------------|----------|----------| -| `basic100` | BASIC100 湲곗? ?쒗뵆由?V1.pptx (67MB) | 紐⑤뜕 釉붾( (#2572EF) | -| `core100` | CORE100 湲곗??쒗뵆由?V1.pptx (141MB) | ??釉붾( (#266DF1) | -| `frame_blue` | ?꾨젅?꾨뵒?먯씤 釉붾( (19MB) | ?꾨젅??釉붾( (#126BF6) + 移대뱶 | -| `mr_ppt_01` | 誘몄뒪???쇳뵾??01 (18MB) | ?ㅽ겕 ?ㅼ씠鍮?+ 釉붾( (#0049F0) | -| `mr_ppt_02` | 誘몄뒪???쇳뵾??02 (24MB) | 釉붾( + 洹몃젅??移대뱶 (#2269F7) | -| `mr_ppt_03` | 誘몄뒪???쇳뵾??03 (5.5MB) | ?ㅼ씠鍮?+ 怨⑤뱶 (#F4BB05) | -| `mr_ppt_04` | 誘몄뒪???쇳뵾??04 (8.8MB) | ???몃뵒怨?+ ?ㅼ뭅?대툝猷?(#0583F2) | -| `mr_ppt_05` | 誘몄뒪???쇳뵾??05 (16MB) | 紐⑤뜕 釉붾옓 + 釉붾( (#007AF9) | +| `basic100` | BASIC100 疫꿸퀣? ??쀫탣??V1.pptx (67MB) | 筌뤴뫀???됰뗀竊?(#2572EF) | +| `core100` | CORE100 疫꿸퀣???쀫탣??V1.pptx (141MB) | ???됰뗀竊?(#266DF1) | +| `frame_blue` | ?袁⑥쟿?袁⑤탵?癒?뵥 ?됰뗀竊?(19MB) | ?袁⑥쟿???됰뗀竊?(#126BF6) + 燁삳?諭?| +| `mr_ppt_01` | 沃섎챷?????노돗??01 (18MB) | ??쎄쾿 ??쇱뵠??+ ?됰뗀竊?(#0049F0) | +| `mr_ppt_02` | 沃섎챷?????노돗??02 (24MB) | ?됰뗀竊?+ 域밸챶???燁삳?諭?(#2269F7) | +| `mr_ppt_03` | 沃섎챷?????노돗??03 (5.5MB) | ??쇱뵠??+ ?ⓥ뫀諭?(#F4BB05) | +| `mr_ppt_04` | 沃섎챷?????노돗??04 (8.8MB) | ???紐껊탵??+ ??쇰춦??€?앯뙴?(#0583F2) | +| `mr_ppt_05` | 沃섎챷?????노돗??05 (16MB) | 筌뤴뫀???됰뗀??+ ?됰뗀竊?(#007AF9) | -**?ν썑 援ы쁽 ?듭뀡:** +**?館???닌뗭겱 ???€?** -#### 諛⑸쾿 2 ???먮룞 ?ㅼ슫濡쒕뱶 (沅뚯옣) +#### 獄쎻뫖苡?2 ???癒?짗 ??쇱뒲嚥≪뮆諭?(亦낅슣?? ``` -泥??ъ슜 ???щ궡 NAS/?쒕쾭?먯꽌 ?쒗뵆由??먮룞 ?ㅼ슫濡쒕뱶 ??%APPDATA%/AXCopilot/templates/ppt/ 罹먯떆 +筌?????????沅?NAS/??뺤쒔?癒?퐣 ??쀫탣???癒?짗 ??쇱뒲嚥≪뮆諭???%APPDATA%/AXCopilot/templates/ppt/ 筌?Ŋ?? -援ы쁽 ?ъ씤?? -- AppSettings??TemplateServerUrl ?ㅼ젙 異붽? (?? https://nas.internal/ax-templates/) -- ResolveTemplatePath?먯꽌 ?뚯씪 誘몃컻寃????ㅼ슫濡쒕뱶 ?몃━嫄?- ?ㅼ슫濡쒕뱶 吏꾪뻾瑜?UI (ChatWindow ?먮뒗 ?ㅼ젙 ?붾㈃) -- ?ㅽ봽?쇱씤 ?대갚: ?댁옣 硫뷀??곗씠??諛⑸쾿 1)濡??먮룞 ?꾪솚 -- 踰꾩쟾 愿€由? ?쒕쾭??manifest.json ??濡쒖뺄 罹먯떆 踰꾩쟾怨?鍮꾧탳 +?닌뗭겱 ????? +- AppSettings??TemplateServerUrl ??쇱젟 ?곕떽? (?? https://nas.internal/ax-templates/) +- ResolveTemplatePath?癒?퐣 ???뵬 沃섎챶而삣칰?????쇱뒲嚥≪뮆諭??紐꺿봺椰?- ??쇱뒲嚥≪뮆諭?筌욊쑵六양몴?UI (ChatWindow ?癒?뮉 ??쇱젟 ?遺얇늺) +- ??쎈늄??깆뵥 ??€媛? ??곸삢 筌롫???怨쀬뵠??獄쎻뫖苡?1)嚥??癒?짗 ?袁れ넎 +- 甕곌쑴???온€?? ??뺤쒔??manifest.json ??嚥≪뮇類?筌?Ŋ??甕곌쑴?얏€???쑨?? -?덉긽 ?묒뾽?? 以?(?ㅼ슫濡쒕뱶 ?쒕퉬??+ UI + ?ㅼ젙) -?뚯씪: PptxSkill.cs, AppSettings.cs, SettingsService.cs +??됯맒 ?臾믩씜?? 餓?(??쇱뒲嚥≪뮆諭???뺥돩??+ UI + ??쇱젟) +???뵬: PptxSkill.cs, AppSettings.cs, SettingsService.cs ``` -#### 諛⑸쾿 3 ??鍮뚮뱶???ы븿 +#### 獄쎻뫖苡?3 ????슢諭????釉? ``` -csproj??Content濡??깅줉?섏뿬 諛고룷 ?⑦궎吏€???ы븿 +csproj??Content嚥??源낆쨯??뤿연 獄쏄퀬猷????텕筌왖€????釉? -援ы쁽: -1. AxCopilot.csproj???꾨옒 異붽?: +?닌뗭겱: +1. AxCopilot.csproj???袁⑥삋 ?곕떽?: PreserveNewest -2. ?ㅼ튂?뚯씪 ?⑸웾 ?곹뼢: +~200MB (?뺤텞 ?? - - ?꾩옱 ?ㅼ튂?뚯씪 ~107MB ??~307MB ?덉긽 +2. ??쇳뒄???뵬 ??몄쎗 ?怨밸샨: +~200MB (?類ㅽ뀧 ?? + - ?袁⑹삺 ??쇳뒄???뵬 ~107MB ??~307MB ??됯맒 -3. ?좏깮???ы븿 (?⑸웾 ?덉땐): - - 寃쎈웾 ?쒗뵆由용쭔 ?ы븿 (mr_ppt_03: 5.5MB, mr_ppt_04: 8.8MB ?? - - ?€???쒗뵆由?(core100: 141MB)?€ 諛⑸쾿 2濡??ㅼ슫濡쒕뱶 +3. ?醫뤾문????釉?(??몄쎗 ??됰븧): + - 野껋럥????쀫탣?깆슜彛???釉?(mr_ppt_03: 5.5MB, mr_ppt_04: 8.8MB ?? + - ??????쀫탣??(core100: 141MB)?? 獄쎻뫖苡?2嚥???쇱뒲嚥≪뮆諭? - + PreserveNewest -二쇱쓽: build.bat??payload.zip ?뺤텞 ?④퀎?먯꽌 ?먮룞 ?ы븿??``` +雅뚯눘?? build.bat??payload.zip ?類ㅽ뀧 ??m€?癒?퐣 ?癒?짗 ??釉??``` --- -## 14. 吏€?ν삎 ?먯씠?꾪듃 怨좊룄??(oh-my-openagent 李몄“) +## 14. 筌왖€?館???癒?뵠?袁る뱜 ?⑥쥓猷??(oh-my-openagent 筌〓챷?? -> ?곸꽭 怨꾪쉷: `docs/AGENT_ROADMAP.md` 8??李몄“ +> ?怨멸쉭 ?④쑵?? `docs/AGENT_ROADMAP.md` 8??筌〓챷?? -### 利됱떆 媛쒕컻 (P1~P5) +### 筌앸맩??揶쏆뮆而?(P1~P5) -| ?쒖쐞 | 湲곕뒫 | ?듭떖 ?뚯씪 | ?ㅻ챸 | +| ??뽰맄 | 疫꿸퀡??| ???뼎 ???뵬 | ??살구 | |------|------|----------|------| -| P1 | **IntentGate** (?섎룄 遺꾨쪟湲? | `IntentGateService.cs`(?좉퇋) | ?ъ슜???낅젰 ???묒뾽 ?좏삎 ?먮룞 遺꾨쪟 ??理쒖쟻 ?ㅽ뻾 ?꾨줈?뚯씪(temperature/tool 沅뚰븳/諛섎났 ?곹븳) ?먮룞 ?곸슜. 湲곗〈 `ClassifyTaskType` + `IntentDetector` ?듯빀 ?뺤옣 | -| P2 | **移댄뀒怨좊━ ?쒕툕?먯씠?꾪듃 ?꾨줈?뚯씪** | `SubAgentProfile.cs`(?좉퇋), `SubAgentTool.cs` | ?⑥씪 紐⑤뜽 + ?ㅻⅨ system prompt/tool 沅뚰븳/temperature 議고빀?쇰줈 媛€??硫€?곗뿉?댁쟾?? researcher/coder/writer/reviewer/planner 5媛??꾨줈?뚯씪 | -| P3 | **?꾩쟻 ?숈뒿** | `SessionLearningCollector.cs`(?좉퇋) | ?몄뀡 ??諛쒓껄?ы빆(鍮뚮뱶 ?먮윭, ?뚯씪 援ъ“, ?⑦꽩)???먮룞 ?섏쭛?섏뿬 ?꾩냽 諛섎났??而⑦뀓?ㅽ듃濡?二쇱엯. 諛섎났 ?ㅼ닔 諛⑹? | -| P4 | **?뚰겕?ㅽ럹?댁뒪 而⑦뀓?ㅽ듃 ?먮룞 ?앹꽦** | `WorkspaceContextGenerator.cs`(?좉퇋) | ?묒뾽 ?대뜑 援ъ“/湲곗닠?ㅽ깮??`.ax-context.md`濡??먮룞 ?앹꽦. ?쒕툕?먯씠?꾪듃 而⑦뀓?ㅽ듃 ?⑥쑉??| -| P5 | **蹂묐젹 ?쒕툕?먯씠?꾪듃 ?뺤옣** | `SpawnAgentsTool.cs`(?좉퇋) | ?щ윭 ?쒕툕?먯씠?꾪듃瑜???踰덉뿉 ?앹꽦/?ㅽ뻾. IntentGate ?곕룞?쇰줈 蹂듯빀 ?붿껌 ?먮룞 遺꾪빐 | +| P1 | **IntentGate** (??롫즲 ?브쑬履잍묾? | `IntentGateService.cs`(?醫됲뇣) | ???????낆젾 ???臾믩씜 ?醫륁굨 ?癒?짗 ?브쑬履???筌ㅼ뮇????쎈뻬 ?袁⑥쨮???뵬(temperature/tool 亦낅슦釉?獄쏆꼶???怨밸립) ?癒?짗 ?怨몄뒠. 疫꿸퀣??`ClassifyTaskType` + `IntentDetector` ???? ?類ㅼ삢 | +| P2 | **燁삳똾?믤€⑥쥓????뺥닏?癒?뵠?袁る뱜 ?袁⑥쨮???뵬** | `SubAgentProfile.cs`(?醫됲뇣), `SubAgentTool.cs` | ??μ뵬 筌뤴뫀??+ ??삘뀲 system prompt/tool 亦낅슦釉?temperature 鈺곌퀬鍮€??곗쨮 揶쎛€??筌렺€?怨쀫퓠??곸읈?? researcher/coder/writer/reviewer/planner 5揶??袁⑥쨮???뵬 | +| P3 | **?袁⑹읅 ??덈뮸** | `SessionLearningCollector.cs`(?醫됲뇣) | ?紐꾨€???獄쏆뮄猿??鍮???슢諭??癒?쑎, ???뵬 ?닌듼€? ???쉘)???癒?짗 ??륁춿??뤿연 ?袁⑸꺗 獄쏆꼶????뚢뫂???쎈뱜嚥?雅뚯눘?? 獄쏆꼶????쇰땾 獄쎻뫗? | +| P4 | **??곌쾿??쎈읂??곷뮞 ?뚢뫂???쎈뱜 ?癒?짗 ??밴쉐** | `WorkspaceContextGenerator.cs`(?醫됲뇣) | ?臾믩씜 ??€???닌듼€?疫꿸퀣???쎄문??`.ax-context.md`嚥??癒?짗 ??밴쉐. ??뺥닏?癒?뵠?袁る뱜 ?뚢뫂???쎈뱜 ??μ몛??| +| P5 | **癰귣쵎????뺥닏?癒?뵠?袁る뱜 ?類ㅼ삢** | `SpawnAgentsTool.cs`(?醫됲뇣) | ??????뺥닏?癒?뵠?袁る뱜????甕곕뜆肉???밴쉐/??쎈뻬. IntentGate ?怨뺣짗??곗쨮 癰귣벏鍮€ ?遺욧퍕 ?癒?짗 ?브쑵鍮?| -### 異뷀썑 媛쒕컻 (P6~P7) +### ?곕???揶쏆뮆而?(P6~P7) -| ?쒖쐞 | 湲곕뒫 | ?좏뻾 議곌굔 | ?ㅻ챸 | +| ??뽰맄 | 疫꿸퀡??| ?醫뤿뻬 鈺곌퀗援?| ??살구 | |------|------|----------|------| -| P6 | **?대갚 泥댁씤** | P1 + P2 | ?ㅽ뻾 ?ㅽ뙣 ???ㅻⅨ ?꾨줈?뚯씪/?꾨왂?쇰줈 ?먮룞 ?ъ떆??(理쒕? 2?? | -| P7 | **紐⑤뜽 ?깃꺽 留ㅼ묶** | P1 + 硫€?곕え??| ?묒뾽 ?좏삎蹂?理쒖쟻 紐⑤뜽 ?먮룞 ?좏깮 (RegisteredModel.strengths 留ㅼ묶) | +| P6 | **??€媛?筌k똻??* | P1 + P2 | ??쎈뻬 ??쎈솭 ????삘뀲 ?袁⑥쨮???뵬/?袁⑥셽??곗쨮 ?癒?짗 ?????(筌ㅼ뮆? 2?? | +| P7 | **筌뤴뫀???源껉봄 筌띲끉臾?* | P1 + 筌렺€?怨뺛걟??| ?臾믩씜 ?醫륁굨癰?筌ㅼ뮇??筌뤴뫀???癒?짗 ?醫뤾문 (RegisteredModel.strengths 筌띲끉臾? | -### 援ы쁽 ?섏〈 愿€怨? +### ?닌뗭겱 ??뤵€??온€?? ``` -P1 (IntentGate) ?€?€?€?€?€?р??€??P2 (移댄뀒怨좊━ ?꾨줈?뚯씪) ?€?€??P5 (蹂묐젹 ?뺤옣) - ?쒋??€??P3 (?꾩쟻 ?숈뒿) [?낅┰] - ?붴??€??P4 (?뚰겕?ㅽ럹?댁뒪 而⑦뀓?ㅽ듃) [?낅┰] -P1 + P2 ?꾨즺 ???€?€??P6 (?대갚 泥댁씤) -P1 + 硫€?곕え?????€?€??P7 (紐⑤뜽 ?깃꺽 留ㅼ묶) +P1 (IntentGate) ?????????????????P2 (燁삳똾?믤€⑥쥓???袁⑥쨮???뵬) ??????P5 (癰귣쵎???類ㅼ삢) + ???????P3 (?袁⑹읅 ??덈뮸) [??끸뵲] + ?遺?????P4 (??곌쾿??쎈읂??곷뮞 ?뚢뫂???쎈뱜) [??끸뵲] +P1 + P2 ?袁⑥┷ ????????P6 (??€媛?筌k똻?? +P1 + 筌렺€?怨뺛걟??????????P7 (筌뤴뫀???源껉봄 筌띲끉臾? ``` --- -## 15. 蹂듭썝 泥댄겕?ъ씤?? -UI ?붿옄???€洹쒕え 由ы뙥?좊쭅 ???꾪뿕 ?묒뾽 ??湲곕줉???덉쟾 蹂듭썝 吏€?먯엯?덈떎. +## 15. 癰귣벊??筌k똾寃????? +UI ?遺우쁽????域뱀뮆???귐뗫솯?醫딆춦 ???袁る퓮 ?臾믩씜 ??疫꿸퀡以????됱읈 癰귣벊??筌왖€?癒?뿯??덈뼄. -| ?좎쭨 | 而ㅻ컠 ?댁떆 | ?ㅻ챸 | 蹂듭썝 紐낅졊 | +| ?醫롮? | ?뚣끇而???곷뻻 | ??살구 | 癰귣벊??筌뤿굝議?| |------|-----------|------|-----------| -| 2026-04-13 | `4d1d160` | UI ?붿옄??媛쒖꽑 吏곸쟾 ???뚮쭏 援먯젙, IBM 吏꾨떒 濡쒓퉭, 酉곗뼱 紐낆묶 蹂€寃??꾨즺 (704 tests pass) | `git checkout 4d1d160 -- src/AxCopilot/` | +| 2026-04-13 | `4d1d160` | UI ?遺우쁽??揶쏆뮇苑?筌욊낯???????춳 ?대Ŋ?? IBM 筌욊쑬??嚥≪뮄?? ?됯퀣堉?筌뤿굞臾?癰궰€野??袁⑥┷ (704 tests pass) | `git checkout 4d1d160 -- src/AxCopilot/` | -> **?꾩껜 濡ㅻ갚**: `git revert <而ㅻ컠>` ?먮뒗 `git reset --hard 4d1d160` (二쇱쓽: ?댄썑 ?묒뾽 紐⑤몢 ?뚯떎) -> **遺€遺?蹂듭썝**: `git checkout 4d1d160 -- ` 濡??뱀젙 ?뚯씪留??섎룎由ш린 +> **?袁⑷퍥 嚥▲끇媛?*: `git revert **?봔€??癰귣벊??*: `git checkout 4d1d160 -- ?낅뜲?댄듃: 2026-04-14 18:08 (KST) -> - ?ㅽ궗 ?쒖뒪??Phase 2 1~6踰덉쓣 諛섏쁺?덉뒿?덈떎. `SkillService`???꾨줈?앺듃 `.claude/skills` ?ш? 濡쒕뱶, namespaced `SKILL.md`, 踰덈뱾 ?ㅽ궗 二쇱엯, `$ARGUMENTS`/named args/?ㅽ궗 ?대뜑 蹂€??移섑솚, inline shell block ?ㅽ뻾源뚯? 吏€?먰븯?꾨줉 ?뺤옣?덉뒿?덈떎. -> - `ChatWindow` ?고???寃쎈줈???④퍡 ?뺣━?덉뒿?덈떎. ?щ옒???몄텧?€ `BuildSlashInvocationAsync`瑜??듯빐 而댄뙆?쇰맂 ?ㅽ궗 ?꾨\?꾪듃瑜??ъ슜?섍퀬, ?쇰컲 ?€?붾뒗 `when_to_use`/`paths`/`user-invocable` 硫뷀??곗씠?곕? 諛뷀깢?쇰줈 ?좏깮???먮룞 ?ㅽ궗 媛€?대뱶瑜?蹂댁“ ?쒖뒪???꾨\?꾪듃濡?遺숈엯?덈떎. -> - ?ㅼ젙/UI ?곌껐?????ㅽ궗 紐⑤뜽 湲곗??쇰줈 留욎톬?듬땲?? Agent ?ㅼ젙, ?쇰컲 ?ㅼ젙, ?ㅻ쾭?덉씠, ?ㅽ궗 愿€由ъ옄 ?꾧뎄??踰덈뱾/?꾨줈?앺듃/?ъ슜???ㅽ궗 遺꾨쪟?€ ?꾨줈?앺듃 `.claude/skills` 寃쎈줈瑜?諛섏쁺???ㅻ챸怨?由ъ뒪?몃? 援ъ꽦?⑸땲?? -> - ?꾧뎄 ?몄텧 ?④퀎??`AgentLoopService.GetRuntimeActiveTools()`?먯꽌 blanket deny 沅뚰븳??癒쇱? ?곸슜?섎룄濡?蹂닿컯?덉뒿?덈떎. ?⑦꽩 湲곕컲 洹쒖튃?€ call-time 寃€?щ? ?좎??섍퀬, ?⑥닚 deny ?꾧뎄??紐⑤뜽 ?몄텧 ???꾪꽣留곸쑝濡??뺣━?덉뒿?덈떎. -> - 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_phase2\\ -p:IntermediateOutputPath=obj\\verify_phase2\\` 寃쎄퀬 0 / ?ㅻ쪟 0 -> - 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentToolCatalogTests|SkillServiceRuntimePolicyTests" -p:OutputPath=bin\\verify_phase2_tests\\ -p:IntermediateOutputPath=obj\\verify_phase2_tests\\` ?듦낵 16 -> - 李멸퀬: ?뚯뒪???꾨줈?앺듃??湲곗〈 nullable 寃쎄퀬 `src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs(76)` 1嫄댁? ?좎??⑸땲?? -> ?낅뜲?댄듃: 2026-04-14 18:22 (KST) -> - ?ㅽ궗 ?뚯뒪 ?뺤옣 Phase 3??諛섏쁺?덉뒿?덈떎. `SkillService`???곸쐞 ?붾젆?곕━源뚯? ?ы븿???꾨줈?앺듃 `.claude/skills` ?먯깋, ?뚮윭洹몄씤 ?ㅽ궗 ?대뜑 ?먯깋, 異붽? 怨듭슜 ?대뜑 紐⑸줉, `.claude/commands` markdown command瑜?legacy skill濡?蹂€?섑븯??寃쎈줈瑜??④퍡 吏€?먰빀?덈떎. -> - ?뚯씪???ㅽ궗?€ body瑜?利됱떆 硫붾え由ъ뿉 ?щ━吏€ ?딄퀬 ?꾩슂 ?쒖젏?먮쭔 ?쎈뒗 lazy prompt body 罹먯떆瑜?異붽??덉뒿?덈떎. `SkillManagerTool`, `SkillEditorWindow`, `SkillGalleryWindow`????寃쎈줈瑜??듯빐 ?ㅼ젣 蹂몃Ц???쒖떆?⑸땲?? -> - ?몄옄 紐⑤뜽???뺤옣?덉뒿?덈떎. `arguments`?€ `argument-hint`瑜??④퍡 ?댁꽍??named placeholder 移섑솚??媛뺥솕?덇퀬, ?몄옄媛€ 遺€議깊븯硫?usage 媛€?대뱶瑜??꾨\?꾪듃 ?욎뿉 遺숈뿬 ?ㅽ뻾 ?덉쭏??蹂댁셿?⑸땲?? -> - ?꾧뎄 deny ?꾪꽣??`AgentToolCatalog` 怨듯넻 硫붿꽌?쒕줈 ?대룞???고??꾧낵 ?ㅼ젙 UI媛€ 媛숈? blanket deny 洹쒖튃??怨듭쑀?섎룄濡??뺣━?덉뒿?덈떎. -> - ?ㅼ젙 ?€?μ뿉??`additionalSkillFolders`瑜?異붽??덇퀬, ?쇰컲 ?ㅼ젙/AX Agent ?ㅼ젙 UI??以??⑥쐞 ?낅젰 ?꾨뱶瑜??l뼱 ?щ윭 怨듭슜 ?ㅽ궗 ?대뜑瑜??곌껐?????덇쾶 ?덉뒿?덈떎. -> - 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_phase3\\ -p:IntermediateOutputPath=obj\\verify_phase3\\` 寃쎄퀬 0 / ?ㅻ쪟 0 -> - 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentToolCatalogTests|SkillServiceRuntimePolicyTests" -p:OutputPath=bin\\verify_phase3_tests\\ -p:IntermediateOutputPath=obj\\verify_phase3_tests\\` ?듦낵 18 -> - 李멸퀬: ?뚯뒪???꾨줈?앺듃??湲곗〈 nullable 寃쎄퀬 `src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs(76)` 1嫄댁? ?좎??⑸땲?? -> ?낅뜲?댄듃: 2026-04-14 18:33 (KST) -> - ?ㅽ궗 ?뺤콉 ?쒖뼱瑜?異붽??덉뒿?덈떎. `LlmSettings`??`enableProjectSkillDiscovery`, `enablePluginSkillDiscovery`, `enableLegacyCommandSkills`, `enableSkillInlineShell`, `skillInlineShellTimeoutSeconds`, `skillInlineShellMaxOutputChars`瑜?異붽??섍퀬 ?쇰컲 ?ㅼ젙/AX Agent ?ㅼ젙 UI???곌껐?덉뒿?덈떎. -> - ?ㅽ궗 濡쒕뱶 ?쒓렇?덉쿂???댁젣 ?뚯뒪 ?붾젆?곕━ 紐⑸줉肉??꾨땲???ㅼ젣 ?ㅽ궗 ?뚯씪 ?섏? 理쒓렐 ?섏젙 ?쒓컖???④퍡 諛섏쁺?⑸땲?? 媛숈? ?대뜑 援ъ꽦?대씪???뚯씪 ?댁슜??諛붾€뚮㈃ ?ㅼ쓬 濡쒕뱶 ?붿껌?먯꽌 ?ы깘?됰맗?덈떎. -> - inline shell ?ㅽ뻾湲곕뒗 ?ㅼ젙 湲곕컲 鍮꾪솢?깊솕, timeout, 異쒕젰 湲몄씠 ?쒗븳???곸슜?섎룄濡?蹂닿컯?덉뒿?덈떎. 鍮꾪솢???곹깭???쒓컙 珥덇낵???꾨\?꾪듃 ?덉뿉???앸퀎 媛€?ν븳 ?덈궡 臾몄옄?대줈 諛섑솚?⑸땲?? -> - `SkillEditorWindow`?€ `SkillGalleryWindow`??lazy prompt body 寃쎈줈瑜??ъ슜?섎룄濡?留욎톬怨? ?ㅼ젙 蹂€寃???`ReloadFromCurrentSettings()`瑜??듯빐 ?꾩옱 ?ㅽ궗 ?뚯뒪瑜??ㅼ떆 ?쎈룄濡??뺣━?덉뒿?덈떎. -> - 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_phase4b\\ -p:IntermediateOutputPath=obj\\verify_phase4b\\` 寃쎄퀬 0 / ?ㅻ쪟 0 -> - 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentToolCatalogTests|SkillServiceRuntimePolicyTests" -p:OutputPath=bin\\verify_phase4b_tests\\ -p:IntermediateOutputPath=obj\\verify_phase4b_tests\\` ?듦낵 18 -> - 李멸퀬: ?뚯뒪???꾨줈?앺듃??湲곗〈 nullable 寃쎄퀬 `src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs(76)` 1嫄댁? ?좎??⑸땲?? +| `docs/AGENT_ROADMAP.md` | ?癒?뵠?袁る뱜 疫꿸퀡??嚥≪뮆諭띰쭕?(筌왖€?館???⑥쥓猷??P1~P7 ?怨멸쉭 ??釉? | +| `docs/LAUNCHER_ROADMAP.md` | ?怨쀬퓗 疫꿸퀡??嚥≪뮆諭띰쭕?| +| `docs/AX_AGENT_QUALITY_PLAN.md` | AX Agent ?덉쭏 寃뚯씠??怨꾪쉷 | +| `docs/TOOL_COVERAGE_REPORT.md` | ?袁㏓럡 ?紐낆넎???귐뗫7??| +| `docs/AX_AGENT_UI_CHECKLIST.md` | ?癒?뵠?袁る뱜 UI 筌k똾寃뺟뵳????| +| `docs/UI_UX_CHECKLIST.md` | UI/UX 筌k똾寃뺟뵳????| +> ??낅쑓??꾨뱜: 2026-04-14 18:08 (KST) +> - ??쎄텢 ??뽯뮞??Phase 2 1~6甕곕뜆??獄쏆꼷???됰뮸??덈뼄. `SkillService`???袁⑥쨮??븍뱜 `.claude/skills` ??? 嚥≪뮆諭? namespaced `SKILL.md`, 甕곕뜄諭???쎄텢 雅뚯눘?? `$ARGUMENTS`/named args/??쎄텢 ??€??癰궰€??燁살꼹?? inline shell block ??쎈뻬繹먮슣? 筌왖€?癒곕릭?袁⑥쨯 ?類ㅼ삢??됰뮸??덈뼄. +> - `ChatWindow` ?怨???野껋럥以????m뜞 ?類b봺??됰뮸??덈뼄. ??????紐꾪뀱?? `BuildSlashInvocationAsync`?????퉸 ?뚮똾???곕쭆 ??쎄텢 ?袁⑨세?袁る뱜???????랁€? ??곗뺘 ???遺얜뮉 `when_to_use`/`paths`/`user-invocable` 筌롫???怨쀬뵠?怨? 獄쏅?源??곗쨮 ?醫뤾문???癒?짗 ??쎄텢 揶쎛€??€諭띄몴?癰귣똻????뽯뮞???袁⑨세?袁る뱜嚥??븐늿???덈뼄. +> - ??쇱젟/UI ?怨뚭퍙??????쎄텢 筌뤴뫀??疫꿸퀣???곗쨮 筌띿쉸???щ빍?? Agent ??쇱젟, ??곗뺘 ??쇱젟, ??살쒔??됱뵠, ??쎄텢 ?온€?귐딆쁽 ?袁㏓럡??甕곕뜄諭??袁⑥쨮??븍뱜/???????쎄텢 ?브쑬履?? ?袁⑥쨮??븍뱜 `.claude/skills` 野껋럥以덄몴?獄쏆꼷?????살구???귐딅뮞?紐? ?닌딄쉐??몃빍?? +> - ?袁㏓럡 ?紐꾪뀱 ??m€??`AgentLoopService.GetRuntimeActiveTools()`?癒?퐣 blanket deny 亦낅슦釉???믪눘? ?怨몄뒠??롫즲嚥?癰귣떯而??됰뮸??덈뼄. ???쉘 疫꿸퀡而?域뱀뮇??? call-time 野꺜€??? ?醫???랁€? ??λ떄 deny ?袁㏓럡??筌뤴뫀???紐꾪뀱 ???袁り숲筌띻낯?앮에??類b봺??됰뮸??덈뼄. +> - 野꺜€筌? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_phase2\\ -p:IntermediateOutputPath=obj\\verify_phase2\\` 野껋럡??0 / ??살첒 0 +> - 野꺜€筌? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentToolCatalogTests|SkillServiceRuntimePolicyTests" -p:OutputPath=bin\\verify_phase2_tests\\ -p:IntermediateOutputPath=obj\\verify_phase2_tests\\` ???궢 16 +> - 筌〓㈇?? ???뮞???袁⑥쨮??븍뱜??疫꿸퀣??nullable 野껋럡??`src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs(76)` 1椰꾨똻? ?醫???몃빍?? +> ??낅쑓??꾨뱜: 2026-04-14 18:22 (KST) +> - ??쎄텢 ???뮞 ?類ㅼ삢 Phase 3??獄쏆꼷???됰뮸??덈뼄. `SkillService`???怨몄맄 ?遺얠젂?怨뺚봺繹먮슣? ??釉???袁⑥쨮??븍뱜 `.claude/skills` ?癒?퉳, ???쑎域밸챷????쎄텢 ??€???癒?퉳, ?곕떽? ?⑤벊????€??筌뤴뫖以? `.claude/commands` markdown command??legacy skill嚥?癰궰€??묐릭??野껋럥以덄몴???m뜞 筌왖€?癒곕???덈뼄. +> - ???뵬????쎄텢?? body??筌앸맩??筌롫뗀?덄뵳?肉????곻쭪? ??꾪€??袁⑹뒄 ??뽰젎?癒?춸 ??덈뮉 lazy prompt body 筌?Ŋ?녺몴??곕떽???됰뮸??덈뼄. `SkillManagerTool`, `SkillEditorWindow`, `SkillGalleryWindow`????野껋럥以덄몴????퉸 ??쇱젫 癰귣챶揆????뽯뻻??몃빍?? +> - ?紐꾩쁽 筌뤴뫀????類ㅼ삢??됰뮸??덈뼄. `arguments`?? `argument-hint`????m뜞 ??곴퐤??named placeholder 燁살꼹???揶쏅벤???뉙€? ?紐꾩쁽揶쎛€ ?봔€鈺곌퉲釉?쭖?usage 揶쎛€??€諭띄몴??袁⑨세?袁る뱜 ??롫퓠 ?븐늿肉???쎈뻬 ??됱춳??癰귣똻???몃빍?? +> - ?袁㏓럡 deny ?袁り숲??`AgentToolCatalog` ?⑤벏??筌롫뗄苑??뺤쨮 ??€猷???怨??袁㏓궢 ??쇱젟 UI揶쎛€ 揶쏆늿? blanket deny 域뱀뮇????⑤벊?€??롫즲嚥??類b봺??됰뮸??덈뼄. +> - ??쇱젟 ???關肉??`additionalSkillFolders`???곕떽???뉙€? ??곗뺘 ??쇱젟/AX Agent ??쇱젟 UI??餓???μ맄 ??낆젾 ?袁⑤굡???節뚮선 ?????⑤벊????쎄텢 ??€?묊몴??怨뚭퍙??????뉗쓺 ??됰뮸??덈뼄. +> - 野꺜€筌? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_phase3\\ -p:IntermediateOutputPath=obj\\verify_phase3\\` 野껋럡??0 / ??살첒 0 +> - 野꺜€筌? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentToolCatalogTests|SkillServiceRuntimePolicyTests" -p:OutputPath=bin\\verify_phase3_tests\\ -p:IntermediateOutputPath=obj\\verify_phase3_tests\\` ???궢 18 +> - 筌〓㈇?? ???뮞???袁⑥쨮??븍뱜??疫꿸퀣??nullable 野껋럡??`src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs(76)` 1椰꾨똻? ?醫???몃빍?? +> ??낅쑓??꾨뱜: 2026-04-14 18:33 (KST) +> - ??쎄텢 ?類ㅼ퐠 ??뽯선???곕떽???됰뮸??덈뼄. `LlmSettings`??`enableProjectSkillDiscovery`, `enablePluginSkillDiscovery`, `enableLegacyCommandSkills`, `enableSkillInlineShell`, `skillInlineShellTimeoutSeconds`, `skillInlineShellMaxOutputChars`???곕떽???랁€???곗뺘 ??쇱젟/AX Agent ??쇱젟 UI???怨뚭퍙??됰뮸??덈뼄. +> - ??쎄텢 嚥≪뮆諭???볥젃??됱퓗????곸젫 ???뮞 ?遺얠젂?怨뺚봺 筌뤴뫖以됭굢??袁⑤빍????쇱젫 ??쎄텢 ???뵬 ??? 筌ㅼ뮄????륁젟 ??볦퍟????m뜞 獄쏆꼷???몃빍?? 揶쏆늿? ??€???닌딄쉐??€??????뵬 ??곸뒠??獄쏅뗀???늺 ??쇱벉 嚥≪뮆諭??遺욧퍕?癒?퐣 ??源??곕쭢??덈뼄. +> - inline shell ??쎈뻬疫꿸퀡????쇱젟 疫꿸퀡而???쑵??源딆넅, timeout, ?곗뮆??疫뀀챷????쀫립???怨몄뒠??롫즲嚥?癰귣떯而??됰뮸??덈뼄. ??쑵????怨밴묶????볦퍢 ?λ뜃????袁⑨세?袁る뱜 ??됰퓠????명€?揶쎛€?館釉???덇땀 ?얜챷???€以?獄쏆꼹???몃빍?? +> - `SkillEditorWindow`?? `SkillGalleryWindow`??lazy prompt body 野껋럥以덄몴??????롫즲嚥?筌띿쉸?ф€? ??쇱젟 癰궰€野???`ReloadFromCurrentSettings()`?????퉸 ?袁⑹삺 ??쎄텢 ???뮞????쇰뻻 ??덈즲嚥??類b봺??됰뮸??덈뼄. +> - 野꺜€筌? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_phase4b\\ -p:IntermediateOutputPath=obj\\verify_phase4b\\` 野껋럡??0 / ??살첒 0 +> - 野꺜€筌? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentToolCatalogTests|SkillServiceRuntimePolicyTests" -p:OutputPath=bin\\verify_phase4b_tests\\ -p:IntermediateOutputPath=obj\\verify_phase4b_tests\\` ???궢 18 +> - 筌〓㈇?? ???뮞???袁⑥쨮??븍뱜??疫꿸퀣??nullable 野껋럡??`src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs(76)` 1椰꾨똻? ?醫???몃빍?? -- ?낅뜲?댄듃: 2026-04-14 18:37 (KST) -- 기준 구조 濡쒖뺄 ?ㅻ깄?룹쓣 ?ㅼ떆 ?뺤씤?덉?留? ?꾩옱 ?ㅻ깄?룹뿉??PPT/臾몄꽌 ?꾩슜 踰덈뱾 ?ㅽ궗???쒕졆?섏? ?딆븯?듬땲?? ?€??AX媛€ 湲곕낯 ?ы븿?섍퀬 ?덈뒗 臾몄꽌??managed skill ?명듃瑜?以묒떖?쇰줈 諛고룷 ?먯궛 ?덉쭏???ㅻ벉?덉뒿?덈떎. -- pptx-creator, docx-creator, report-writer, prd-generator, meeting-minutes, weekly-report, markdown-to-doc??when_to_use?€ argument-hint 硫뷀?瑜?異붽???proactive skill ?좏깮怨??щ옒???몄텧 媛€?대뱶瑜?蹂닿컯?덉뒿?덈떎. -- ?쇰컲 ?ㅼ젙怨?AX Agent ?ㅼ젙???ㅽ궗 紐⑸줉?€ managed ?ㅼ퐫?꾨? 蹂꾨룄 湲곕낯 ?쒓났 ?ㅽ궗 洹몃9?쇰줈 遺꾨━?덇퀬, ?ㅽ궗 媛ㅻ윭由щ룄 湲곕낯 ?쒓났 / ?꾨줈?앺듃 / ?뚮윭洹몄씤 / ?ъ슜??/ 怨좉툒 ?꾪꽣?€ 諛곗?瑜??ъ슜?섎룄濡??뺣━?덉뒿?덈떎. -- ??蹂€寃쎌쑝濡?臾몄꽌쨌?꾨젅?좏뀒?댁뀡 ?ㅽ궗?€ 鍮뚮뱶 異쒕젰 skills ?대뜑瑜??듯빐 湲곕낯 諛고룷?섎㈃?쒕룄, UI?먯꽌 ?ъ슜???ㅽ궗怨?援щ텇???곹깭濡??뺤씤?????덉뒿?덈떎. -- 寃€利? dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_docskills\\ -p:IntermediateOutputPath=obj\\verify_docskills\\ 寃쎄퀬 0 / ?ㅻ쪟 0 +- ??낅쑓??꾨뱜: 2026-04-14 18:37 (KST) +- 湲곗? 援ъ“ 嚥≪뮇類???산퉬?猷뱀뱽 ??쇰뻻 ?類ㅼ뵥???筌? ?袁⑹삺 ??산퉬?猷밸퓠??PPT/?얜챷苑??袁⑹뒠 甕곕뜄諭???쎄텢????뺤죫??? ??녿릭??щ빍?? ????AX揶쎛€ 疫꿸퀡????釉??랁€???덈뮉 ?얜챷苑??managed skill ?紐낅뱜??餓λ쵐???곗쨮 獄쏄퀬猷??癒?텦 ??됱춳????삳쾳??됰뮸??덈뼄. +- pptx-creator, docx-creator, report-writer, prd-generator, meeting-minutes, weekly-report, markdown-to-doc??when_to_use?? argument-hint 筌롫?????곕떽???proactive skill ?醫뤾문????????紐꾪뀱 揶쎛€??€諭띄몴?癰귣떯而??됰뮸??덈뼄. +- ??곗뺘 ??쇱젟??AX Agent ??쇱젟????쎄텢 筌뤴뫖以?? managed ??쇳맜?袁? 癰귢쑬猷?疫꿸퀡????볥궗 ??쎄텢 域밸챶竊??곗쨮 ?브쑬???뉙€? ??쎄텢 揶쎼끇??뵳?猷?疫꿸퀡????볥궗 / ?袁⑥쨮??븍뱜 / ???쑎域밸챷??/ ?????/ ?⑥쥒???袁り숲?? 獄쏄퀣????????롫즲嚥??類b봺??됰뮸??덈뼄. +- ??癰궰€野껋럩?앮에??얜챷苑뚯쮯?袁⑥쟿?醫뤿€??곷€???쎄텢?? ??슢諭??곗뮆??skills ??€?묊몴????퉸 疫꿸퀡??獄쏄퀬猷??롢늺??뺣즲, UI?癒?퐣 ???????쎄텢???닌됲뀋???怨밴묶嚥??類ㅼ뵥??????됰뮸??덈뼄. +- 野꺜€筌? dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_docskills\\ -p:IntermediateOutputPath=obj\\verify_docskills\\ 野껋럡??0 / ??살첒 0 -- ?낅뜲?댄듃: 2026-04-14 18:45 (KST) -- AX Agent ?대? ?ㅼ젙???ㅽ궗 ???덈궡 釉붾줉??而ㅼ뒪?€ ?쇰꺼??異붽??덉뒿?덈떎. ?댁젣 .claude/skills/.../SKILL.md ?꾨줈?앺듃 ?명솚 寃쎈줈媛€ ?ㅽ궗 ??泥??붾㈃?먯꽌 諛붾줈 蹂댁뿬, ?뚰겕?ㅽ럹?댁뒪??媛숈? 援ъ“媛€ ?덉쑝硫?AX媛€ ?④퍡 ?쎈뒗?ㅻ뒗 ?먯쓣 UI?먯꽌???뺤씤?????덉뒿?덈떎. -- 寃€利? dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_skilllabel\\ -p:IntermediateOutputPath=obj\\verify_skilllabel\\ 寃쎄퀬 0 / ?ㅻ쪟 0 +- ??낅쑓??꾨뱜: 2026-04-14 18:45 (KST) +- AX Agent ??€? ??쇱젟????쎄텢 ????덇땀 ?됰뗀以???뚣끉??? ??곌볼???곕떽???됰뮸??덈뼄. ??곸젫 .claude/skills/.../SKILL.md ?袁⑥쨮??븍뱜 ?紐낆넎 野껋럥以덂첎? ??쎄텢 ??筌??遺얇늺?癒?퐣 獄쏅뗀以?癰귣똻肉? ??곌쾿??쎈읂??곷뮞??揶쏆늿? ?닌듼€쒎첎? ??됱몵筌?AX揶쎛€ ??m뜞 ??덈뮉??삳뮉 ?癒?뱽 UI?癒?퐣???類ㅼ뵥??????됰뮸??덈뼄. +- 野꺜€筌? dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_skilllabel\\ -p:IntermediateOutputPath=obj\\verify_skilllabel\\ 野껋럡??0 / ??살첒 0 -- ?낅뜲?댄듃: 2026-04-14 19:02 (KST) -- 肄붿썙??肄붾뱶???묒뾽 ?대뜑 ?좏깮 ??UI媛€ 2~3珥?硫덉텛???먮쫫???먭??? ?대뜑 蹂€寃?吏곹썑 ?ㅽ뻾?섎뜕 ?ㅽ궗 ?뚯뒪 ?ы깘?됱쓣 UI ?ㅻ젅??諛뽰쑝濡?遺꾨━?덉뒿?덈떎. ?댁젣 ?묒뾽 ?대뜑 蹂€寃? ???꾪솚, ?€??蹂듭썝 ???꾩슂???ㅽ궗 ?щ줈?쒕뒗 諛깃렇?쇱슫?쒖뿉???섑뻾?섍퀬, 議곌굔遺€ ?ㅽ궗 ?쒖꽦?붾쭔 UI???ㅼ떆 諛섏쁺?⑸땲?? -- 泥⑤? ?뚯씪 異붽?/?쒓굅泥섎읆 ?묒뾽 ?대뜑媛€ 諛붾€뚯? ?딅뒗 寃쎈줈??湲곗〈 ?ㅽ궗 吏묓빀留?湲곗??쇰줈 議곌굔遺€ ?ㅽ궗??媛깆떊?섎룄濡?遺꾨━??遺덊븘?뷀븳 ?ы깘?됰룄 以꾩??듬땲?? -- 寃€利? dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_folderpick\\ -p:IntermediateOutputPath=obj\\verify_folderpick\\ 寃쎄퀬 0 / ?ㅻ쪟 0 +- ??낅쑓??꾨뱜: 2026-04-14 19:02 (KST) +- ?꾨뗄????꾨뗀諭???臾믩씜 ??€???醫뤾문 ??UI揶쎛€ 2~3??筌롫뜆????癒?カ???癒??? ??€??癰궰€野?筌욊낱????쎈뻬??롫쐲 ??쎄텢 ???뮞 ??源??깆뱽 UI ??살쟿??獄쏅쉼?앮에??브쑬???됰뮸??덈뼄. ??곸젫 ?臾믩씜 ??€??癰궰€野? ???袁れ넎, ????癰귣벊?????袁⑹뒄????쎄텢 ??以??뺣뮉 獄쏄퉫???깆뒲??뽯퓠????묐뻬??랁€? 鈺곌퀗援붼겫? ??쎄텢 ??뽮쉐?遺얠춸 UI????쇰뻻 獄쏆꼷???몃빍?? +- 筌b뫀? ???뵬 ?곕떽?/??볤탢筌l꼶???臾믩씜 ??€?묈첎? 獄쏅뗀??? ??낅뮉 野껋럥以??疫꿸퀣????쎄텢 筌욌쵑鍮€筌?疫꿸퀣???곗쨮 鈺곌퀗援붼겫? ??쎄텢??揶쏄퉮???롫즲嚥??브쑬????븍뜇釉?酉€釉???源??곕즲 餓κ쑴???щ빍?? +- 野꺜€筌? dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_folderpick\\ -p:IntermediateOutputPath=obj\\verify_folderpick\\ 野껋럡??0 / ??살첒 0 -- ?낅뜲?댄듃: 2026-04-14 19:16 (KST) -- 遺꾩꽍??濡쒓렇 ?€??諛⑹떇??濡ㅻ쭅 ?뺥깭濡??뺣━?덉뒿?덈떎. app, perf, audit, workflow 濡쒓렇???좎쭨蹂??뚯씪???좎??섎릺 媛??뚯씪??理쒕? 1MB瑜??섏? ?딅룄濡??ㅻ옒???댁슜遺€??諛€?대궡硫???濡쒓렇瑜??댁뼱 遺숈엯?덈떎. -- 怨듯넻 ?좏떥 RollingTextLogStore瑜?異붽??섍퀬 LogService, AgentPerformanceLogService, AuditLogService, WorkflowLogService???④퍡 ?곸슜?덉뒿?덈떎. -- 怨듯넻 濡쒓렇/?깅뒫 濡쒓렇/媛먯궗 濡쒓렇??14?쇨퉴吏€留??좎??섍퀬, ?뚰겕?뚮줈???곸꽭 濡쒓렇??湲곗〈 ?ㅼ젙媛믪쓣 ?곕Ⅴ??理쒕? 14?쇱쓣 ?섏? ?딅룄濡?App ?쒖옉 ???곹븳???곸슜?덉뒿?덈떎. -- RollingTextLogStoreTests 3嫄댁쓣 異붽????뚯씪 ?ш린 ?곹븳 ?좎?, ?ㅻ옒???뚯씪 ??젣, ?좎쭨 ?붾젆?곕━ ??젣 ?숈옉??寃€利앺뻽?듬땲?? -- 寃€利? dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_logroll\\ -p:IntermediateOutputPath=obj\\verify_logroll\\ 寃쎄퀬 0 / ?ㅻ쪟 0 -- 寃€利? dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter RollingTextLogStoreTests -p:OutputPath=bin\\verify_logroll_tests\\ -p:IntermediateOutputPath=obj\\verify_logroll_tests\\ ?듦낵 3 -- 李멸퀬: ?뚯뒪???꾨줈?앺듃??湲곗〈 nullable 寃쎄퀬 src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs(76) 1嫄댁? ?좎??⑸땲?? -업데이트: 2026-04-14 21:00 (KST) -- Word/Excel/HTML 문서 생성 고도화 1차를 반영했습니다. `DocumentPlannerTool`은 제안서/보고서/분석 문서를 `Executive Summary`, `Business Case`, `Decision Ask`, `Appendix`까지 포함한 업무형 아웃라인으로 확장합니다. -- `DocumentAssemblerTool`은 DOCX 조립 시 HTML/Markdown 구조를 더 보존하도록 손봤습니다. 표, 목록, 콜아웃, 소제목을 평문으로만 밀어버리지 않고 Word 블록으로 다시 조립합니다. -- `ExcelSkill`에 `summary_sheet`를 추가해 KPI/핵심 인사이트/후속 과제를 담은 요약 시트를 상세 데이터 시트 앞에 함께 생성할 수 있게 했습니다. -- `HtmlSkill`은 `comparison`, `roadmap`, `matrix` 구조화 섹션을 지원하고, 함수 스키마의 `body` 필수 조건을 완화해 `sections` 중심 호출도 자연스럽게 받도록 정리했습니다. -- `docx-creator.skill.md`, `csv-to-xlsx.skill.md`, `markdown-to-doc.skill.md`, `report-writer.skill.md`는 Python 우회 경로보다 AX 네이티브 문서 도구를 우선 사용하도록 재작성했습니다. -- 테스트: `DocumentAssemblerSemanticTests`, `ExcelSkillSummarySheetTests`, `HtmlSkillConsultingSectionsTests`, `DocumentPlannerBusinessDocumentTests` 추가 -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_phase1\\ -p:IntermediateOutputPath=obj\\verify_doc_phase1\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DocumentAssemblerSemanticTests|ExcelSkillSummarySheetTests|HtmlSkillConsultingSectionsTests|DocumentPlannerBusinessDocumentTests|DocumentPlannerPresentationTests" -p:OutputPath=bin\\verify_doc_phase1_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_phase1_tests\\` 통과 5 +- ??낅쑓??꾨뱜: 2026-04-14 19:16 (KST) +- ?브쑴苑??嚥≪뮄??????獄쎻뫗???嚥▲끇彛??類κ묶嚥??類b봺??됰뮸??덈뼄. app, perf, audit, workflow 嚥≪뮄????醫롮?癰????뵬???醫???롫┷ 揶????뵬??筌ㅼ뮆? 1MB????? ??낅즲嚥???살삋????곸뒠?봔€??獄쎛€??€沅∽쭖???嚥≪뮄?뉒몴???곷선 ?븐늿???덈뼄. +- ?⑤벏???醫뤿뼢 RollingTextLogStore???곕떽???랁€?LogService, AgentPerformanceLogService, AuditLogService, WorkflowLogService????m뜞 ?怨몄뒠??됰뮸??덈뼄. +- ?⑤벏??嚥≪뮄???源낅뮟 嚥≪뮄??揶쏅Ŋ沅?嚥≪뮄???14??⑦돱筌왖€筌??醫???랁€? ??곌쾿???쨮???怨멸쉭 嚥≪뮄???疫꿸퀣????쇱젟揶쏅????怨뺚뀮??筌ㅼ뮆? 14??깆뱽 ??? ??낅즲嚥?App ??뽰삂 ???怨밸립???怨몄뒠??됰뮸??덈뼄. +- RollingTextLogStoreTests 3椰꾨똻???곕떽??????뵬 ??由??怨밸립 ?醫?, ??살삋?????뵬 ???? ?醫롮? ?遺얠젂?怨뺚봺 ??????덉삂??野꺜€筌앹빜六??щ빍?? +- 野꺜€筌? dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_logroll\\ -p:IntermediateOutputPath=obj\\verify_logroll\\ 野껋럡??0 / ??살첒 0 +- 野꺜€筌? dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter RollingTextLogStoreTests -p:OutputPath=bin\\verify_logroll_tests\\ -p:IntermediateOutputPath=obj\\verify_logroll_tests\\ ???궢 3 +- 筌〓㈇?? ???뮞???袁⑥쨮??븍뱜??疫꿸퀣??nullable 野껋럡??src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs(76) 1椰꾨똻? ?醫???몃빍?? +?낅뜲?댄듃: 2026-04-14 21:00 (KST) +- Word/Excel/HTML 臾몄꽌 ?앹꽦 怨좊룄??1李⑤? 諛섏쁺?덉뒿?덈떎. `DocumentPlannerTool`?€ ?쒖븞??蹂닿퀬??遺꾩꽍 臾몄꽌瑜?`Executive Summary`, `Business Case`, `Decision Ask`, `Appendix`源뚯? ?ы븿???낅Т???꾩썐?쇱씤?쇰줈 ?뺤옣?⑸땲?? +- `DocumentAssemblerTool`?€ DOCX 議곕┰ ??HTML/Markdown 援ъ“瑜???蹂댁〈?섎룄濡??먮뇬?듬땲?? ?? 紐⑸줉, 肄쒖븘?? ?뚯젣紐⑹쓣 ?됰Ц?쇰줈留?諛€?대쾭由ъ? ?딄퀬 Word 釉붾줉?쇰줈 ?ㅼ떆 議곕┰?⑸땲?? +- `ExcelSkill`??`summary_sheet`瑜?異붽???KPI/?듭떖 ?몄궗?댄듃/?꾩냽 怨쇱젣瑜??댁? ?붿빟 ?쒗듃瑜??곸꽭 ?곗씠???쒗듃 ?욎뿉 ?④퍡 ?앹꽦?????덇쾶 ?덉뒿?덈떎. +- `HtmlSkill`?€ `comparison`, `roadmap`, `matrix` 援ъ“???뱀뀡??吏€?먰븯怨? ?⑥닔 ?ㅽ궎留덉쓽 `body` ?꾩닔 議곌굔???꾪솕??`sections` 以묒떖 ?몄텧???먯뿰?ㅻ읇寃?諛쏅룄濡??뺣━?덉뒿?덈떎. +- `docx-creator.skill.md`, `csv-to-xlsx.skill.md`, `markdown-to-doc.skill.md`, `report-writer.skill.md`??Python ?고쉶 寃쎈줈蹂대떎 AX ?ㅼ씠?곕툕 臾몄꽌 ?꾧뎄瑜??곗꽑 ?ъ슜?섎룄濡??ъ옉?깊뻽?듬땲?? +- ?뚯뒪?? `DocumentAssemblerSemanticTests`, `ExcelSkillSummarySheetTests`, `HtmlSkillConsultingSectionsTests`, `DocumentPlannerBusinessDocumentTests` 異붽? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_phase1\\ -p:IntermediateOutputPath=obj\\verify_doc_phase1\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DocumentAssemblerSemanticTests|ExcelSkillSummarySheetTests|HtmlSkillConsultingSectionsTests|DocumentPlannerBusinessDocumentTests|DocumentPlannerPresentationTests" -p:OutputPath=bin\\verify_doc_phase1_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_phase1_tests\\` ?듦낵 5 -업데이트: 2026-04-14 21:50 (KST) -- PPT 생성 고도화 3차를 반영했습니다. `DeckPlanningService`를 추가해 deck brief 정규화, consulting storyline 보강, 누락된 `Executive Summary`/`Recommendation`/`Roadmap`/`Appendix` 자동 삽입, 레이아웃 alias 정규화를 내부 파이프라인으로 처리합니다. -- `DeckQualityReviewService`를 추가해 deck-level 품질 점수와 경고를 계산합니다. 템플릿 사용 여부, 레이아웃 다양성, executive summary/recommendation 유무, 텍스트 과밀, 근거 슬라이드 부족, placeholder 잔존을 함께 점검합니다. -- `PptxSkill`은 `audience`, `objective`, `decision_ask`, `storyline` 파라미터를 추가했고, `issue_tree`, `before_after`, `decision_matrix`, `risk_heatmap`, `benefit_waterfall`, `operating_model`, `appendix_evidence` 같은 상위 deck 레이아웃을 네이티브 슬라이드 타입으로 자동 정규화해 렌더링 전에 보정합니다. -- 결과 메시지도 고도화했습니다. `pptx_create` 실행 후 파일 경로만 반환하던 흐름에서, 이제 planning summary와 deck quality summary를 함께 반환해 모델과 사용자가 결과물 완성도를 바로 확인할 수 있습니다. -- `pptx-creator.skill.md`를 deck planning 중심으로 재작성했고, `strategy-deck`, `board-update`, `pmo-steering`, `sales-review-deck`, `operating-model-deck` 번들 스킬을 추가해 목적형 deck 생성 진입점을 늘렸습니다. -- 테스트로 `DeckPlanningServiceTests`, `DeckQualityReviewServiceTests`, `PptxSkillAutoRepairTests`를 추가했고, 기존 `PptxSkillConsultingDeckTests`와 함께 검증했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_ppt_phase3\\ -p:IntermediateOutputPath=obj\\verify_ppt_phase3\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DeckPlanningServiceTests|DeckQualityReviewServiceTests|PptxSkillAutoRepairTests|PptxSkillConsultingDeckTests" -p:OutputPath=bin\\verify_ppt_phase3_tests\\ -p:IntermediateOutputPath=obj\\verify_ppt_phase3_tests\\` 통과 5 +?낅뜲?댄듃: 2026-04-14 21:50 (KST) +- PPT ?앹꽦 怨좊룄??3李⑤? 諛섏쁺?덉뒿?덈떎. `DeckPlanningService`瑜?異붽???deck brief ?뺢퇋?? consulting storyline 蹂닿컯, ?꾨씫??`Executive Summary`/`Recommendation`/`Roadmap`/`Appendix` ?먮룞 ?쎌엯, ?덉씠?꾩썐 alias ?뺢퇋?붾? ?대? ?뚯씠?꾨씪?몄쑝濡?泥섎━?⑸땲?? +- `DeckQualityReviewService`瑜?異붽???deck-level ?덉쭏 ?먯닔?€ 寃쎄퀬瑜?怨꾩궛?⑸땲?? ?쒗뵆由??ъ슜 ?щ?, ?덉씠?꾩썐 ?ㅼ뼇?? executive summary/recommendation ?좊Т, ?띿뒪??怨쇰?, 洹쇨굅 ?щ씪?대뱶 遺€議? placeholder ?붿〈???④퍡 ?먭??⑸땲?? +- `PptxSkill`?€ `audience`, `objective`, `decision_ask`, `storyline` ?뚮씪誘명꽣瑜?異붽??덇퀬, `issue_tree`, `before_after`, `decision_matrix`, `risk_heatmap`, `benefit_waterfall`, `operating_model`, `appendix_evidence` 媛숈? ?곸쐞 deck ?덉씠?꾩썐???ㅼ씠?곕툕 ?щ씪?대뱶 ?€?낆쑝濡??먮룞 ?뺢퇋?뷀빐 ?뚮뜑留??꾩뿉 蹂댁젙?⑸땲?? +- 寃곌낵 硫붿떆吏€??怨좊룄?뷀뻽?듬땲?? `pptx_create` ?ㅽ뻾 ???뚯씪 寃쎈줈留?諛섑솚?섎뜕 ?먮쫫?먯꽌, ?댁젣 planning summary?€ deck quality summary瑜??④퍡 諛섑솚??紐⑤뜽怨??ъ슜?먭? 寃곌낵臾??꾩꽦?꾨? 諛붾줈 ?뺤씤?????덉뒿?덈떎. +- `pptx-creator.skill.md`瑜?deck planning 以묒떖?쇰줈 ?ъ옉?깊뻽怨? `strategy-deck`, `board-update`, `pmo-steering`, `sales-review-deck`, `operating-model-deck` 踰덈뱾 ?ㅽ궗??異붽???紐⑹쟻??deck ?앹꽦 吏꾩엯?먯쓣 ?섎졇?듬땲?? +- ?뚯뒪?몃줈 `DeckPlanningServiceTests`, `DeckQualityReviewServiceTests`, `PptxSkillAutoRepairTests`瑜?異붽??덇퀬, 湲곗〈 `PptxSkillConsultingDeckTests`?€ ?④퍡 寃€利앺뻽?듬땲?? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_ppt_phase3\\ -p:IntermediateOutputPath=obj\\verify_ppt_phase3\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DeckPlanningServiceTests|DeckQualityReviewServiceTests|PptxSkillAutoRepairTests|PptxSkillConsultingDeckTests" -p:OutputPath=bin\\verify_ppt_phase3_tests\\ -p:IntermediateOutputPath=obj\\verify_ppt_phase3_tests\\` ?듦낵 5 -업데이트: 2026-04-14 22:14 (KST) -- 문서 planner/assembler 고도화 2차를 반영했습니다. [DocumentPlannerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentPlannerTool.cs)는 `format: xlsx`를 지원하고, 분석/제안 시나리오에서 `summary_sheet + sheets` 구조의 `excel_create` scaffold를 직접 생성합니다. -- 같은 파일의 포맷 해석 로직은 `xlsx`, `excel`, `workbook`, `tracker`, `dashboard`, `scorecard` 계열 의도를 먼저 감지해 워크북 경로로 보내도록 보강했습니다. -- [DocumentAssemblerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs)는 DOCX 조립 시 `cover_subtitle`, `toc`, `header`, `footer`를 실제 OpenXML 문서에 반영하고, 구조화 HTML을 Word 블록으로 조립한 뒤 품질 리뷰 점수를 함께 반환합니다. -- 같은 도구의 HTML 조립 경로도 공통 [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)와 연결해 score/strengths/issues 기준의 요약을 돌려주도록 정리했습니다. -- [kpi-workbook.skill.md](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/skills/kpi-workbook.skill.md)는 complex workbook 생성 시 planner 경로를 열기 위해 `document_plan`을 허용 도구에 추가했습니다. -- 테스트로 [DocumentPlannerWorkbookScaffoldTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocumentPlannerWorkbookScaffoldTests.cs), [DocumentAssemblerDocxFeaturesTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocumentAssemblerDocxFeaturesTests.cs)를 추가했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_planning2\\ -p:IntermediateOutputPath=obj\\verify_doc_planning2\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DocumentPlannerWorkbookScaffoldTests|DocumentAssemblerDocxFeaturesTests|DocumentAssemblerSemanticTests|DocumentPlannerBusinessDocumentTests|ExcelSkillExecutiveSummaryLinkTests|HtmlSkillConsultingSectionsTests|DocxSkillTemplateFeaturesTests" -p:OutputPath=bin\\verify_doc_planning_tests3\\ -p:IntermediateOutputPath=obj\\verify_doc_planning_tests3\\` 통과 7 +?낅뜲?댄듃: 2026-04-14 22:14 (KST) +- 臾몄꽌 planner/assembler 怨좊룄??2李⑤? 諛섏쁺?덉뒿?덈떎. [DocumentPlannerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentPlannerTool.cs)??`format: xlsx`瑜?吏€?먰븯怨? 遺꾩꽍/?쒖븞 ?쒕굹由ъ삤?먯꽌 `summary_sheet + sheets` 援ъ“??`excel_create` scaffold瑜?吏곸젒 ?앹꽦?⑸땲?? +- 媛숈? ?뚯씪???щ㎎ ?댁꽍 濡쒖쭅?€ `xlsx`, `excel`, `workbook`, `tracker`, `dashboard`, `scorecard` 怨꾩뿴 ?섎룄瑜?癒쇱? 媛먯????뚰겕遺?寃쎈줈濡?蹂대궡?꾨줉 蹂닿컯?덉뒿?덈떎. +- [DocumentAssemblerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs)??DOCX 議곕┰ ??`cover_subtitle`, `toc`, `header`, `footer`瑜??ㅼ젣 OpenXML 臾몄꽌??諛섏쁺?섍퀬, 援ъ“??HTML??Word 釉붾줉?쇰줈 議곕┰?????덉쭏 由щ럭 ?먯닔瑜??④퍡 諛섑솚?⑸땲?? +- 媛숈? ?꾧뎄??HTML 議곕┰ 寃쎈줈??怨듯넻 [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)?€ ?곌껐??score/strengths/issues 湲곗????붿빟???뚮젮二쇰룄濡??뺣━?덉뒿?덈떎. +- [kpi-workbook.skill.md](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/skills/kpi-workbook.skill.md)??complex workbook ?앹꽦 ??planner 寃쎈줈瑜??닿린 ?꾪빐 `document_plan`???덉슜 ?꾧뎄??異붽??덉뒿?덈떎. +- ?뚯뒪?몃줈 [DocumentPlannerWorkbookScaffoldTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocumentPlannerWorkbookScaffoldTests.cs), [DocumentAssemblerDocxFeaturesTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocumentAssemblerDocxFeaturesTests.cs)瑜?異붽??덉뒿?덈떎. +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_planning2\\ -p:IntermediateOutputPath=obj\\verify_doc_planning2\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DocumentPlannerWorkbookScaffoldTests|DocumentAssemblerDocxFeaturesTests|DocumentAssemblerSemanticTests|DocumentPlannerBusinessDocumentTests|ExcelSkillExecutiveSummaryLinkTests|HtmlSkillConsultingSectionsTests|DocxSkillTemplateFeaturesTests" -p:OutputPath=bin\\verify_doc_planning_tests3\\ -p:IntermediateOutputPath=obj\\verify_doc_planning_tests3\\` ?듦낵 7 -업데이트: 2026-04-14 22:28 (KST) -- 문서 포맷 고도화 3차를 반영했습니다. [DocumentAssemblerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs)는 DOCX 조립 시 `template_path`와 `page_numbers`를 지원해 사내 템플릿 복제 후 커버, 목차, 머리글, 바닥글, 페이지 번호를 함께 적용할 수 있게 했습니다. -- 같은 도구의 DOCX 경로는 템플릿 상속 여부를 [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)의 구조화 문서 리뷰 입력으로 전달해 템플릿 기반 산출물 강점까지 품질 요약에 반영합니다. -- [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)는 `data_validations`를 지원하도록 확장했습니다. 단일 시트, summary sheet 포함 워크북, 멀티 시트 워크북 모두에서 OpenXML `DataValidation` 규칙을 생성하고 워크북 품질 리뷰에 검증 규칙 수를 포함합니다. -- [HtmlSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/HtmlSkill.cs)는 `decision_summary`, `evidence_cards` 섹션을 지원해 경영 보고형 HTML에서 의사결정 요약과 근거 카드 묶음을 구조화 블록으로 렌더링합니다. -- [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)의 HTML 리뷰는 새 블록을 인식해 comparison, roadmap, matrix 외에 decision/evidence 구조도 강점으로 점수화하도록 보강했습니다. -- 테스트로 [ExcelSkillDataValidationTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillDataValidationTests.cs)를 추가했고, [DocumentAssemblerDocxFeaturesTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocumentAssemblerDocxFeaturesTests.cs), [HtmlSkillConsultingSectionsTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/HtmlSkillConsultingSectionsTests.cs)를 확장해 DOCX 템플릿/페이지 번호와 HTML decision/evidence 블록을 회귀 검증했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_phase_next\\ -p:IntermediateOutputPath=obj\\verify_doc_phase_next\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DocumentAssemblerDocxFeaturesTests|DocumentAssemblerSemanticTests|DocumentPlannerWorkbookScaffoldTests|ExcelSkillExecutiveSummaryLinkTests|ExcelSkillSummarySheetTests|ExcelSkillDataValidationTests|HtmlSkillConsultingSectionsTests|DocxSkillTemplateFeaturesTests|DocumentPlannerBusinessDocumentTests" -p:OutputPath=bin\\verify_doc_phase_next_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_phase_next_tests\\` 통과 9 +?낅뜲?댄듃: 2026-04-14 22:28 (KST) +- 臾몄꽌 ?щ㎎ 怨좊룄??3李⑤? 諛섏쁺?덉뒿?덈떎. [DocumentAssemblerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs)??DOCX 議곕┰ ??`template_path`?€ `page_numbers`瑜?吏€?먰빐 ?щ궡 ?쒗뵆由?蹂듭젣 ??而ㅻ쾭, 紐⑹감, 癒몃━湲€, 諛붾떏湲€, ?섏씠吏€ 踰덊샇瑜??④퍡 ?곸슜?????덇쾶 ?덉뒿?덈떎. +- 媛숈? ?꾧뎄??DOCX 寃쎈줈???쒗뵆由??곸냽 ?щ?瑜?[ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)??援ъ“??臾몄꽌 由щ럭 ?낅젰?쇰줈 ?꾨떖???쒗뵆由?湲곕컲 ?곗텧臾?媛뺤젏源뚯? ?덉쭏 ?붿빟??諛섏쁺?⑸땲?? +- [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)??`data_validations`瑜?吏€?먰븯?꾨줉 ?뺤옣?덉뒿?덈떎. ?⑥씪 ?쒗듃, summary sheet ?ы븿 ?뚰겕遺? 硫€???쒗듃 ?뚰겕遺?紐⑤몢?먯꽌 OpenXML `DataValidation` 洹쒖튃???앹꽦?섍퀬 ?뚰겕遺??덉쭏 由щ럭??寃€利?洹쒖튃 ?섎? ?ы븿?⑸땲?? +- [HtmlSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/HtmlSkill.cs)??`decision_summary`, `evidence_cards` ?뱀뀡??吏€?먰빐 寃쎌쁺 蹂닿퀬??HTML?먯꽌 ?섏궗寃곗젙 ?붿빟怨?洹쇨굅 移대뱶 臾띠쓬??援ъ“??釉붾줉?쇰줈 ?뚮뜑留곹빀?덈떎. +- [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)??HTML 由щ럭????釉붾줉???몄떇??comparison, roadmap, matrix ?몄뿉 decision/evidence 援ъ“??媛뺤젏?쇰줈 ?먯닔?뷀븯?꾨줉 蹂닿컯?덉뒿?덈떎. +- ?뚯뒪?몃줈 [ExcelSkillDataValidationTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillDataValidationTests.cs)瑜?異붽??덇퀬, [DocumentAssemblerDocxFeaturesTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocumentAssemblerDocxFeaturesTests.cs), [HtmlSkillConsultingSectionsTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/HtmlSkillConsultingSectionsTests.cs)瑜??뺤옣??DOCX ?쒗뵆由??섏씠吏€ 踰덊샇?€ HTML decision/evidence 釉붾줉???뚭? 寃€利앺뻽?듬땲?? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_phase_next\\ -p:IntermediateOutputPath=obj\\verify_doc_phase_next\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DocumentAssemblerDocxFeaturesTests|DocumentAssemblerSemanticTests|DocumentPlannerWorkbookScaffoldTests|ExcelSkillExecutiveSummaryLinkTests|ExcelSkillSummarySheetTests|ExcelSkillDataValidationTests|HtmlSkillConsultingSectionsTests|DocxSkillTemplateFeaturesTests|DocumentPlannerBusinessDocumentTests" -p:OutputPath=bin\\verify_doc_phase_next_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_phase_next_tests\\` ?듦낵 9 -업데이트: 2026-04-14 23:05 (KST) -- 문서 고도화 다음 단계를 반영했습니다. [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)는 `summary_sheet`에 `decision_summary`, `scorecards`, `sheet_summaries`를 추가로 받을 수 있게 확장됐고, executive summary sheet에서 의사결정 요청, 핵심 scorecard, 상세 시트별 상태를 순서대로 렌더링합니다. -- 워크북 품질 리뷰 입력도 같은 구조를 인식하도록 [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)의 `WorkbookReviewInput`과 `ReviewWorkbook()`를 확장했습니다. 이제 summary sheet가 KPI/decision/detail summary를 충분히 담고 있는지 강점과 보완 포인트로 함께 표시합니다. -- [DocumentAssemblerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs)는 `style_map` 파라미터를 받아 template-based DOCX assembly에서 `title`, `heading1`, `heading2`, `body` 문단 스타일을 실제 Word 문단에 매핑합니다. cover title, 섹션 헤딩, 본문 문단이 사내 템플릿 스타일을 더 자연스럽게 따라가도록 정리했습니다. -- 새 회귀 테스트 [ExcelSkillDashboardSummaryTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillDashboardSummaryTests.cs), [DocumentAssemblerStyleMapTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocumentAssemblerStyleMapTests.cs)를 추가했고, [ArtifactQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactQualityReviewServiceTests.cs)도 새 record 시그니처에 맞춰 갱신했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_next2\\ -p:IntermediateOutputPath=obj\\verify_doc_next2\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|DocumentAssemblerStyleMapTests|DocumentAssemblerDocxFeaturesTests|DocumentAssemblerSemanticTests|ExcelSkillDashboardSummaryTests|ExcelSkillSummarySheetTests|ExcelSkillExecutiveSummaryLinkTests|ExcelSkillDataValidationTests|ExcelSkillConditionalFormattingTests" -p:OutputPath=bin\\verify_doc_next2_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_next2_tests\\` 통과 11 +?낅뜲?댄듃: 2026-04-14 23:05 (KST) +- 臾몄꽌 怨좊룄???ㅼ쓬 ?④퀎瑜?諛섏쁺?덉뒿?덈떎. [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)??`summary_sheet`??`decision_summary`, `scorecards`, `sheet_summaries`瑜?異붽?濡?諛쏆쓣 ???덇쾶 ?뺤옣?먭퀬, executive summary sheet?먯꽌 ?섏궗寃곗젙 ?붿껌, ?듭떖 scorecard, ?곸꽭 ?쒗듃蹂??곹깭瑜??쒖꽌?€濡??뚮뜑留곹빀?덈떎. +- ?뚰겕遺??덉쭏 由щ럭 ?낅젰??媛숈? 援ъ“瑜??몄떇?섎룄濡?[ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)??`WorkbookReviewInput`怨?`ReviewWorkbook()`瑜??뺤옣?덉뒿?덈떎. ?댁젣 summary sheet媛€ KPI/decision/detail summary瑜?異⑸텇???닿퀬 ?덈뒗吏€ 媛뺤젏怨?蹂댁셿 ?ъ씤?몃줈 ?④퍡 ?쒖떆?⑸땲?? +- [DocumentAssemblerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs)??`style_map` ?뚮씪誘명꽣瑜?諛쏆븘 template-based DOCX assembly?먯꽌 `title`, `heading1`, `heading2`, `body` 臾몃떒 ?ㅽ??쇱쓣 ?ㅼ젣 Word 臾몃떒??留ㅽ븨?⑸땲?? cover title, ?뱀뀡 ?ㅻ뵫, 蹂몃Ц 臾몃떒???щ궡 ?쒗뵆由??ㅽ??쇱쓣 ???먯뿰?ㅻ읇寃??곕씪媛€?꾨줉 ?뺣━?덉뒿?덈떎. +- ???뚭? ?뚯뒪??[ExcelSkillDashboardSummaryTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillDashboardSummaryTests.cs), [DocumentAssemblerStyleMapTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocumentAssemblerStyleMapTests.cs)瑜?異붽??덇퀬, [ArtifactQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactQualityReviewServiceTests.cs)????record ?쒓렇?덉쿂??留욎떠 媛깆떊?덉뒿?덈떎. +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_next2\\ -p:IntermediateOutputPath=obj\\verify_doc_next2\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|DocumentAssemblerStyleMapTests|DocumentAssemblerDocxFeaturesTests|DocumentAssemblerSemanticTests|ExcelSkillDashboardSummaryTests|ExcelSkillSummarySheetTests|ExcelSkillExecutiveSummaryLinkTests|ExcelSkillDataValidationTests|ExcelSkillConditionalFormattingTests" -p:OutputPath=bin\\verify_doc_next2_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_next2_tests\\` ?듦낵 11 -업데이트: 2026-04-14 23:15 (KST) -- [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)는 `summary_sheet.trend_series`를 새로 지원합니다. summary sheet에서 `Trend Dashboard` 섹션을 추가로 만들고 `label/current/target/delta/status`를 열 기반으로 렌더링해 workbook summary가 KPI 표 수준을 넘어 상태 대시보드 역할까지 하도록 확장했습니다. -- 같은 파일의 workbook review 입력 계산은 `trend_series`도 summary quality 강점으로 인정하도록 업데이트했습니다. [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)는 workbook summary가 KPI/decision/highlight 없이 끝나는 경우 보완 포인트를 추가로 반환합니다. -- [HtmlSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/HtmlSkill.cs)는 `print=true`에서 명시적 `print_header`/`print_footer`가 없는 경우 기본 frame(`title`, `date | AX Copilot`)을 자동 생성합니다. print-ready HTML이 최소 배포형 header/footer를 갖도록 내부 기본값을 넣은 것입니다. -- [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)의 HTML 리뷰는 print-ready 문서에 frame이 없거나, decision/evidence block이 부족하거나, 장문 보고서인데 cover가 없는 경우를 추가로 경고합니다. -- [DeckPlanningService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckPlanningService.cs)는 `comparison`, `roadmap`, `executive_summary`, `kpi_dashboard` 슬라이드의 최소 구조를 자동 보정하고, 긴 headline은 내부 기준 길이로 압축합니다. -- [DeckQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckQualityReviewService.cs)는 slide-level quality gate를 추가해 긴 headline, 과밀 슬라이드, 옵션 부족, 표/차트 데이터 누락을 `Slide N:` 경고로 품질 요약에 포함합니다. -- 테스트로 [ExcelSkillDashboardSummaryTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillDashboardSummaryTests.cs), [HtmlSkillPrintFrameTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/HtmlSkillPrintFrameTests.cs), [DeckQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DeckQualityReviewServiceTests.cs)를 확장했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_next3\\ -p:IntermediateOutputPath=obj\\verify_doc_next3\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DeckQualityReviewServiceTests|PptxSkillAutoRepairTests|PptxSkillConsultingDeckTests|ExcelSkillDashboardSummaryTests|ExcelSkillSummarySheetTests|HtmlSkillPrintFrameTests|HtmlSkillConsultingSectionsTests|ArtifactQualityReviewServiceTests" -p:OutputPath=bin\\verify_doc_next3_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_next3_tests\\` 통과 13 +?낅뜲?댄듃: 2026-04-14 23:15 (KST) +- [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)??`summary_sheet.trend_series`瑜??덈줈 吏€?먰빀?덈떎. summary sheet?먯꽌 `Trend Dashboard` ?뱀뀡??異붽?濡?留뚮뱾怨?`label/current/target/delta/status`瑜???湲곕컲?쇰줈 ?뚮뜑留곹빐 workbook summary媛€ KPI ???섏????섏뼱 ?곹깭 ?€?쒕낫????븷源뚯? ?섎룄濡??뺤옣?덉뒿?덈떎. +- 媛숈? ?뚯씪??workbook review ?낅젰 怨꾩궛?€ `trend_series`??summary quality 媛뺤젏?쇰줈 ?몄젙?섎룄濡??낅뜲?댄듃?덉뒿?덈떎. [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)??workbook summary媛€ KPI/decision/highlight ?놁씠 ?앸굹??寃쎌슦 蹂댁셿 ?ъ씤?몃? 異붽?濡?諛섑솚?⑸땲?? +- [HtmlSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/HtmlSkill.cs)??`print=true`?먯꽌 紐낆떆??`print_header`/`print_footer`媛€ ?녿뒗 寃쎌슦 湲곕낯 frame(`title`, `date | AX Copilot`)???먮룞 ?앹꽦?⑸땲?? print-ready HTML??理쒖냼 諛고룷??header/footer瑜?媛뽯룄濡??대? 湲곕낯媛믪쓣 ?l? 寃껋엯?덈떎. +- [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)??HTML 由щ럭??print-ready 臾몄꽌??frame???녾굅?? decision/evidence block??遺€議깊븯嫄곕굹, ?λЦ 蹂닿퀬?쒖씤??cover媛€ ?녿뒗 寃쎌슦瑜?異붽?濡?寃쎄퀬?⑸땲?? +- [DeckPlanningService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckPlanningService.cs)??`comparison`, `roadmap`, `executive_summary`, `kpi_dashboard` ?щ씪?대뱶??理쒖냼 援ъ“瑜??먮룞 蹂댁젙?섍퀬, 湲?headline?€ ?대? 湲곗? 湲몄씠濡??뺤텞?⑸땲?? +- [DeckQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckQualityReviewService.cs)??slide-level quality gate瑜?異붽???湲?headline, 怨쇰? ?щ씪?대뱶, ?듭뀡 遺€議? ??李⑦듃 ?곗씠???꾨씫??`Slide N:` 寃쎄퀬濡??덉쭏 ?붿빟???ы븿?⑸땲?? +- ?뚯뒪?몃줈 [ExcelSkillDashboardSummaryTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillDashboardSummaryTests.cs), [HtmlSkillPrintFrameTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/HtmlSkillPrintFrameTests.cs), [DeckQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DeckQualityReviewServiceTests.cs)瑜??뺤옣?덉뒿?덈떎. +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_next3\\ -p:IntermediateOutputPath=obj\\verify_doc_next3\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DeckQualityReviewServiceTests|PptxSkillAutoRepairTests|PptxSkillConsultingDeckTests|ExcelSkillDashboardSummaryTests|ExcelSkillSummarySheetTests|HtmlSkillPrintFrameTests|HtmlSkillConsultingSectionsTests|ArtifactQualityReviewServiceTests" -p:OutputPath=bin\\verify_doc_next3_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_next3_tests\\` ?듦낵 13 -업데이트: 2026-04-14 23:25 (KST) -- [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)는 `summary_sheet.dashboard_sheet_name`과 `trend_series`를 바탕으로 별도 `Dashboard` worksheet를 생성합니다. summary sheet에서 decision summary, scorecards, trend dashboard, detail sheet links를 요약하고, dashboard sheet에서는 이를 한 장의 workbook dashboard로 다시 정리해 summary-only workbook보다 분석/보고 밀도를 높입니다. -- 같은 파일의 single-sheet / multi-sheet workbook 생성 경로는 dashboard sheet가 있으면 시트 순서를 `Summary -> Dashboard -> Detail...`로 정렬하고, summary hyperlink 수와 total sheet count를 품질 리뷰 입력에 정확히 전달합니다. -- [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)의 `WorkbookReviewInput`은 `HasDashboardSheet`를 새로 받습니다. dashboard가 있는 workbook은 강점으로 계산하고, detail sheet가 여러 장인데 dashboard가 없는 경우는 보완 포인트로 돌려줍니다. -- [DocumentAssemblerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs)는 `style_map` 지원 범위를 `cover_subtitle`, `callout`, `table_header`까지 넓혔습니다. cover subtitle 문단, 강조 블록 paragraph, 표 header cell paragraph가 사내 DOCX 템플릿 스타일을 실제로 타도록 조립 경로를 연결했습니다. -- [DocumentAssemblerStyleMapTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocumentAssemblerStyleMapTests.cs)는 title/heading/body뿐 아니라 subtitle/callout/table header 스타일까지 회귀 검증하도록 보강했습니다. -- [PptxSkillGoldenDeckTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/PptxSkillGoldenDeckTests.cs)를 추가해 strong board deck이 `PPT quality` 요약을 안정적으로 반환하고 불필요한 `Slide alerts` 없이 통과하는지 golden regression으로 고정했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_next4\\ -p:IntermediateOutputPath=obj\\verify_doc_next4\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|DocumentAssemblerStyleMapTests|DocumentAssemblerDocxFeaturesTests|DocumentAssemblerSemanticTests|ExcelSkillDashboardSummaryTests|ExcelSkillSummarySheetTests|ExcelSkillExecutiveSummaryLinkTests|ExcelSkillDataValidationTests|ExcelSkillConditionalFormattingTests|HtmlSkillPrintFrameTests|HtmlSkillConsultingSectionsTests|DeckQualityReviewServiceTests|PptxSkillAutoRepairTests|PptxSkillConsultingDeckTests|PptxSkillGoldenDeckTests" -p:OutputPath=bin\\verify_doc_next4_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_next4_tests\\` 통과 20 +?낅뜲?댄듃: 2026-04-14 23:25 (KST) +- [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)??`summary_sheet.dashboard_sheet_name`怨?`trend_series`瑜?諛뷀깢?쇰줈 蹂꾨룄 `Dashboard` worksheet瑜??앹꽦?⑸땲?? summary sheet?먯꽌 decision summary, scorecards, trend dashboard, detail sheet links瑜??붿빟?섍퀬, dashboard sheet?먯꽌???대? ???μ쓽 workbook dashboard濡??ㅼ떆 ?뺣━??summary-only workbook蹂대떎 遺꾩꽍/蹂닿퀬 諛€?꾨? ?믪엯?덈떎. +- 媛숈? ?뚯씪??single-sheet / multi-sheet workbook ?앹꽦 寃쎈줈??dashboard sheet媛€ ?덉쑝硫??쒗듃 ?쒖꽌瑜?`Summary -> Dashboard -> Detail...`濡??뺣젹?섍퀬, summary hyperlink ?섏? total sheet count瑜??덉쭏 由щ럭 ?낅젰???뺥솗???꾨떖?⑸땲?? +- [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)??`WorkbookReviewInput`?€ `HasDashboardSheet`瑜??덈줈 諛쏆뒿?덈떎. dashboard媛€ ?덈뒗 workbook?€ 媛뺤젏?쇰줈 怨꾩궛?섍퀬, detail sheet媛€ ?щ윭 ?μ씤??dashboard媛€ ?녿뒗 寃쎌슦??蹂댁셿 ?ъ씤?몃줈 ?뚮젮以띾땲?? +- [DocumentAssemblerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs)??`style_map` 吏€??踰붿쐞瑜?`cover_subtitle`, `callout`, `table_header`源뚯? ?볧삍?듬땲?? cover subtitle 臾몃떒, 媛뺤“ 釉붾줉 paragraph, ??header cell paragraph媛€ ?щ궡 DOCX ?쒗뵆由??ㅽ??쇱쓣 ?ㅼ젣濡??€?꾨줉 議곕┰ 寃쎈줈瑜??곌껐?덉뒿?덈떎. +- [DocumentAssemblerStyleMapTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocumentAssemblerStyleMapTests.cs)??title/heading/body肉??꾨땲??subtitle/callout/table header ?ㅽ??쇨퉴吏€ ?뚭? 寃€利앺븯?꾨줉 蹂닿컯?덉뒿?덈떎. +- [PptxSkillGoldenDeckTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/PptxSkillGoldenDeckTests.cs)瑜?異붽???strong board deck??`PPT quality` ?붿빟???덉젙?곸쑝濡?諛섑솚?섍퀬 遺덊븘?뷀븳 `Slide alerts` ?놁씠 ?듦낵?섎뒗吏€ golden regression?쇰줈 怨좎젙?덉뒿?덈떎. +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_next4\\ -p:IntermediateOutputPath=obj\\verify_doc_next4\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|DocumentAssemblerStyleMapTests|DocumentAssemblerDocxFeaturesTests|DocumentAssemblerSemanticTests|ExcelSkillDashboardSummaryTests|ExcelSkillSummarySheetTests|ExcelSkillExecutiveSummaryLinkTests|ExcelSkillDataValidationTests|ExcelSkillConditionalFormattingTests|HtmlSkillPrintFrameTests|HtmlSkillConsultingSectionsTests|DeckQualityReviewServiceTests|PptxSkillAutoRepairTests|PptxSkillConsultingDeckTests|PptxSkillGoldenDeckTests" -p:OutputPath=bin\\verify_doc_next4_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_next4_tests\\` ?듦낵 20 -업데이트: 2026-04-14 23:32 (KST) -- [HtmlSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/HtmlSkill.cs)는 `board_report`, `strategy_brief` 구조화 섹션 타입을 추가했습니다. board report는 decision ask, recommendation, rationale, metrics, risks, next steps를 board-ready 패널로 렌더링하고, strategy brief는 strategic question, core thesis, implications, decisions를 전략 요약 패널로 렌더링합니다. -- [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)의 HTML 리뷰는 `board-report-panel`, `strategy-brief-panel`을 새 강점으로 인식합니다. 반대로 board report인데 evidence/table이 없거나 strategy brief인데 comparison/roadmap이 없을 때는 추가 보완 포인트를 반환하도록 규칙을 보강했습니다. -- [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)의 `WriteDashboardSheet()`는 dashboard sheet에 `kpis`, `highlights`, `actions`까지 함께 표시하도록 확장됐습니다. summary sheet와 dashboard sheet가 서로 같은 정보를 단순 중복하는 대신, executive dashboard 성격을 더 분명히 갖도록 정리한 변경입니다. -- [PptxSkillGoldenDeckTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/PptxSkillGoldenDeckTests.cs)는 board deck 외에 strategy deck golden fixture를 추가했습니다. `storyline`, `decision_ask`, recommendation headline 길이까지 품질 게이트 기준에 맞는 strong strategy deck을 회귀 샘플로 고정했습니다. -- 테스트로 [HtmlSkillConsultingSectionsTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/HtmlSkillConsultingSectionsTests.cs), [ExcelSkillDashboardSummaryTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillDashboardSummaryTests.cs), [ArtifactQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactQualityReviewServiceTests.cs), [PptxSkillGoldenDeckTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/PptxSkillGoldenDeckTests.cs)를 확장했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_next5\\ -p:IntermediateOutputPath=obj\\verify_doc_next5\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|ExcelSkillDashboardSummaryTests|HtmlSkillConsultingSectionsTests|HtmlSkillPrintFrameTests|DeckQualityReviewServiceTests|PptxSkillGoldenDeckTests|PptxSkillAutoRepairTests|PptxSkillConsultingDeckTests" -p:OutputPath=bin\\verify_doc_next5_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_next5_tests\\` 통과 14 +?낅뜲?댄듃: 2026-04-14 23:32 (KST) +- [HtmlSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/HtmlSkill.cs)??`board_report`, `strategy_brief` 援ъ“???뱀뀡 ?€?낆쓣 異붽??덉뒿?덈떎. board report??decision ask, recommendation, rationale, metrics, risks, next steps瑜?board-ready ?⑤꼸濡??뚮뜑留곹븯怨? strategy brief??strategic question, core thesis, implications, decisions瑜??꾨왂 ?붿빟 ?⑤꼸濡??뚮뜑留곹빀?덈떎. +- [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)??HTML 由щ럭??`board-report-panel`, `strategy-brief-panel`????媛뺤젏?쇰줈 ?몄떇?⑸땲?? 諛섎?濡?board report?몃뜲 evidence/table???녾굅??strategy brief?몃뜲 comparison/roadmap???놁쓣 ?뚮뒗 異붽? 蹂댁셿 ?ъ씤?몃? 諛섑솚?섎룄濡?洹쒖튃??蹂닿컯?덉뒿?덈떎. +- [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)??`WriteDashboardSheet()`??dashboard sheet??`kpis`, `highlights`, `actions`源뚯? ?④퍡 ?쒖떆?섎룄濡??뺤옣?먯뒿?덈떎. summary sheet?€ dashboard sheet媛€ ?쒕줈 媛숈? ?뺣낫瑜??⑥닚 以묐났?섎뒗 ?€?? executive dashboard ?깃꺽????遺꾨챸??媛뽯룄濡??뺣━??蹂€寃쎌엯?덈떎. +- [PptxSkillGoldenDeckTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/PptxSkillGoldenDeckTests.cs)??board deck ?몄뿉 strategy deck golden fixture瑜?異붽??덉뒿?덈떎. `storyline`, `decision_ask`, recommendation headline 湲몄씠源뚯? ?덉쭏 寃뚯씠??湲곗???留욌뒗 strong strategy deck???뚭? ?섑뵆濡?怨좎젙?덉뒿?덈떎. +- ?뚯뒪?몃줈 [HtmlSkillConsultingSectionsTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/HtmlSkillConsultingSectionsTests.cs), [ExcelSkillDashboardSummaryTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillDashboardSummaryTests.cs), [ArtifactQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactQualityReviewServiceTests.cs), [PptxSkillGoldenDeckTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/PptxSkillGoldenDeckTests.cs)瑜??뺤옣?덉뒿?덈떎. +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_next5\\ -p:IntermediateOutputPath=obj\\verify_doc_next5\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|ExcelSkillDashboardSummaryTests|HtmlSkillConsultingSectionsTests|HtmlSkillPrintFrameTests|DeckQualityReviewServiceTests|PptxSkillGoldenDeckTests|PptxSkillAutoRepairTests|PptxSkillConsultingDeckTests" -p:OutputPath=bin\\verify_doc_next5_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_next5_tests\\` ?듦낵 14 -업데이트: 2026-04-14 23:58 (KST) -- [ArtifactRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactRepairGuideService.cs)를 추가했습니다. 이 서비스는 [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)가 반환한 HTML/XLSX/DOCX 품질 이슈를 읽어 `Repair guide:` 형태의 바로 실행 가능한 개선 가이드로 바꿉니다. -- [HtmlSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/HtmlSkill.cs), [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs), [DocumentAssemblerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs)는 이제 품질 점수 요약 뒤에 repair guide를 함께 반환합니다. 출력만 보는 사용자도 “무엇을 더 보완해야 하는지”를 바로 이해할 수 있게 정리한 변경입니다. -- [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)는 `dashboard_tiles`, `variance_series`를 추가 지원합니다. `WriteDashboardSheet()` 경로는 decision summary, scorecards, KPI, trend dashboard, detail summaries 외에 dashboard tiles와 variance overview까지 함께 렌더링해 운영 리뷰형 workbook archetype을 더 명확히 만들었습니다. -- workbook 리뷰 강점 계산도 같이 넓혔습니다. [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)의 summary/dashboard 신호 판정은 `dashboard_tiles`, `variance_series`가 들어온 workbook도 richer dashboard로 인식합니다. -- 목적형 번들 스킬을 추가했습니다. [strategy-brief-html.skill.md](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/skills/strategy-brief-html.skill.md)는 전략 브리프 HTML 생성용 진입점을 제공하고, [operating-review-xlsx.skill.md](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/skills/operating-review-xlsx.skill.md)는 Summary/Dashboard/Detail 구조의 운영 리뷰 workbook 생성 경로를 제공합니다. -- 테스트로 [ArtifactRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactRepairGuideServiceTests.cs)를 추가했고, [ExcelSkillDashboardSummaryTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillDashboardSummaryTests.cs), [HtmlSkillConsultingSectionsTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/HtmlSkillConsultingSectionsTests.cs)를 확장해 archetype과 repair guide를 함께 회귀 검증했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_next6\\ -p:IntermediateOutputPath=obj\\verify_doc_next6\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|ExcelSkillDashboardSummaryTests|HtmlSkillConsultingSectionsTests|HtmlSkillPrintFrameTests|DocumentAssemblerStyleMapTests|DocumentAssemblerDocxFeaturesTests|DocumentAssemblerSemanticTests|PptxSkillGoldenDeckTests|DeckQualityReviewServiceTests" -p:OutputPath=bin\\verify_doc_next6_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_next6_tests\\` 통과 17 +?낅뜲?댄듃: 2026-04-14 23:58 (KST) +- [ArtifactRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactRepairGuideService.cs)瑜?異붽??덉뒿?덈떎. ???쒕퉬?ㅻ뒗 [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)媛€ 諛섑솚??HTML/XLSX/DOCX ?덉쭏 ?댁뒋瑜??쎌뼱 `Repair guide:` ?뺥깭??諛붾줈 ?ㅽ뻾 媛€?ν븳 媛쒖꽑 媛€?대뱶濡?諛붽퓠?덈떎. +- [HtmlSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/HtmlSkill.cs), [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs), [DocumentAssemblerTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs)???댁젣 ?덉쭏 ?먯닔 ?붿빟 ?ㅼ뿉 repair guide瑜??④퍡 諛섑솚?⑸땲?? 異쒕젰留?蹂대뒗 ?ъ슜?먮룄 ?쒕Т?뉗쓣 ??蹂댁셿?댁빞 ?섎뒗吏€?앸? 諛붾줈 ?댄빐?????덇쾶 ?뺣━??蹂€寃쎌엯?덈떎. +- [ExcelSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ExcelSkill.cs)??`dashboard_tiles`, `variance_series`瑜?異붽? 吏€?먰빀?덈떎. `WriteDashboardSheet()` 寃쎈줈??decision summary, scorecards, KPI, trend dashboard, detail summaries ?몄뿉 dashboard tiles?€ variance overview源뚯? ?④퍡 ?뚮뜑留곹빐 ?댁쁺 由щ럭??workbook archetype????紐낇솗??留뚮뱾?덉뒿?덈떎. +- workbook 由щ럭 媛뺤젏 怨꾩궛??媛숈씠 ?볧삍?듬땲?? [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)??summary/dashboard ?좏샇 ?먯젙?€ `dashboard_tiles`, `variance_series`媛€ ?ㅼ뼱??workbook??richer dashboard濡??몄떇?⑸땲?? +- 紐⑹쟻??踰덈뱾 ?ㅽ궗??異붽??덉뒿?덈떎. [strategy-brief-html.skill.md](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/skills/strategy-brief-html.skill.md)???꾨왂 釉뚮━??HTML ?앹꽦??吏꾩엯?먯쓣 ?쒓났?섍퀬, [operating-review-xlsx.skill.md](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/skills/operating-review-xlsx.skill.md)??Summary/Dashboard/Detail 援ъ“???댁쁺 由щ럭 workbook ?앹꽦 寃쎈줈瑜??쒓났?⑸땲?? +- ?뚯뒪?몃줈 [ArtifactRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactRepairGuideServiceTests.cs)瑜?異붽??덇퀬, [ExcelSkillDashboardSummaryTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillDashboardSummaryTests.cs), [HtmlSkillConsultingSectionsTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/HtmlSkillConsultingSectionsTests.cs)瑜??뺤옣??archetype怨?repair guide瑜??④퍡 ?뚭? 寃€利앺뻽?듬땲?? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_next6\\ -p:IntermediateOutputPath=obj\\verify_doc_next6\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|ExcelSkillDashboardSummaryTests|HtmlSkillConsultingSectionsTests|HtmlSkillPrintFrameTests|DocumentAssemblerStyleMapTests|DocumentAssemblerDocxFeaturesTests|DocumentAssemblerSemanticTests|PptxSkillGoldenDeckTests|DeckQualityReviewServiceTests" -p:OutputPath=bin\\verify_doc_next6_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_next6_tests\\` ?듦낵 17 -업데이트: 2026-04-15 00:19 (KST) -- `AgentCommandQueue`를 `Prompt/Notification` 2종에서 `Steering`, `PermissionContinuation`, `Resume`, `UserDecision`까지 포함하는 통합 큐로 확장했습니다. [AgentLoopService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentLoopService.cs)는 이를 `queued_steering`, `queue_permission_continuation`, `queue_resume` 메타 메시지로 주입해 실행 중 추가 입력과 승인 후 재개 문맥을 더 안정적으로 반영합니다. -- 코드 탭 언어 지원 카탈로그를 확장했습니다. [CodeLanguageCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/CodeLanguageCatalog.cs)는 `Go`, `Rust`, `PHP`, `Ruby`, `Kotlin`, `Swift`를 LSP 심화 지원군으로 승격했고, [LspClientService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/LspClientService.cs)는 `gopls`, `rust-analyzer`, `intelephense`, `solargraph`, `kotlin-language-server`, `sourcekit-lsp`를 로컬 설치 서버 기준으로 탐지합니다. -- 내부 설정의 코드 탭 설명을 더 명시적으로 정리했습니다. [SettingsWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml), [SettingsViewModel.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/ViewModels/SettingsViewModel.cs)는 `빠른 선택 언어`, `지원 언어(LSP)`, `코드 탭 기본 지원`을 나눠 보여주도록 보강했습니다. -- 워크스페이스 컨텍스트 생성기를 강화했습니다. [WorkspaceContextGenerator.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/WorkspaceContextGenerator.cs)는 `Language Snapshot`, `Agent Context`, `Key Manifests` 섹션을 추가하고 `.claude/skills`, `.ax/rules`, `AXMEMORY.md`, 주요 manifest 파일을 함께 요약합니다. -- PPT 품질 보정 가이드도 추가했습니다. [DeckRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckRepairGuideService.cs)는 deck 품질 이슈를 바로 실행 가능한 개선 문장으로 바꾸고, [PptxSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/PptxSkill.cs)는 `Deck repair guide:`를 품질 요약과 함께 반환합니다. -- 테스트: [AgentCommandQueueTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentCommandQueueTests.cs), [CodeLanguageCatalogTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/CodeLanguageCatalogTests.cs), [WorkspaceContextGeneratorTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs), [DeckRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DeckRepairGuideServiceTests.cs), [PptxSkillConsultingDeckTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/PptxSkillConsultingDeckTests.cs) -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_master_batch\\ -p:IntermediateOutputPath=obj\\verify_master_batch\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentCommandQueueTests|CodeLanguageCatalogTests|WorkspaceContextGeneratorTests|PptxSkillConsultingDeckTests|DeckRepairGuideServiceTests" -p:OutputPath=bin\\verify_master_batch_tests\\ -p:IntermediateOutputPath=obj\\verify_master_batch_tests\\` 통과 35 +?낅뜲?댄듃: 2026-04-15 00:19 (KST) +- `AgentCommandQueue`瑜?`Prompt/Notification` 2醫낆뿉??`Steering`, `PermissionContinuation`, `Resume`, `UserDecision`源뚯? ?ы븿?섎뒗 ?듯빀 ?먮줈 ?뺤옣?덉뒿?덈떎. [AgentLoopService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentLoopService.cs)???대? `queued_steering`, `queue_permission_continuation`, `queue_resume` 硫뷀? 硫붿떆吏€濡?二쇱엯???ㅽ뻾 以?異붽? ?낅젰怨??뱀씤 ???ш컻 臾몃㎘?????덉젙?곸쑝濡?諛섏쁺?⑸땲?? +- 肄붾뱶 ???몄뼱 吏€??移댄깉濡쒓렇瑜??뺤옣?덉뒿?덈떎. [CodeLanguageCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/CodeLanguageCatalog.cs)??`Go`, `Rust`, `PHP`, `Ruby`, `Kotlin`, `Swift`瑜?LSP ?ы솕 吏€?먭뎔?쇰줈 ?밴꺽?덇퀬, [LspClientService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/LspClientService.cs)??`gopls`, `rust-analyzer`, `intelephense`, `solargraph`, `kotlin-language-server`, `sourcekit-lsp`瑜?濡쒖뺄 ?ㅼ튂 ?쒕쾭 湲곗??쇰줈 ?먯??⑸땲?? +- ?대? ?ㅼ젙??肄붾뱶 ???ㅻ챸????紐낆떆?곸쑝濡??뺣━?덉뒿?덈떎. [SettingsWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml), [SettingsViewModel.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/ViewModels/SettingsViewModel.cs)??`鍮좊Ⅸ ?좏깮 ?몄뼱`, `吏€???몄뼱(LSP)`, `肄붾뱶 ??湲곕낯 吏€?????섎닠 蹂댁뿬二쇰룄濡?蹂닿컯?덉뒿?덈떎. +- ?뚰겕?ㅽ럹?댁뒪 而⑦뀓?ㅽ듃 ?앹꽦湲곕? 媛뺥솕?덉뒿?덈떎. [WorkspaceContextGenerator.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/WorkspaceContextGenerator.cs)??`Language Snapshot`, `Agent Context`, `Key Manifests` ?뱀뀡??異붽??섍퀬 `.claude/skills`, `.ax/rules`, `AXMEMORY.md`, 二쇱슂 manifest ?뚯씪???④퍡 ?붿빟?⑸땲?? +- PPT ?덉쭏 蹂댁젙 媛€?대뱶??異붽??덉뒿?덈떎. [DeckRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckRepairGuideService.cs)??deck ?덉쭏 ?댁뒋瑜?諛붾줈 ?ㅽ뻾 媛€?ν븳 媛쒖꽑 臾몄옣?쇰줈 諛붽씀怨? [PptxSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/PptxSkill.cs)??`Deck repair guide:`瑜??덉쭏 ?붿빟怨??④퍡 諛섑솚?⑸땲?? +- ?뚯뒪?? [AgentCommandQueueTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentCommandQueueTests.cs), [CodeLanguageCatalogTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/CodeLanguageCatalogTests.cs), [WorkspaceContextGeneratorTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/WorkspaceContextGeneratorTests.cs), [DeckRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DeckRepairGuideServiceTests.cs), [PptxSkillConsultingDeckTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/PptxSkillConsultingDeckTests.cs) +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_master_batch\\ -p:IntermediateOutputPath=obj\\verify_master_batch\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentCommandQueueTests|CodeLanguageCatalogTests|WorkspaceContextGeneratorTests|PptxSkillConsultingDeckTests|DeckRepairGuideServiceTests" -p:OutputPath=bin\\verify_master_batch_tests\\ -p:IntermediateOutputPath=obj\\verify_master_batch_tests\\` ?듦낵 35 -업데이트: 2026-04-15 07:00 (KST) -- `기준 구조` 기준 남은 격차를 줄이기 위한 통합 고도화 계획을 확정했습니다. 남은 주요 축은 `에이전틱 루프/명령 큐`, `tool_result preview 안정화`, `명령/스킬 합성`, `문서 포맷 마감`, `개발언어 지원 정합화`, `회귀 테스트/릴리즈 게이트`입니다. -- 첫 배치로 [AgentCommandQueue.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentCommandQueue.cs)를 우선순위 배치 소비가 가능한 구조로 재작성했습니다. `peek`, `dequeue`, `dequeueAllMatching`, `dequeuePriorityBatch`, `snapshot` API를 추가해 `기준 구조`의 unified queue처럼 고우선 입력을 먼저 소비하고 lower-priority 항목을 뒤로 미루는 기반을 만들었습니다. -- [AgentLoopService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentLoopService.cs)의 큐 배수 로직도 함께 조정했습니다. 기존 `DrainAll()` 방식 대신 같은 우선순위 배치만 소비하고, 남은 큐 항목이 있으면 `Deferred ... lower-priority queued item(s)` thinking 이벤트를 남겨 다음 턴으로 넘깁니다. -- [AgentToolResultBudget.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentToolResultBudget.cs)는 preview 재사용 범위를 넓혔습니다. 기존에는 동일 `MsgId`에서만 `QueryPreviewContent`를 재사용했지만, 이제 `tool_use_id` 기준 preview 인덱스를 만들어 재구성된 tool result 메시지에서도 안정적으로 같은 preview를 재사용합니다. -- 테스트는 [AgentCommandQueueTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentCommandQueueTests.cs)에 `priority batch dequeue`, `predicate matching` 시나리오를 추가했고, [AgentToolResultBudgetTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentToolResultBudgetTests.cs)에는 `tool_use_id`가 같은 cloned tool result가 이전 preview를 재사용하는 회귀 케이스를 추가했습니다. -- 다음 배치에서는 `tool_result replacement state`를 대화 단위로 더 고정하고, 이후 `명령/스킬 합성 계층`과 `문서 포맷 마감`으로 순차 확장할 예정입니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_queue_preview\\ -p:IntermediateOutputPath=obj\\verify_queue_preview\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentCommandQueueTests|AgentToolResultBudgetTests" -p:OutputPath=bin\\verify_queue_preview_tests\\ -p:IntermediateOutputPath=obj\\verify_queue_preview_tests\\` 통과 7 +?낅뜲?댄듃: 2026-04-15 07:00 (KST) +- `湲곗? 援ъ“` 湲곗? ?⑥? 寃⑹감瑜?以꾩씠湲??꾪븳 ?듯빀 怨좊룄??怨꾪쉷???뺤젙?덉뒿?덈떎. ?⑥? 二쇱슂 異뺤? `?먯씠?꾪떛 猷⑦봽/紐낅졊 ??, `tool_result preview ?덉젙??, `紐낅졊/?ㅽ궗 ?⑹꽦`, `臾몄꽌 ?щ㎎ 留덇컧`, `媛쒕컻?몄뼱 吏€???뺥빀??, `?뚭? ?뚯뒪??由대━利?寃뚯씠???낅땲?? +- 泥?諛곗튂濡?[AgentCommandQueue.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentCommandQueue.cs)瑜??곗꽑?쒖쐞 諛곗튂 ?뚮퉬媛€ 媛€?ν븳 援ъ“濡??ъ옉?깊뻽?듬땲?? `peek`, `dequeue`, `dequeueAllMatching`, `dequeuePriorityBatch`, `snapshot` API瑜?異붽???`湲곗? 援ъ“`??unified queue泥섎읆 怨좎슦???낅젰??癒쇱? ?뚮퉬?섍퀬 lower-priority ??ぉ???ㅻ줈 誘몃(??湲곕컲??留뚮뱾?덉뒿?덈떎. +- [AgentLoopService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentLoopService.cs)????諛곗닔 濡쒖쭅???④퍡 議곗젙?덉뒿?덈떎. 湲곗〈 `DrainAll()` 諛⑹떇 ?€??媛숈? ?곗꽑?쒖쐞 諛곗튂留??뚮퉬?섍퀬, ?⑥? ????ぉ???덉쑝硫?`Deferred ... lower-priority queued item(s)` thinking ?대깽?몃? ?④꺼 ?ㅼ쓬 ?댁쑝濡??섍퉩?덈떎. +- [AgentToolResultBudget.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentToolResultBudget.cs)??preview ?ъ궗??踰붿쐞瑜??볧삍?듬땲?? 湲곗〈?먮뒗 ?숈씪 `MsgId`?먯꽌留?`QueryPreviewContent`瑜??ъ궗?⑺뻽吏€留? ?댁젣 `tool_use_id` 湲곗? preview ?몃뜳?ㅻ? 留뚮뱾???ш뎄?깅맂 tool result 硫붿떆吏€?먯꽌???덉젙?곸쑝濡?媛숈? preview瑜??ъ궗?⑺빀?덈떎. +- ?뚯뒪?몃뒗 [AgentCommandQueueTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentCommandQueueTests.cs)??`priority batch dequeue`, `predicate matching` ?쒕굹由ъ삤瑜?異붽??덇퀬, [AgentToolResultBudgetTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentToolResultBudgetTests.cs)?먮뒗 `tool_use_id`媛€ 媛숈? cloned tool result媛€ ?댁쟾 preview瑜??ъ궗?⑺븯???뚭? 耳€?댁뒪瑜?異붽??덉뒿?덈떎. +- ?ㅼ쓬 諛곗튂?먯꽌??`tool_result replacement state`瑜??€???⑥쐞濡???怨좎젙?섍퀬, ?댄썑 `紐낅졊/?ㅽ궗 ?⑹꽦 怨꾩링`怨?`臾몄꽌 ?щ㎎ 留덇컧`?쇰줈 ?쒖감 ?뺤옣???덉젙?낅땲?? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_queue_preview\\ -p:IntermediateOutputPath=obj\\verify_queue_preview\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentCommandQueueTests|AgentToolResultBudgetTests" -p:OutputPath=bin\\verify_queue_preview_tests\\ -p:IntermediateOutputPath=obj\\verify_queue_preview_tests\\` ?듦낵 7 -업데이트: 2026-04-15 07:16 (KST) -- `tool_result` preview 안정화 2차를 반영했습니다. [AgentMessageInvariantHelper.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentMessageInvariantHelper.cs)는 `tool_use_id -> QueryPreviewContent` 맵을 공용으로 만들고, 같은 tool result가 다른 메시지 객체로 다시 로드되더라도 preview를 복원하는 helper를 제공합니다. -- [ChatSessionStateService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/ChatSessionStateService.cs)는 분기 대화 생성 시 `QueryPreviewContent`를 함께 복사하고, 저장된 대화를 다시 열 때 누락된 preview를 `tool_use_id` 기준으로 보정합니다. [ChatStorageService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/ChatStorageService.cs)도 저장 직전에 preview 보정을 먼저 수행해 재시작 후 축약 상태가 흔들리지 않게 맞췄습니다. -- 슬래시 합성도 실행 경로까지 일원화했습니다. [SlashCommandCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SlashCommandCatalog.cs)는 exact token 충돌을 팔레트와 같은 우선순위로 해석하는 `ResolvePreferredCommand()`를 추가했고, [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `ParseSlashCommandAsync()`는 built-in/skill 후보를 함께 모은 뒤 같은 규칙으로 우선 대상을 선택합니다. -- 이 변경으로 `/review`처럼 builtin command와 skill이 같은 토큰을 공유하는 경우에도 “팔레트에는 skill이 앞에 보이는데 실행은 builtin이 먼저 잡히는” 불일치가 줄어들었습니다. -- 테스트는 [ChatSessionStateServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ChatSessionStateServiceTests.cs)에 branch/save-load preview 복원 케이스를 추가했고, [SlashCommandCatalogTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/SlashCommandCatalogTests.cs)를 새로 추가해 skill 우선 dedupe와 exact token 우선 해석을 회귀 검증했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_preview_state\\ -p:IntermediateOutputPath=obj\\verify_preview_state\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentToolResultBudgetTests|ChatSessionStateServiceTests" -p:OutputPath=bin\\verify_preview_state_tests\\ -p:IntermediateOutputPath=obj\\verify_preview_state_tests\\` 통과 38 -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_command_resolution\\ -p:IntermediateOutputPath=obj\\verify_command_resolution\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "SlashCommandCatalogTests|ChatSessionStateServiceTests|AgentToolResultBudgetTests|AgentCommandQueueTests" -p:OutputPath=bin\\verify_command_resolution_tests\\ -p:IntermediateOutputPath=obj\\verify_command_resolution_tests\\` 통과 50 +?낅뜲?댄듃: 2026-04-15 07:16 (KST) +- `tool_result` preview ?덉젙??2李⑤? 諛섏쁺?덉뒿?덈떎. [AgentMessageInvariantHelper.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentMessageInvariantHelper.cs)??`tool_use_id -> QueryPreviewContent` 留듭쓣 怨듭슜?쇰줈 留뚮뱾怨? 媛숈? tool result媛€ ?ㅻⅨ 硫붿떆吏€ 媛앹껜濡??ㅼ떆 濡쒕뱶?섎뜑?쇰룄 preview瑜?蹂듭썝?섎뒗 helper瑜??쒓났?⑸땲?? +- [ChatSessionStateService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/ChatSessionStateService.cs)??遺꾧린 ?€???앹꽦 ??`QueryPreviewContent`瑜??④퍡 蹂듭궗?섍퀬, ?€?λ맂 ?€?붾? ?ㅼ떆 ?????꾨씫??preview瑜?`tool_use_id` 湲곗??쇰줈 蹂댁젙?⑸땲?? [ChatStorageService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/ChatStorageService.cs)???€??吏곸쟾??preview 蹂댁젙??癒쇱? ?섑뻾???ъ떆????異뺤빟 ?곹깭媛€ ?붾뱾由ъ? ?딄쾶 留욎톬?듬땲?? +- ?щ옒???⑹꽦???ㅽ뻾 寃쎈줈源뚯? ?쇱썝?뷀뻽?듬땲?? [SlashCommandCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SlashCommandCatalog.cs)??exact token 異⑸룎???붾젅?몄? 媛숈? ?곗꽑?쒖쐞濡??댁꽍?섎뒗 `ResolvePreferredCommand()`瑜?異붽??덇퀬, [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)??`ParseSlashCommandAsync()`??built-in/skill ?꾨낫瑜??④퍡 紐⑥? ??媛숈? 洹쒖튃?쇰줈 ?곗꽑 ?€?곸쓣 ?좏깮?⑸땲?? +- ??蹂€寃쎌쑝濡?`/review`泥섎읆 builtin command?€ skill??媛숈? ?좏겙??怨듭쑀?섎뒗 寃쎌슦?먮룄 ?쒗뙏?덊듃?먮뒗 skill???욎뿉 蹂댁씠?붾뜲 ?ㅽ뻾?€ builtin??癒쇱? ?≫엳?붴€?遺덉씪移섍? 以꾩뼱?ㅼ뿀?듬땲?? +- ?뚯뒪?몃뒗 [ChatSessionStateServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ChatSessionStateServiceTests.cs)??branch/save-load preview 蹂듭썝 耳€?댁뒪瑜?異붽??덇퀬, [SlashCommandCatalogTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/SlashCommandCatalogTests.cs)瑜??덈줈 異붽???skill ?곗꽑 dedupe?€ exact token ?곗꽑 ?댁꽍???뚭? 寃€利앺뻽?듬땲?? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_preview_state\\ -p:IntermediateOutputPath=obj\\verify_preview_state\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentToolResultBudgetTests|ChatSessionStateServiceTests" -p:OutputPath=bin\\verify_preview_state_tests\\ -p:IntermediateOutputPath=obj\\verify_preview_state_tests\\` ?듦낵 38 +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_command_resolution\\ -p:IntermediateOutputPath=obj\\verify_command_resolution\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "SlashCommandCatalogTests|ChatSessionStateServiceTests|AgentToolResultBudgetTests|AgentCommandQueueTests" -p:OutputPath=bin\\verify_command_resolution_tests\\ -p:IntermediateOutputPath=obj\\verify_command_resolution_tests\\` ?듦낵 50 -업데이트: 2026-04-15 08:32 (KST) -- `tool_result` replacement state를 query/compact 진입 전에도 더 고정했습니다. [AgentQueryContextBuilder.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentQueryContextBuilder.cs)는 query view 생성 전에 누락된 preview를 먼저 복원하고, [ContextCondenser.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ContextCondenser.cs)는 compact 이전에 같은 정규화를 적용해 긴 세션과 재시작 후 상태 차이를 줄였습니다. -- [AgentToolResultBudget.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentToolResultBudget.cs)는 `sourceMessages`가 없는 호출에서도 현재 window 자체의 `tool_use_id` preview를 재사용하도록 보강했습니다. 이 변경으로 query view 내부의 cloned tool_result도 source list 유무와 관계없이 같은 preview를 더 안정적으로 유지합니다. -- 개발언어 지원은 `no-LSP fallback`까지 연결했습니다. [CodeLanguageCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/CodeLanguageCatalog.cs)는 언어별 `manifest/build/test/lint` 힌트를 제공하고, [LspTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/LspTool.cs)는 로컬 언어 서버가 없거나 연결되지 않아도 정적 fallback 안내를 반환합니다. -- 설정과 프롬프트도 같은 모델로 맞췄습니다. [SettingsViewModel.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/ViewModels/SettingsViewModel.cs), [SettingsWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml), [ChatWindow.SystemPromptBuilder.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.SystemPromptBuilder.cs)는 `Fallback 분석` 설명과 LSP 미사용 시 대체 분석 지침을 노출합니다. -- 테스트로 [AgentQueryContextBuilderTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentQueryContextBuilderTests.cs)를 추가했고, [AgentToolResultBudgetTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentToolResultBudgetTests.cs), [CodeLanguageCatalogTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/CodeLanguageCatalogTests.cs)를 확장해 preview 재사용과 fallback 힌트를 회귀 검증했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_loop_lang_finish\\ -p:IntermediateOutputPath=obj\\verify_loop_lang_finish\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentToolResultBudgetTests|AgentQueryContextBuilderTests|CodeLanguageCatalogTests|ContextCondenserTests" -p:OutputPath=bin\\verify_loop_lang_finish_tests\\ -p:IntermediateOutputPath=obj\\verify_loop_lang_finish_tests\\` 통과 20 +?낅뜲?댄듃: 2026-04-15 08:32 (KST) +- `tool_result` replacement state瑜?query/compact 吏꾩엯 ?꾩뿉????怨좎젙?덉뒿?덈떎. [AgentQueryContextBuilder.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentQueryContextBuilder.cs)??query view ?앹꽦 ?꾩뿉 ?꾨씫??preview瑜?癒쇱? 蹂듭썝?섍퀬, [ContextCondenser.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ContextCondenser.cs)??compact ?댁쟾??媛숈? ?뺢퇋?붾? ?곸슜??湲??몄뀡怨??ъ떆?????곹깭 李⑥씠瑜?以꾩??듬땲?? +- [AgentToolResultBudget.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentToolResultBudget.cs)??`sourceMessages`媛€ ?녿뒗 ?몄텧?먯꽌???꾩옱 window ?먯껜??`tool_use_id` preview瑜??ъ궗?⑺븯?꾨줉 蹂닿컯?덉뒿?덈떎. ??蹂€寃쎌쑝濡?query view ?대???cloned tool_result??source list ?좊Т?€ 愿€怨꾩뾾??媛숈? preview瑜????덉젙?곸쑝濡??좎??⑸땲?? +- 媛쒕컻?몄뼱 吏€?먯? `no-LSP fallback`源뚯? ?곌껐?덉뒿?덈떎. [CodeLanguageCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/CodeLanguageCatalog.cs)???몄뼱蹂?`manifest/build/test/lint` ?뚰듃瑜??쒓났?섍퀬, [LspTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/LspTool.cs)??濡쒖뺄 ?몄뼱 ?쒕쾭媛€ ?녾굅???곌껐?섏? ?딆븘???뺤쟻 fallback ?덈궡瑜?諛섑솚?⑸땲?? +- ?ㅼ젙怨??꾨\?꾪듃??媛숈? 紐⑤뜽濡?留욎톬?듬땲?? [SettingsViewModel.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/ViewModels/SettingsViewModel.cs), [SettingsWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml), [ChatWindow.SystemPromptBuilder.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.SystemPromptBuilder.cs)??`Fallback 遺꾩꽍` ?ㅻ챸怨?LSP 誘몄궗?????€泥?遺꾩꽍 吏€移⑥쓣 ?몄텧?⑸땲?? +- ?뚯뒪?몃줈 [AgentQueryContextBuilderTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentQueryContextBuilderTests.cs)瑜?異붽??덇퀬, [AgentToolResultBudgetTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentToolResultBudgetTests.cs), [CodeLanguageCatalogTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/CodeLanguageCatalogTests.cs)瑜??뺤옣??preview ?ъ궗?⑷낵 fallback ?뚰듃瑜??뚭? 寃€利앺뻽?듬땲?? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_loop_lang_finish\\ -p:IntermediateOutputPath=obj\\verify_loop_lang_finish\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentToolResultBudgetTests|AgentQueryContextBuilderTests|CodeLanguageCatalogTests|ContextCondenserTests" -p:OutputPath=bin\\verify_loop_lang_finish_tests\\ -p:IntermediateOutputPath=obj\\verify_loop_lang_finish_tests\\` ?듦낵 20 -업데이트: 2026-04-15 09:05 (KST) -- 문서 critic/repair 루프를 추가 정리했습니다. [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)는 DOCX 장문 문서에서 `cover`, `table of contents`, `template`, `header/footer` 보강 포인트를, XLSX dashboard workbook에서는 `highlight/action`, `detail navigation`, `trend/variance formula` 보강 포인트를 새로 판정합니다. -- [ArtifactRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactRepairGuideService.cs)는 위 이슈들을 바로 실행 가능한 보정 가이드로 치환하도록 확장했습니다. HTML/DOCX/XLSX에서 품질 점수만 보여주는 것이 아니라, 어떤 구조를 추가하거나 어떤 데이터를 연결해야 하는지 직접 안내합니다. -- [DeckRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckRepairGuideService.cs)는 `appendix/evidence` 부족과 `duplicate headline` 문제를 별도 액션으로 바꿔 deck 마감 가이드를 더 구체화했습니다. -- [DocxSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocxSkill.cs)는 DOCX 출력 결과에도 `Repair guide:`를 함께 반환하고, Executive Summary/Recommendation/Appendix 섹션 인식에 한글 키워드를 같이 사용하도록 조정했습니다. -- 테스트는 [ArtifactQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactQualityReviewServiceTests.cs), [ArtifactRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactRepairGuideServiceTests.cs), [DeckRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DeckRepairGuideServiceTests.cs), [DocxSkillTemplateFeaturesTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocxSkillTemplateFeaturesTests.cs)를 확장해 회귀를 고정했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_repair_finalize\\ -p:IntermediateOutputPath=obj\\verify_doc_repair_finalize\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|DeckRepairGuideServiceTests|DocxSkillTemplateFeaturesTests" -p:OutputPath=bin\\verify_doc_repair_finalize_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_repair_finalize_tests\\` 통과 11 +?낅뜲?댄듃: 2026-04-15 09:05 (KST) +- 臾몄꽌 critic/repair 猷⑦봽瑜?異붽? ?뺣━?덉뒿?덈떎. [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)??DOCX ?λЦ 臾몄꽌?먯꽌 `cover`, `table of contents`, `template`, `header/footer` 蹂닿컯 ?ъ씤?몃?, XLSX dashboard workbook?먯꽌??`highlight/action`, `detail navigation`, `trend/variance formula` 蹂닿컯 ?ъ씤?몃? ?덈줈 ?먯젙?⑸땲?? +- [ArtifactRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactRepairGuideService.cs)?????댁뒋?ㅼ쓣 諛붾줈 ?ㅽ뻾 媛€?ν븳 蹂댁젙 媛€?대뱶濡?移섑솚?섎룄濡??뺤옣?덉뒿?덈떎. HTML/DOCX/XLSX?먯꽌 ?덉쭏 ?먯닔留?蹂댁뿬二쇰뒗 寃껋씠 ?꾨땲?? ?대뼡 援ъ“瑜?異붽??섍굅???대뼡 ?곗씠?곕? ?곌껐?댁빞 ?섎뒗吏€ 吏곸젒 ?덈궡?⑸땲?? +- [DeckRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckRepairGuideService.cs)??`appendix/evidence` 遺€議깃낵 `duplicate headline` 臾몄젣瑜?蹂꾨룄 ?≪뀡?쇰줈 諛붽퓭 deck 留덇컧 媛€?대뱶瑜???援ъ껜?뷀뻽?듬땲?? +- [DocxSkill.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DocxSkill.cs)??DOCX 異쒕젰 寃곌낵?먮룄 `Repair guide:`瑜??④퍡 諛섑솚?섍퀬, Executive Summary/Recommendation/Appendix ?뱀뀡 ?몄떇???쒓? ?ㅼ썙?쒕? 媛숈씠 ?ъ슜?섎룄濡?議곗젙?덉뒿?덈떎. +- ?뚯뒪?몃뒗 [ArtifactQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactQualityReviewServiceTests.cs), [ArtifactRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactRepairGuideServiceTests.cs), [DeckRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DeckRepairGuideServiceTests.cs), [DocxSkillTemplateFeaturesTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocxSkillTemplateFeaturesTests.cs)瑜??뺤옣???뚭?瑜?怨좎젙?덉뒿?덈떎. +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_repair_finalize\\ -p:IntermediateOutputPath=obj\\verify_doc_repair_finalize\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|DeckRepairGuideServiceTests|DocxSkillTemplateFeaturesTests" -p:OutputPath=bin\\verify_doc_repair_finalize_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_repair_finalize_tests\\` ?듦낵 11 -업데이트: 2026-04-15 09:24 (KST) -- 에이전틱 루프의 queued command 소비 로직을 helper로 분리했습니다. [AgentQueuedCommandProjector.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentQueuedCommandProjector.cs)는 drain된 큐 배치를 `queued_input_interrupt`, `queue_notification`, `queue_resume`, `queued_prompt` 같은 대화 메시지와 thinking/user 이벤트로 투영합니다. [AgentLoopService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentLoopService.cs)는 이 결과를 적용하는 역할만 남겨 루프 본체의 책임을 더 줄였습니다. -- workbook/dashboard 품질 리뷰도 강화했습니다. [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)는 dashboard sheet가 있어도 KPI·trend·decision 내용이 부족하면 별도 이슈를 만들고, [ArtifactRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactRepairGuideService.cs)는 이를 `core story`가 보이도록 KPI/decision 블록을 추가하라는 가이드로 연결합니다. -- deck 품질 리뷰는 storyline 힌트까지 보기 시작했습니다. [DeckQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckQualityReviewService.cs)는 storyline에 `Options`, `Roadmap`, `Appendix`가 있는데 실제 슬라이드가 빠진 경우 별도 이슈를 만들고, [DeckRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckRepairGuideService.cs)는 이를 storyline 보강 액션으로 바꿉니다. -- 테스트는 [AgentQueuedCommandProjectorTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentQueuedCommandProjectorTests.cs), [DeckQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DeckQualityReviewServiceTests.cs), [ArtifactQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactQualityReviewServiceTests.cs), [ArtifactRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactRepairGuideServiceTests.cs), [DeckRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DeckRepairGuideServiceTests.cs)를 확장해 회귀를 고정했습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_loop_doc_finish2\\ -p:IntermediateOutputPath=obj\\verify_loop_doc_finish2\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentQueuedCommandProjectorTests|AgentCommandQueueTests|ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|DeckQualityReviewServiceTests|DeckRepairGuideServiceTests|PptxSkillGoldenDeckTests|ExcelSkillDashboardSummaryTests" -p:OutputPath=bin\\verify_loop_doc_finish2_tests\\ -p:IntermediateOutputPath=obj\\verify_loop_doc_finish2_tests\\` 통과 25 +?낅뜲?댄듃: 2026-04-15 09:24 (KST) +- ?먯씠?꾪떛 猷⑦봽??queued command ?뚮퉬 濡쒖쭅??helper濡?遺꾨━?덉뒿?덈떎. [AgentQueuedCommandProjector.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentQueuedCommandProjector.cs)??drain????諛곗튂瑜?`queued_input_interrupt`, `queue_notification`, `queue_resume`, `queued_prompt` 媛숈? ?€??硫붿떆吏€?€ thinking/user ?대깽?몃줈 ?ъ쁺?⑸땲?? [AgentLoopService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentLoopService.cs)????寃곌낵瑜??곸슜?섎뒗 ??븷留??④꺼 猷⑦봽 蹂몄껜??梨낆엫????以꾩??듬땲?? +- workbook/dashboard ?덉쭏 由щ럭??媛뺥솕?덉뒿?덈떎. [ArtifactQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactQualityReviewService.cs)??dashboard sheet媛€ ?덉뼱??KPI쨌trend쨌decision ?댁슜??遺€議깊븯硫?蹂꾨룄 ?댁뒋瑜?留뚮뱾怨? [ArtifactRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/ArtifactRepairGuideService.cs)???대? `core story`媛€ 蹂댁씠?꾨줉 KPI/decision 釉붾줉??異붽??섎씪??媛€?대뱶濡??곌껐?⑸땲?? +- deck ?덉쭏 由щ럭??storyline ?뚰듃源뚯? 蹂닿린 ?쒖옉?덉뒿?덈떎. [DeckQualityReviewService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckQualityReviewService.cs)??storyline??`Options`, `Roadmap`, `Appendix`媛€ ?덈뒗???ㅼ젣 ?щ씪?대뱶媛€ 鍮좎쭊 寃쎌슦 蹂꾨룄 ?댁뒋瑜?留뚮뱾怨? [DeckRepairGuideService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/DeckRepairGuideService.cs)???대? storyline 蹂닿컯 ?≪뀡?쇰줈 諛붽퓠?덈떎. +- ?뚯뒪?몃뒗 [AgentQueuedCommandProjectorTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentQueuedCommandProjectorTests.cs), [DeckQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DeckQualityReviewServiceTests.cs), [ArtifactQualityReviewServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactQualityReviewServiceTests.cs), [ArtifactRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ArtifactRepairGuideServiceTests.cs), [DeckRepairGuideServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DeckRepairGuideServiceTests.cs)瑜??뺤옣???뚭?瑜?怨좎젙?덉뒿?덈떎. +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_loop_doc_finish2\\ -p:IntermediateOutputPath=obj\\verify_loop_doc_finish2\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentQueuedCommandProjectorTests|AgentCommandQueueTests|ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|DeckQualityReviewServiceTests|DeckRepairGuideServiceTests|PptxSkillGoldenDeckTests|ExcelSkillDashboardSummaryTests" -p:OutputPath=bin\\verify_loop_doc_finish2_tests\\ -p:IntermediateOutputPath=obj\\verify_loop_doc_finish2_tests\\` ?듦낵 25 -업데이트: 2026-04-15 09:36 (KST) -- `tool_result` replacement state의 마지막 빈틈을 메웠습니다. [AgentMessageInvariantHelper.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentMessageInvariantHelper.cs)는 기존 `QueryPreviewContent`가 하나도 없는 경우에도 `tool_use_id`, `tool_name`, 축약된 `content/output/error`를 기반으로 synthetic preview를 생성합니다. 이로써 저장/재개/분기 이후 preview가 완전히 유실된 세션에서도 다시 query preview를 만들 수 있습니다. -- [AgentQueryContextBuilderTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentQueryContextBuilderTests.cs)와 새 [AgentMessageInvariantHelperTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentMessageInvariantHelperTests.cs)는 preview가 없는 tool_result가 synthetic preview로 복원되고, query view 생성 시에도 같은 preview가 실제 반영되는지 회귀 검증합니다. -- 문서 golden 회귀도 한 단계 더 올렸습니다. 새 [ExcelSkillGoldenWorkbookTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillGoldenWorkbookTests.cs)는 summary/dashboard/detail 구조와 formula, data validation, conditional formatting이 모두 포함된 운영 리뷰 workbook이 `Needs work: none`, `Repair guide: none`을 유지하는지 확인합니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_preview_golden_finish\\ -p:IntermediateOutputPath=obj\\verify_preview_golden_finish\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentMessageInvariantHelperTests|AgentQueryContextBuilderTests|AgentQueuedCommandProjectorTests|ExcelSkillGoldenWorkbookTests|ExcelSkillDashboardSummaryTests|PptxSkillGoldenDeckTests" -p:OutputPath=bin\\verify_preview_golden_finish_tests\\ -p:IntermediateOutputPath=obj\\verify_preview_golden_finish_tests\\` 통과 10 +?낅뜲?댄듃: 2026-04-15 09:36 (KST) +- `tool_result` replacement state??留덉?留?鍮덊땲??硫붿썱?듬땲?? [AgentMessageInvariantHelper.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentMessageInvariantHelper.cs)??湲곗〈 `QueryPreviewContent`媛€ ?섎굹???녿뒗 寃쎌슦?먮룄 `tool_use_id`, `tool_name`, 異뺤빟??`content/output/error`瑜?湲곕컲?쇰줈 synthetic preview瑜??앹꽦?⑸땲?? ?대줈???€???ш컻/遺꾧린 ?댄썑 preview媛€ ?꾩쟾???좎떎???몄뀡?먯꽌???ㅼ떆 query preview瑜?留뚮뱾 ???덉뒿?덈떎. +- [AgentQueryContextBuilderTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentQueryContextBuilderTests.cs)?€ ??[AgentMessageInvariantHelperTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentMessageInvariantHelperTests.cs)??preview媛€ ?녿뒗 tool_result媛€ synthetic preview濡?蹂듭썝?섍퀬, query view ?앹꽦 ?쒖뿉??媛숈? preview媛€ ?ㅼ젣 諛섏쁺?섎뒗吏€ ?뚭? 寃€利앺빀?덈떎. +- 臾몄꽌 golden ?뚭??????④퀎 ???щ졇?듬땲?? ??[ExcelSkillGoldenWorkbookTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ExcelSkillGoldenWorkbookTests.cs)??summary/dashboard/detail 援ъ“?€ formula, data validation, conditional formatting??紐⑤몢 ?ы븿???댁쁺 由щ럭 workbook??`Needs work: none`, `Repair guide: none`???좎??섎뒗吏€ ?뺤씤?⑸땲?? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_preview_golden_finish\\ -p:IntermediateOutputPath=obj\\verify_preview_golden_finish\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentMessageInvariantHelperTests|AgentQueryContextBuilderTests|AgentQueuedCommandProjectorTests|ExcelSkillGoldenWorkbookTests|ExcelSkillDashboardSummaryTests|PptxSkillGoldenDeckTests" -p:OutputPath=bin\\verify_preview_golden_finish_tests\\ -p:IntermediateOutputPath=obj\\verify_preview_golden_finish_tests\\` ?듦낵 10 -업데이트: 2026-04-15 09:20 (KST) -- 루프 진단 포맷을 분리했습니다. 새 [AgentLoopDiagnosticsFormatter.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentLoopDiagnosticsFormatter.cs)는 컨텍스트 압축 완료 이벤트와 query-view 요약 문자열을 전담하며, [AgentLoopService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentLoopService.cs)는 해당 formatter를 호출하는 orchestration 역할로 더 가벼워졌습니다. -- 저장/재개 경로의 legacy preview 복원도 보강했습니다. [ChatStorageService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/ChatStorageService.cs)는 복호화 직후 `PopulateMissingToolResultPreviews()`를 수행해 예전 저장본에서도 synthetic preview를 즉시 채웁니다. -- 테스트는 새 [AgentLoopDiagnosticsFormatterTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentLoopDiagnosticsFormatterTests.cs), [ChatStorageServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ChatStorageServiceTests.cs), [HtmlSkillGoldenReportTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/HtmlSkillGoldenReportTests.cs), [DocxSkillGoldenDocumentTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocxSkillGoldenDocumentTests.cs)를 추가해 루프 진단 문자열, legacy `.axchat` 복원, HTML/DOCX golden 품질을 회귀 고정했습니다. -- golden 범위는 이제 `PPTX + XLSX + HTML + DOCX`까지 확장되었습니다. HTML golden은 board-grade 보고서의 print frame/evidence/decision 구성을, DOCX golden은 template/TOC/header-footer/appendix가 포함된 business pack 조립을 기준 fixture로 삼습니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_loop_storage_golden\\ -p:IntermediateOutputPath=obj\\verify_loop_storage_golden\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentLoopDiagnosticsFormatterTests|ChatStorageServiceTests|HtmlSkillGoldenReportTests|DocxSkillGoldenDocumentTests|AgentMessageInvariantHelperTests|PptxSkillGoldenDeckTests|ExcelSkillGoldenWorkbookTests" -p:OutputPath=bin\\verify_loop_storage_golden_tests\\ -p:IntermediateOutputPath=obj\\verify_loop_storage_golden_tests\\` 통과 10 +?낅뜲?댄듃: 2026-04-15 09:20 (KST) +- 猷⑦봽 吏꾨떒 ?щ㎎??遺꾨━?덉뒿?덈떎. ??[AgentLoopDiagnosticsFormatter.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentLoopDiagnosticsFormatter.cs)??而⑦뀓?ㅽ듃 ?뺤텞 ?꾨즺 ?대깽?몄? query-view ?붿빟 臾몄옄?댁쓣 ?꾨떞?섎ʼn, [AgentLoopService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentLoopService.cs)???대떦 formatter瑜??몄텧?섎뒗 orchestration ??븷濡???媛€踰쇱썙議뚯뒿?덈떎. +- ?€???ш컻 寃쎈줈??legacy preview 蹂듭썝??蹂닿컯?덉뒿?덈떎. [ChatStorageService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/ChatStorageService.cs)??蹂듯샇??吏곹썑 `PopulateMissingToolResultPreviews()`瑜??섑뻾???덉쟾 ?€?λ낯?먯꽌??synthetic preview瑜?利됱떆 梨꾩썎?덈떎. +- ?뚯뒪?몃뒗 ??[AgentLoopDiagnosticsFormatterTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/AgentLoopDiagnosticsFormatterTests.cs), [ChatStorageServiceTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/ChatStorageServiceTests.cs), [HtmlSkillGoldenReportTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/HtmlSkillGoldenReportTests.cs), [DocxSkillGoldenDocumentTests.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot.Tests/Services/DocxSkillGoldenDocumentTests.cs)瑜?異붽???猷⑦봽 吏꾨떒 臾몄옄?? legacy `.axchat` 蹂듭썝, HTML/DOCX golden ?덉쭏???뚭? 怨좎젙?덉뒿?덈떎. +- golden 踰붿쐞???댁젣 `PPTX + XLSX + HTML + DOCX`源뚯? ?뺤옣?섏뿀?듬땲?? HTML golden?€ board-grade 蹂닿퀬?쒖쓽 print frame/evidence/decision 援ъ꽦?? DOCX golden?€ template/TOC/header-footer/appendix媛€ ?ы븿??business pack 議곕┰??湲곗? fixture濡??쇱뒿?덈떎. +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_loop_storage_golden\\ -p:IntermediateOutputPath=obj\\verify_loop_storage_golden\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentLoopDiagnosticsFormatterTests|ChatStorageServiceTests|HtmlSkillGoldenReportTests|DocxSkillGoldenDocumentTests|AgentMessageInvariantHelperTests|PptxSkillGoldenDeckTests|ExcelSkillGoldenWorkbookTests" -p:OutputPath=bin\\verify_loop_storage_golden_tests\\ -p:IntermediateOutputPath=obj\\verify_loop_storage_golden_tests\\` ?듦낵 10 -업데이트: 2026-04-15 09:49 (KST) -- `CodeLanguageCatalog`를 단순 표시용 카탈로그에서 실행 힌트 카탈로그로 확장했다. 언어별 `manifest/build/test/lint` 조회 메서드와 `BuildWorkflowSummary()`를 추가해, 지원 언어 목록과 no-LSP fallback 설명이 같은 소스에서 나오도록 정리했다. -- `WorkspaceContextGenerator`는 `.ax-context.md` 생성 시 `## Language Workflow` 섹션을 추가한다. 상위 언어 3개까지의 manifest, build/test/lint 힌트를 함께 기록해 장기 세션과 서브에이전트 문맥에서 바로 재사용할 수 있게 했다. -- 문서 품질 출력 포맷의 공통화를 시작했다. 새 `ArtifactQualityOutputFormatter`를 추가했고, 현재는 `HtmlSkill`, `ExcelSkill`이 동일한 quality summary + repair guide 조합기를 사용한다. 이후 DOCX/PPTX까지 같은 helper로 맞추는 기반이다. -- 테스트 보강: - - `CodeLanguageCatalogTests`: workflow summary, hint lookup 회귀 추가 - - `WorkspaceContextGeneratorTests`: generated context 내 `Language Workflow` 섹션 회귀 추가 -- 검증: +?낅뜲?댄듃: 2026-04-15 09:49 (KST) +- `CodeLanguageCatalog`瑜??⑥닚 ?쒖떆??移댄깉濡쒓렇?먯꽌 ?ㅽ뻾 ?뚰듃 移댄깉濡쒓렇濡??뺤옣?덈떎. ?몄뼱蹂?`manifest/build/test/lint` 議고쉶 硫붿꽌?쒖? `BuildWorkflowSummary()`瑜?異붽??? 吏€???몄뼱 紐⑸줉怨?no-LSP fallback ?ㅻ챸??媛숈? ?뚯뒪?먯꽌 ?섏삤?꾨줉 ?뺣━?덈떎. +- `WorkspaceContextGenerator`??`.ax-context.md` ?앹꽦 ??`## Language Workflow` ?뱀뀡??異붽??쒕떎. ?곸쐞 ?몄뼱 3媛쒓퉴吏€??manifest, build/test/lint ?뚰듃瑜??④퍡 湲곕줉???κ린 ?몄뀡怨??쒕툕?먯씠?꾪듃 臾몃㎘?먯꽌 諛붾줈 ?ъ궗?⑺븷 ???덇쾶 ?덈떎. +- 臾몄꽌 ?덉쭏 異쒕젰 ?щ㎎??怨듯넻?붾? ?쒖옉?덈떎. ??`ArtifactQualityOutputFormatter`瑜?異붽??덇퀬, ?꾩옱??`HtmlSkill`, `ExcelSkill`???숈씪??quality summary + repair guide 議고빀湲곕? ?ъ슜?쒕떎. ?댄썑 DOCX/PPTX源뚯? 媛숈? helper濡?留욎텛??湲곕컲?대떎. +- ?뚯뒪??蹂닿컯: + - `CodeLanguageCatalogTests`: workflow summary, hint lookup ?뚭? 異붽? + - `WorkspaceContextGeneratorTests`: generated context ??`Language Workflow` ?뱀뀡 ?뚭? 異붽? +- 寃€利? - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_language_workflow\\ -p:IntermediateOutputPath=obj\\verify_language_workflow\\` - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "CodeLanguageCatalogTests|WorkspaceContextGeneratorTests" -p:OutputPath=bin\\verify_language_workflow_tests\\ -p:IntermediateOutputPath=obj\\verify_language_workflow_tests\\` -업데이트: 2026-04-15 10:05 (KST) -- `AgentLoopRunLifecycle.cs` 추가: - - `BeginRun()`으로 run stopwatch, user query, iteration budget, retry budget 초기화 - - `BootstrapRunAsync()`로 intent 분류, exploration/path state, session learnings, task/execution policy 계산 분리 - - `FinalizeRun()`으로 run summary metric, exploration breadth, stats 기록, transient state reset 일원화 -- `AgentLoopService.RunAsync()` 정리: - - 시작부의 `run id/iteration budget/intent bootstrap` 블록을 helper 호출로 대체 - - 종료부의 run summary logging을 helper 호출로 대체 - - 종료 metric에 빈 run id가 남던 흐름을 수정해 실제 run id를 유지 -- `AgentMessageInvariantHelper` 고도화: - - persisted preview map과 fingerprint preview map을 분리 - - 같은 tool output이 다른 `tool_use_id`로 재등장할 때 preview를 현재 id로 재바인딩 - - preview 탐색 우선순위를 `저장된 preview → fingerprint 재바인딩 → synthetic` 순서로 고정 -- 문서 품질 출력 경로 정리: - - `ArtifactQualityOutputFormatter`를 `DocxSkill`, `PptxSkill`, `ExcelSkill` 멀티시트 반환 경로까지 연결 - - 포맷별 quality summary/repair guide 문자열 조립을 공통 helper로 통일 -- 테스트 보강: - - `AgentMessageInvariantHelperTests`: fingerprint 기반 preview 재바인딩 회귀 추가 - - 재검증 대상: `AgentCommandQueueTests`, `AgentQueuedCommandProjectorTests`, `AgentQueryContextBuilderTests`, `ChatStorageServiceTests`, `PptxSkillGoldenDeckTests`, `ExcelSkillGoldenWorkbookTests`, `DocxSkillGoldenDocumentTests`, `HtmlSkillGoldenReportTests` -- 검증: +?낅뜲?댄듃: 2026-04-15 10:05 (KST) +- `AgentLoopRunLifecycle.cs` 異붽?: + - `BeginRun()`?쇰줈 run stopwatch, user query, iteration budget, retry budget 珥덇린?? - `BootstrapRunAsync()`濡?intent 遺꾨쪟, exploration/path state, session learnings, task/execution policy 怨꾩궛 遺꾨━ + - `FinalizeRun()`?쇰줈 run summary metric, exploration breadth, stats 湲곕줉, transient state reset ?쇱썝??- `AgentLoopService.RunAsync()` ?뺣━: + - ?쒖옉遺€??`run id/iteration budget/intent bootstrap` 釉붾줉??helper ?몄텧濡??€泥? - 醫낅즺遺€??run summary logging??helper ?몄텧濡??€泥? - 醫낅즺 metric??鍮?run id媛€ ?⑤뜕 ?먮쫫???섏젙???ㅼ젣 run id瑜??좎? +- `AgentMessageInvariantHelper` 怨좊룄?? + - persisted preview map怨?fingerprint preview map??遺꾨━ + - 媛숈? tool output???ㅻⅨ `tool_use_id`濡??щ벑?ν븷 ??preview瑜??꾩옱 id濡??щ컮?몃뵫 + - preview ?먯깋 ?곗꽑?쒖쐞瑜?`?€?λ맂 preview ??fingerprint ?щ컮?몃뵫 ??synthetic` ?쒖꽌濡?怨좎젙 +- 臾몄꽌 ?덉쭏 異쒕젰 寃쎈줈 ?뺣━: + - `ArtifactQualityOutputFormatter`瑜?`DocxSkill`, `PptxSkill`, `ExcelSkill` 硫€?곗떆??諛섑솚 寃쎈줈源뚯? ?곌껐 + - ?щ㎎蹂?quality summary/repair guide 臾몄옄??議곕┰??怨듯넻 helper濡??듭씪 +- ?뚯뒪??蹂닿컯: + - `AgentMessageInvariantHelperTests`: fingerprint 湲곕컲 preview ?щ컮?몃뵫 ?뚭? 異붽? + - ?ш?利??€?? `AgentCommandQueueTests`, `AgentQueuedCommandProjectorTests`, `AgentQueryContextBuilderTests`, `ChatStorageServiceTests`, `PptxSkillGoldenDeckTests`, `ExcelSkillGoldenWorkbookTests`, `DocxSkillGoldenDocumentTests`, `HtmlSkillGoldenReportTests` +- 寃€利? - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_run_finalize\\ -p:IntermediateOutputPath=obj\\verify_run_finalize\\` - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentCommandQueueTests|AgentQueuedCommandProjectorTests|AgentMessageInvariantHelperTests|AgentQueryContextBuilderTests|ChatStorageServiceTests|PptxSkillGoldenDeckTests|ExcelSkillGoldenWorkbookTests|DocxSkillGoldenDocumentTests|HtmlSkillGoldenReportTests" -p:OutputPath=bin\\verify_run_finalize_tests2\\ -p:IntermediateOutputPath=obj\\verify_run_finalize_tests2\\` -업데이트: 2026-04-15 10:10 (KST) -- 통합 마감 계획 확정: - 1. `문서 포맷 최종 마감` - - 참조 대상: `기준 구조/src/query.ts`, `기준 구조/src/utils/toolResultStorage.ts`, `기준 구조/src/commands/init-verifiers.ts` - - AX 적용 위치: `PptxSkill.cs`, `DeckPlanningService.cs`, `DeckQualityReviewService.cs`, `DocxSkill.cs`, `DocumentAssemblerTool.cs`, `ExcelSkill.cs`, `HtmlSkill.cs`, `ArtifactQualityReviewService.cs`, `ArtifactRepairGuideService.cs` - - 완료 조건: PPTX/DOCX/XLSX/HTML 모두 `plan -> critic -> repair` 흐름과 golden fixture 확장 완료 - - 품질 판정 기준: strong fixture는 `Needs work: none`, weak fixture는 포맷별 적절한 repair guide를 반환 - 2. `에이전틱 루프 iteration pipeline 분리` - - 참조 대상: `기준 구조/src/QueryEngine.ts`, `기준 구조/src/query.ts`, `기준 구조/src/utils/messageQueueManager.ts` - - AX 적용 위치: `AgentLoopService.cs`, `AgentLoopRunLifecycle.cs`, `AgentQueuedCommandProjector.cs`, `AgentQueryContextBuilder.cs` - - 완료 조건: `RunAsync`의 bootstrap, query-view 생성, LLM 호출, tool dispatch, finalize를 더 작은 helper/service로 분리 - - 품질 판정 기준: 중단/재개/권한 승인/분기/장기 세션 replay 테스트 통과 - 3. `tool_result replacement state 장기 세션 고정` - - 참조 대상: `기준 구조/src/utils/toolResultStorage.ts` - - AX 적용 위치: `AgentMessageInvariantHelper.cs`, `AgentToolResultBudget.cs`, `ContextCondenser.cs`, `ChatStorageService.cs` - - 완료 조건: `tool_use_id` 변경, compact 이후, branch/replay 상황에서도 preview와 replacement 정책이 안정 유지 - - 품질 판정 기준: replay/branch 저장본에서 preview 흔들림 0건 - 4. `개발언어 no-LSP fallback 심화` - - 참조 대상: `기준 구조/src/query.ts`, `기준 구조/src/context.ts` - - AX 적용 위치: `CodeLanguageCatalog.cs`, `LspTool.cs`, `WorkspaceContextGenerator.cs`, `ChatWindow.SystemPromptBuilder.cs`, `SettingsWindow.xaml` - - 완료 조건: 언어별 `manifest/build/test/lint` 힌트가 실제 fallback 분석과 워크스페이스 컨텍스트에 더 깊게 연결 - - 품질 판정 기준: 로컬 LSP 없는 저장소에서도 Auto 모드가 기본 실행 흐름과 영향 범위를 안정적으로 안내 - 5. `명령/스킬 합성 및 릴리즈 게이트` - - 참조 대상: `기준 구조/src/commands.ts`, `기준 구조/src/skills/loadSkillsDir.ts` - - AX 적용 위치: `SlashCommandCatalog.cs`, `SkillService.cs`, `README.md`, `docs/DEVELOPMENT.md`, `docs/NEXT_ROADMAP.md` - - 완료 조건: builtin/skill/plugin/workflow 토큰 충돌의 노출/실행 우선순위 완전 일치, 릴리즈 체크리스트 최신화 - - 품질 판정 기준: 같은 토큰 충돌 시 팔레트 표시와 실제 실행이 완전 일치하고, 릴리즈 전 수동 확인 항목 최소화 -- 최종 게이트: - - `dotnet build` 경고 0 / 오류 0 - - 문서 golden: `PPTX/XLSX/DOCX/HTML` - - 루프/큐/컨텍스트: `중단/재개/권한/branch/replay` - - 언어 fallback: `CodeLanguageCatalogTests`, `WorkspaceContextGeneratorTests`, 관련 fallback 회귀 +?낅뜲?댄듃: 2026-04-15 10:10 (KST) +- ?듯빀 留덇컧 怨꾪쉷 ?뺤젙: + 1. `臾몄꽌 ?щ㎎ 理쒖쥌 留덇컧` + - 李몄“ ?€?? `湲곗? 援ъ“/src/query.ts`, `湲곗? 援ъ“/src/utils/toolResultStorage.ts`, `湲곗? 援ъ“/src/commands/init-verifiers.ts` + - AX ?곸슜 ?꾩튂: `PptxSkill.cs`, `DeckPlanningService.cs`, `DeckQualityReviewService.cs`, `DocxSkill.cs`, `DocumentAssemblerTool.cs`, `ExcelSkill.cs`, `HtmlSkill.cs`, `ArtifactQualityReviewService.cs`, `ArtifactRepairGuideService.cs` + - ?꾨즺 議곌굔: PPTX/DOCX/XLSX/HTML 紐⑤몢 `plan -> critic -> repair` ?먮쫫怨?golden fixture ?뺤옣 ?꾨즺 + - ?덉쭏 ?먯젙 湲곗?: strong fixture??`Needs work: none`, weak fixture???щ㎎蹂??곸젅??repair guide瑜?諛섑솚 + 2. `?먯씠?꾪떛 猷⑦봽 iteration pipeline 遺꾨━` + - 李몄“ ?€?? `湲곗? 援ъ“/src/QueryEngine.ts`, `湲곗? 援ъ“/src/query.ts`, `湲곗? 援ъ“/src/utils/messageQueueManager.ts` + - AX ?곸슜 ?꾩튂: `AgentLoopService.cs`, `AgentLoopRunLifecycle.cs`, `AgentQueuedCommandProjector.cs`, `AgentQueryContextBuilder.cs` + - ?꾨즺 議곌굔: `RunAsync`??bootstrap, query-view ?앹꽦, LLM ?몄텧, tool dispatch, finalize瑜????묒? helper/service濡?遺꾨━ + - ?덉쭏 ?먯젙 湲곗?: 以묐떒/?ш컻/沅뚰븳 ?뱀씤/遺꾧린/?κ린 ?몄뀡 replay ?뚯뒪???듦낵 + 3. `tool_result replacement state ?κ린 ?몄뀡 怨좎젙` + - 李몄“ ?€?? `湲곗? 援ъ“/src/utils/toolResultStorage.ts` + - AX ?곸슜 ?꾩튂: `AgentMessageInvariantHelper.cs`, `AgentToolResultBudget.cs`, `ContextCondenser.cs`, `ChatStorageService.cs` + - ?꾨즺 議곌굔: `tool_use_id` 蹂€寃? compact ?댄썑, branch/replay ?곹솴?먯꽌??preview?€ replacement ?뺤콉???덉젙 ?좎? + - ?덉쭏 ?먯젙 湲곗?: replay/branch ?€?λ낯?먯꽌 preview ?붾뱾由?0嫄? 4. `媛쒕컻?몄뼱 no-LSP fallback ?ы솕` + - 李몄“ ?€?? `湲곗? 援ъ“/src/query.ts`, `湲곗? 援ъ“/src/context.ts` + - AX ?곸슜 ?꾩튂: `CodeLanguageCatalog.cs`, `LspTool.cs`, `WorkspaceContextGenerator.cs`, `ChatWindow.SystemPromptBuilder.cs`, `SettingsWindow.xaml` + - ?꾨즺 議곌굔: ?몄뼱蹂?`manifest/build/test/lint` ?뚰듃媛€ ?ㅼ젣 fallback 遺꾩꽍怨??뚰겕?ㅽ럹?댁뒪 而⑦뀓?ㅽ듃????源딄쾶 ?곌껐 + - ?덉쭏 ?먯젙 湲곗?: 濡쒖뺄 LSP ?녿뒗 ?€?μ냼?먯꽌??Auto 紐⑤뱶媛€ 湲곕낯 ?ㅽ뻾 ?먮쫫怨??곹뼢 踰붿쐞瑜??덉젙?곸쑝濡??덈궡 + 5. `紐낅졊/?ㅽ궗 ?⑹꽦 諛?由대━利?寃뚯씠?? + - 李몄“ ?€?? `湲곗? 援ъ“/src/commands.ts`, `湲곗? 援ъ“/src/skills/loadSkillsDir.ts` + - AX ?곸슜 ?꾩튂: `SlashCommandCatalog.cs`, `SkillService.cs`, `README.md`, `docs/DEVELOPMENT.md`, `docs/NEXT_ROADMAP.md` + - ?꾨즺 議곌굔: builtin/skill/plugin/workflow ?좏겙 異⑸룎???몄텧/?ㅽ뻾 ?곗꽑?쒖쐞 ?꾩쟾 ?쇱튂, 由대━利?泥댄겕由ъ뒪??理쒖떊?? - ?덉쭏 ?먯젙 湲곗?: 媛숈? ?좏겙 異⑸룎 ???붾젅???쒖떆?€ ?ㅼ젣 ?ㅽ뻾???꾩쟾 ?쇱튂?섍퀬, 由대━利????섎룞 ?뺤씤 ??ぉ 理쒖냼??- 理쒖쥌 寃뚯씠?? + - `dotnet build` 寃쎄퀬 0 / ?ㅻ쪟 0 + - 臾몄꽌 golden: `PPTX/XLSX/DOCX/HTML` + - 猷⑦봽/??而⑦뀓?ㅽ듃: `以묐떒/?ш컻/沅뚰븳/branch/replay` + - ?몄뼱 fallback: `CodeLanguageCatalogTests`, `WorkspaceContextGeneratorTests`, 愿€??fallback ?뚭? -업데이트: 2026-04-15 10:24 (KST) -- 문서 critic 세부화: +?낅뜲?댄듃: 2026-04-15 10:24 (KST) +- 臾몄꽌 critic ?몃??? - `ArtifactQualityReviewService.cs` - - HTML: `board_report`는 `decision_summary` 누락 시 별도 경고, `strategy_brief`는 explicit decision block 누락 시 별도 경고 - - HTML 품질 계산 시 `h2`만이 아니라 `board_report`, `strategy_brief`, `comparison`, `roadmap`, `decision_summary`, `evidence_cards`, `kpi`를 `major section`/`supporting block` 추정에 반영 - - DOCX: 장문 비즈니스 문서에서 evidence table, callout/highlight 부족을 별도 이슈로 판정 - - XLSX: dashboard workbook의 `trend_series`, `variance_series`, `sheet_summaries`, `dashboard_tiles` 부재를 각각 추가 진단 -- 보정 가이드 강화: + - HTML: `board_report`??`decision_summary` ?꾨씫 ??蹂꾨룄 寃쎄퀬, `strategy_brief`??explicit decision block ?꾨씫 ??蹂꾨룄 寃쎄퀬 + - HTML ?덉쭏 怨꾩궛 ??`h2`留뚯씠 ?꾨땲??`board_report`, `strategy_brief`, `comparison`, `roadmap`, `decision_summary`, `evidence_cards`, `kpi`瑜?`major section`/`supporting block` 異붿젙??諛섏쁺 + - DOCX: ?λЦ 鍮꾩쫰?덉뒪 臾몄꽌?먯꽌 evidence table, callout/highlight 遺€議깆쓣 蹂꾨룄 ?댁뒋濡??먯젙 + - XLSX: dashboard workbook??`trend_series`, `variance_series`, `sheet_summaries`, `dashboard_tiles` 遺€?щ? 媛곴컖 異붽? 吏꾨떒 +- 蹂댁젙 媛€?대뱶 媛뺥솕: - `ArtifactRepairGuideService.cs` - - HTML: board decision summary, strategy brief decision block, comparison/roadmap, evidence-card 보강 가이드 추가 - - DOCX: evidence table, callout/highlight 보강 가이드 추가 - - XLSX: trend/variance framing, supporting sheet summary, headline tile, follow-up action 보강 가이드 추가 + - HTML: board decision summary, strategy brief decision block, comparison/roadmap, evidence-card 蹂닿컯 媛€?대뱶 異붽? + - DOCX: evidence table, callout/highlight 蹂닿컯 媛€?대뱶 異붽? + - XLSX: trend/variance framing, supporting sheet summary, headline tile, follow-up action 蹂닿컯 媛€?대뱶 異붽? - `DeckRepairGuideService.cs` - - Executive Summary의 decision ask, recommendation slide의 rationale/next steps 누락을 별도 액션으로 변환 -- Workbook review 입력 확장: - - `WorkbookReviewInput`에 `HasTrendSection`, `HasVarianceSection`, `HasDashboardTileSection` 추가 - - `ExcelSkill.cs`의 single-summary/multi-sheet review 경로가 위 신호를 실제 review에 전달 -- Deck 품질 기준 강화: + - Executive Summary??decision ask, recommendation slide??rationale/next steps ?꾨씫??蹂꾨룄 ?≪뀡?쇰줈 蹂€??- Workbook review ?낅젰 ?뺤옣: + - `WorkbookReviewInput`??`HasTrendSection`, `HasVarianceSection`, `HasDashboardTileSection` 異붽? + - `ExcelSkill.cs`??single-summary/multi-sheet review 寃쎈줈媛€ ???좏샇瑜??ㅼ젣 review???꾨떖 +- Deck ?덉쭏 湲곗? 媛뺥솕: - `DeckQualityReviewService.cs` - - Executive Summary 내 recommendation/decision ask 누락 감지 - - Recommendation slide의 rationale/next steps 누락 감지 - - Roadmap slide가 1개 phase만 가진 경우 경고 -- Golden/회귀 테스트 확장: - - `HtmlSkillGoldenReportTests.cs`: `strategy-golden.html` 추가 - - `PptxSkillGoldenDeckTests.cs`: `pmo-golden.pptx` 추가 - - `ArtifactQualityReviewServiceTests.cs`, `ArtifactRepairGuideServiceTests.cs`, `DeckQualityReviewServiceTests.cs`, `DeckRepairGuideServiceTests.cs` 회귀 확장 -- 검증: + - Executive Summary ??recommendation/decision ask ?꾨씫 媛먯? + - Recommendation slide??rationale/next steps ?꾨씫 媛먯? + - Roadmap slide媛€ 1媛?phase留?媛€吏?寃쎌슦 寃쎄퀬 +- Golden/?뚭? ?뚯뒪???뺤옣: + - `HtmlSkillGoldenReportTests.cs`: `strategy-golden.html` 異붽? + - `PptxSkillGoldenDeckTests.cs`: `pmo-golden.pptx` 異붽? + - `ArtifactQualityReviewServiceTests.cs`, `ArtifactRepairGuideServiceTests.cs`, `DeckQualityReviewServiceTests.cs`, `DeckRepairGuideServiceTests.cs` ?뚭? ?뺤옣 +- 寃€利? - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_finish_batch\\ -p:IntermediateOutputPath=obj\\verify_doc_finish_batch\\` - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|DeckQualityReviewServiceTests|DeckRepairGuideServiceTests|HtmlSkillGoldenReportTests|PptxSkillGoldenDeckTests|DocxSkillGoldenDocumentTests|ExcelSkillGoldenWorkbookTests" -p:OutputPath=bin\\verify_doc_finish_batch_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_finish_batch_tests\\` -업데이트: 2026-04-15 10:50 (KST) -- 개발언어 fallback 심화: +?낅뜲?댄듃: 2026-04-15 10:50 (KST) +- 媛쒕컻?몄뼱 fallback ?ы솕: - `CodeLanguageCatalog.cs` - - 파일을 UTF-8 기준으로 재정리하고 중복 `BuildFallbackSupportDescription()`을 제거 - - `BuildWorkspaceWorkflowSummaries()` 추가 - - 키, quick select key, 확장자, 파일 경로를 모두 받아 capability로 정규화하는 `ResolveCapabilityFromKeyOrExtension()` 추가 + - ?뚯씪??UTF-8 湲곗??쇰줈 ?ъ젙由ы븯怨?以묐났 `BuildFallbackSupportDescription()`???쒓굅 + - `BuildWorkspaceWorkflowSummaries()` 異붽? + - ?? quick select key, ?뺤옣?? ?뚯씪 寃쎈줈瑜?紐⑤몢 諛쏆븘 capability濡??뺢퇋?뷀븯??`ResolveCapabilityFromKeyOrExtension()` 異붽? - `WorkspaceContextGenerator.cs` - - `DetectLanguageWorkflowHints()` 추가 - - `.ax-context.md`의 `Language Workflow` 생성이 카탈로그 공용 API를 사용하도록 정리 + - `DetectLanguageWorkflowHints()` 異붽? + - `.ax-context.md`??`Language Workflow` ?앹꽦??移댄깉濡쒓렇 怨듭슜 API瑜??ъ슜?섎룄濡??뺣━ - `ChatWindow.SystemPromptBuilder.cs` - - 코드 시스템 프롬프트에 `## Repository Language Workflow` 섹션 주입 - - no-LSP 저장소에서도 실제 manifest/build/test/lint 힌트를 prompt 안에서 직접 활용 -- 에이전틱 루프 분리: - - 새 `AgentLoopLlmRequestPreparationService.cs` - - 초기 tool-call 강제 여부 계산 - - pre-call tool reminder 삽입 여부 계산 - - 실제 LLM 전송용 `sendMessages` 배열 조립 + - 肄붾뱶 ?쒖뒪???꾨\?꾪듃??`## Repository Language Workflow` ?뱀뀡 二쇱엯 + - no-LSP ?€?μ냼?먯꽌???ㅼ젣 manifest/build/test/lint ?뚰듃瑜?prompt ?덉뿉??吏곸젒 ?쒖슜 +- ?먯씠?꾪떛 猷⑦봽 遺꾨━: + - ??`AgentLoopLlmRequestPreparationService.cs` + - 珥덇린 tool-call 媛뺤젣 ?щ? 怨꾩궛 + - pre-call tool reminder ?쎌엯 ?щ? 怨꾩궛 + - ?ㅼ젣 LLM ?꾩넚??`sendMessages` 諛곗뿴 議곕┰ - `AgentLoopService.cs` - - LLM 요청 전 메시지 조립 책임을 helper 호출로 대체해 orchestration 집중도 향상 -- 테스트 보강: - - 새 `AgentLoopLlmRequestPreparationServiceTests.cs` - - `CodeLanguageCatalogTests.cs`: fallback summary, workflow summary, workspace workflow dedupe/우선순위 검증 - - `WorkspaceContextGeneratorTests.cs`: preferred language 우선 `Language Workflow` 힌트 검증 -- 검증: - - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_final_batch\\ -p:IntermediateOutputPath=obj\\verify_final_batch\\` 경고 0 / 오류 0 - - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "CodeLanguageCatalogTests|WorkspaceContextGeneratorTests|AgentLoopLlmRequestPreparationServiceTests|AgentLoopIterationPreparationServiceTests|AgentMessageInvariantHelperTests|AgentToolResultBudgetTests|ChatStorageServiceTests|HtmlSkillGoldenReportTests|PptxSkillGoldenDeckTests|DocxSkillGoldenDocumentTests|ExcelSkillGoldenWorkbookTests" -p:OutputPath=bin\\verify_final_batch_tests\\ -p:IntermediateOutputPath=obj\\verify_final_batch_tests\\` 통과 54 + - LLM ?붿껌 ??硫붿떆吏€ 議곕┰ 梨낆엫??helper ?몄텧濡??€泥댄빐 orchestration 吏묒쨷???μ긽 +- ?뚯뒪??蹂닿컯: + - ??`AgentLoopLlmRequestPreparationServiceTests.cs` + - `CodeLanguageCatalogTests.cs`: fallback summary, workflow summary, workspace workflow dedupe/?곗꽑?쒖쐞 寃€利? - `WorkspaceContextGeneratorTests.cs`: preferred language ?곗꽑 `Language Workflow` ?뚰듃 寃€利?- 寃€利? + - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_final_batch\\ -p:IntermediateOutputPath=obj\\verify_final_batch\\` 寃쎄퀬 0 / ?ㅻ쪟 0 + - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "CodeLanguageCatalogTests|WorkspaceContextGeneratorTests|AgentLoopLlmRequestPreparationServiceTests|AgentLoopIterationPreparationServiceTests|AgentMessageInvariantHelperTests|AgentToolResultBudgetTests|ChatStorageServiceTests|HtmlSkillGoldenReportTests|PptxSkillGoldenDeckTests|DocxSkillGoldenDocumentTests|ExcelSkillGoldenWorkbookTests" -p:OutputPath=bin\\verify_final_batch_tests\\ -p:IntermediateOutputPath=obj\\verify_final_batch_tests\\` ?듦낵 54 -업데이트: 2026-04-15 11:17 (KST) -- SQL 전용 fallback 분석 추가: - - 새 `SqlDialectDetector.cs` - - PostgreSQL / MySQL / SQL Server / SQLite / Oracle 방언 휴리스틱 감지 - - 새 `SqlAnalysisService.cs` - - statement kind 분류: `CREATE TABLE`, `ALTER TABLE`, `DROP TABLE`, `TRUNCATE TABLE`, `CREATE INDEX`, `CREATE VIEW`, `CREATE FUNCTION`, `CREATE PROCEDURE`, `INSERT`, `UPDATE`, `DELETE`, `MERGE`, `SELECT` - - object 추출: table/view/update/insert/delete/from/join 기반 상위 object 수집 - - 위험 감지: `DROP`, `TRUNCATE`, `ALTER TABLE DROP COLUMN`, `DELETE/UPDATE without WHERE`, `SELECT *`, transaction boundary 부재 - - SQL 전용 fallback summary 생성 -- 개발언어 카탈로그 확장: +?낅뜲?댄듃: 2026-04-15 11:17 (KST) +- SQL ?꾩슜 fallback 遺꾩꽍 異붽?: + - ??`SqlDialectDetector.cs` + - PostgreSQL / MySQL / SQL Server / SQLite / Oracle 諛⑹뼵 ?대━?ㅽ떛 媛먯? + - ??`SqlAnalysisService.cs` + - statement kind 遺꾨쪟: `CREATE TABLE`, `ALTER TABLE`, `DROP TABLE`, `TRUNCATE TABLE`, `CREATE INDEX`, `CREATE VIEW`, `CREATE FUNCTION`, `CREATE PROCEDURE`, `INSERT`, `UPDATE`, `DELETE`, `MERGE`, `SELECT` + - object 異붿텧: table/view/update/insert/delete/from/join 湲곕컲 ?곸쐞 object ?섏쭛 + - ?꾪뿕 媛먯?: `DROP`, `TRUNCATE`, `ALTER TABLE DROP COLUMN`, `DELETE/UPDATE without WHERE`, `SELECT *`, transaction boundary 遺€?? - SQL ?꾩슜 fallback summary ?앹꽦 +- 媛쒕컻?몄뼱 移댄깉濡쒓렇 ?뺤옣: - `CodeLanguageCatalog.cs` - - SQL manifest 힌트: `migrations/*.sql`, `schema.sql`, `seed.sql`, `*.sqlproj` - - SQL build/test/lint 힌트 강화 - - `BuildWorkflowSummary()`에 SQL 전용 `dialect/statement/risk/object dependency` 분석 요약 추가 - - `BuildFallbackSummary()`에서 SQL은 일반 fallback 대신 `SqlAnalysisService.BuildFallbackSummary()`를 사용 -- PPT/HTML 고도화: + - SQL manifest ?뚰듃: `migrations/*.sql`, `schema.sql`, `seed.sql`, `*.sqlproj` + - SQL build/test/lint ?뚰듃 媛뺥솕 + - `BuildWorkflowSummary()`??SQL ?꾩슜 `dialect/statement/risk/object dependency` 遺꾩꽍 ?붿빟 異붽? + - `BuildFallbackSummary()`?먯꽌 SQL?€ ?쇰컲 fallback ?€??`SqlAnalysisService.BuildFallbackSummary()`瑜??ъ슜 +- PPT/HTML 怨좊룄?? - `DeckPlanningService.cs` - - 구조화된 `content` 슬라이드를 입력 데이터에 따라 `kpi_dashboard`, `comparison`, `roadmap`, `chart`로 자동 승격 + - 援ъ“?붾맂 `content` ?щ씪?대뱶瑜??낅젰 ?곗씠?곗뿉 ?곕씪 `kpi_dashboard`, `comparison`, `roadmap`, `chart`濡??먮룞 ?밴꺽 - `DeckQualityReviewService.cs` - - Executive Summary의 정량 근거 부족, comparison verdict 부재, roadmap owner/timeline 부족, KPI dashboard metric/takeaway 부족 진단 추가 + - Executive Summary???뺣웾 洹쇨굅 遺€議? comparison verdict 遺€?? roadmap owner/timeline 遺€議? KPI dashboard metric/takeaway 遺€議?吏꾨떒 異붽? - `DeckRepairGuideService.cs` - - 위 PPT 진단 항목을 실제 보정 액션으로 매핑 + - ??PPT 吏꾨떒 ??ぉ???ㅼ젣 蹂댁젙 ?≪뀡?쇰줈 留ㅽ븨 - `HtmlSkill.cs` - - 새 `kpi_panel` 섹션 타입 추가 + - ??`kpi_panel` ?뱀뀡 ?€??異붽? - `ArtifactQualityReviewService.cs` - - KPI panel을 major/supporting block 판단에 반영 - - board/strategy 문서에서 KPI/evidence/decision 연결 부족 이슈 추가 + - KPI panel??major/supporting block ?먮떒??諛섏쁺 + - board/strategy 臾몄꽌?먯꽌 KPI/evidence/decision ?곌껐 遺€議??댁뒋 異붽? - `ArtifactRepairGuideService.cs` - - KPI panel/metric strip, evidence support, decision/next-step 연결 보정 가이드 추가 -- 테스트: - - 새 `SqlDialectDetectorTests.cs` - - 새 `SqlAnalysisServiceTests.cs` + - KPI panel/metric strip, evidence support, decision/next-step ?곌껐 蹂댁젙 媛€?대뱶 異붽? +- ?뚯뒪?? + - ??`SqlDialectDetectorTests.cs` + - ??`SqlAnalysisServiceTests.cs` - `CodeLanguageCatalogTests.cs` - `DeckPlanningServiceTests.cs` - `ArtifactQualityReviewServiceTests.cs` - `ArtifactRepairGuideServiceTests.cs` - `HtmlSkillConsultingSectionsTests.cs` -- 검증: - - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_sql_doc_batch\\ -p:IntermediateOutputPath=obj\\verify_sql_doc_batch\\` 경고 0 / 오류 0 - - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "SqlDialectDetectorTests|SqlAnalysisServiceTests|CodeLanguageCatalogTests|DeckPlanningServiceTests|DeckQualityReviewServiceTests|ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|HtmlSkillConsultingSectionsTests|HtmlSkillGoldenReportTests|PptxSkillGoldenDeckTests" -p:OutputPath=bin\\verify_sql_doc_batch_tests\\ -p:IntermediateOutputPath=obj\\verify_sql_doc_batch_tests\\` 통과 47 +- 寃€利? + - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_sql_doc_batch\\ -p:IntermediateOutputPath=obj\\verify_sql_doc_batch\\` 寃쎄퀬 0 / ?ㅻ쪟 0 + - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "SqlDialectDetectorTests|SqlAnalysisServiceTests|CodeLanguageCatalogTests|DeckPlanningServiceTests|DeckQualityReviewServiceTests|ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|HtmlSkillConsultingSectionsTests|HtmlSkillGoldenReportTests|PptxSkillGoldenDeckTests" -p:OutputPath=bin\\verify_sql_doc_batch_tests\\ -p:IntermediateOutputPath=obj\\verify_sql_doc_batch_tests\\` ?듦낵 47 -업데이트: 2026-04-15 11:36 (KST) +?낅뜲?댄듃: 2026-04-15 11:36 (KST) -### SQL fallback 분석 심화 +### SQL fallback 遺꾩꽍 ?ы솕 - `SqlAnalysisService.cs` - - `SqlAnalysisReport`에 `ScriptIntent`, `Dependencies`, `ReviewNotes`를 추가했습니다. - - `Analyze()`가 dialect/statement/risk/object 외에 `schema migration`, `schema change`, `seed / reference data`, `query / reporting` intent를 계산합니다. - - dependency 감지는 script가 직접 생성/수정하는 owned object와 참조 dependency를 분리해, view/reporting query가 의존하는 테이블과 lookup source를 별도로 잡습니다. - - review note는 rollback, dependency impact, transaction scope, dialect-specific validation 포인트를 함께 생성합니다. - - fallback summary는 `script`, `dependencies`, `review focus`까지 포함하도록 확장했습니다. + - `SqlAnalysisReport`??`ScriptIntent`, `Dependencies`, `ReviewNotes`瑜?異붽??덉뒿?덈떎. + - `Analyze()`媛€ dialect/statement/risk/object ?몄뿉 `schema migration`, `schema change`, `seed / reference data`, `query / reporting` intent瑜?怨꾩궛?⑸땲?? + - dependency 媛먯???script媛€ 吏곸젒 ?앹꽦/?섏젙?섎뒗 owned object?€ 李몄“ dependency瑜?遺꾨━?? view/reporting query媛€ ?섏〈?섎뒗 ?뚯씠釉붽낵 lookup source瑜?蹂꾨룄濡??≪뒿?덈떎. + - review note??rollback, dependency impact, transaction scope, dialect-specific validation ?ъ씤?몃? ?④퍡 ?앹꽦?⑸땲?? + - fallback summary??`script`, `dependencies`, `review focus`源뚯? ?ы븿?섎룄濡??뺤옣?덉뒿?덈떎. - `CodeLanguageCatalog.cs` - - SQL workflow summary를 `dialect/statement/risk/object dependency` 수준에서 `script intent/migration order/dependency`까지 보이도록 강화했습니다. + - SQL workflow summary瑜?`dialect/statement/risk/object dependency` ?섏??먯꽌 `script intent/migration order/dependency`源뚯? 蹂댁씠?꾨줉 媛뺥솕?덉뒿?덈떎. - `WorkspaceContextGenerator.cs` - - SQL 저장소에서 `## SQL Review Focus` 섹션을 생성하도록 확장했습니다. - - migration/seed/reporting query 분류, destructive DDL·broad DML·transaction scope·rollback 점검을 문맥에 직접 넣습니다. + - SQL ?€?μ냼?먯꽌 `## SQL Review Focus` ?뱀뀡???앹꽦?섎룄濡??뺤옣?덉뒿?덈떎. + - migration/seed/reporting query 遺꾨쪟, destructive DDL쨌broad DML쨌transaction scope쨌rollback ?먭???臾몃㎘??吏곸젒 ?l뒿?덈떎. -### HTML 의사결정형 문서 강화 +### HTML ?섏궗寃곗젙??臾몄꽌 媛뺥솕 - `HtmlSkill.cs` - - 새 섹션 타입 `decision_matrix`, `metric_strip`를 추가했습니다. - - `decision_matrix`는 option/criteria/verdict/notes를 한 표로 렌더링합니다. - - `metric_strip`은 KPI headline, trend, note를 가로 카드형 요약으로 렌더링합니다. + - ???뱀뀡 ?€??`decision_matrix`, `metric_strip`瑜?異붽??덉뒿?덈떎. + - `decision_matrix`??option/criteria/verdict/notes瑜????쒕줈 ?뚮뜑留곹빀?덈떎. + - `metric_strip`?€ KPI headline, trend, note瑜?媛€濡?移대뱶???붿빟?쇰줈 ?뚮뜑留곹빀?덈떎. - `ArtifactQualityReviewService.cs` - - HTML 품질 평가에 `decision_matrix`, `metric_strip` 존재를 반영합니다. - - board report에서 comparison/decision matrix 부재, strategy brief에서 trade-off matrix 부재, metric strip이 recommendation과 연결되지 않는 경우를 별도 이슈로 판정합니다. + - HTML ?덉쭏 ?됯???`decision_matrix`, `metric_strip` 議댁옱瑜?諛섏쁺?⑸땲?? + - board report?먯꽌 comparison/decision matrix 遺€?? strategy brief?먯꽌 trade-off matrix 遺€?? metric strip??recommendation怨??곌껐?섏? ?딅뒗 寃쎌슦瑜?蹂꾨룄 ?댁뒋濡??먯젙?⑸땲?? - `ArtifactRepairGuideService.cs` - - decision matrix 추가, comparison/decision block 보강, metric strip을 recommendation/board summary와 연결하는 수리 가이드를 추가했습니다. - - HTML repair action 상한을 4개로 넓혀 품질 피드백 손실을 줄였습니다. + - decision matrix 異붽?, comparison/decision block 蹂닿컯, metric strip??recommendation/board summary?€ ?곌껐?섎뒗 ?섎━ 媛€?대뱶瑜?異붽??덉뒿?덈떎. + - HTML repair action ?곹븳??4媛쒕줈 ?볧? ?덉쭏 ?쇰뱶諛??먯떎??以꾩??듬땲?? -### PPT 슬라이드 품질 critic 세분화 -- `DeckQualityReviewService.cs` - - Executive Summary의 headline 선명도 부족을 더 엄격히 감지합니다. - - Comparison slide의 trade-off 설명 부족, roadmap phase milestone 부족, chart takeaway 부재, KPI dashboard trend/note context 부족을 별도 경고로 판정합니다. - - executive/recommendation/comparison(or chart)/roadmap가 갖춰진 deck에 `decision-ready consulting storyline` 강점 신호를 추가했습니다. +### PPT ?щ씪?대뱶 ?덉쭏 critic ?몃텇??- `DeckQualityReviewService.cs` + - Executive Summary??headline ?좊챸??遺€議깆쓣 ???꾧꺽??媛먯??⑸땲?? + - Comparison slide??trade-off ?ㅻ챸 遺€議? roadmap phase milestone 遺€議? chart takeaway 遺€?? KPI dashboard trend/note context 遺€議깆쓣 蹂꾨룄 寃쎄퀬濡??먯젙?⑸땲?? + - executive/recommendation/comparison(or chart)/roadmap媛€ 媛뽰떠吏?deck??`decision-ready consulting storyline` 媛뺤젏 ?좏샇瑜?異붽??덉뒿?덈떎. - `DeckRepairGuideService.cs` - - 위 추가 이슈를 각각 headline 압축, trade-off 보강, phase milestone 명시, chart takeaway 추가, KPI trend/note 보강 액션으로 변환합니다. + - ??異붽? ?댁뒋瑜?媛곴컖 headline ?뺤텞, trade-off 蹂닿컯, phase milestone 紐낆떆, chart takeaway 異붽?, KPI trend/note 蹂닿컯 ?≪뀡?쇰줈 蹂€?섑빀?덈떎. -### 테스트 -- `SqlAnalysisServiceTests.cs` - - migration intent/dependency/rollback note 검증 추가 - - seed/reference data intent, transaction risk, lookup dependency 검증 추가 +### ?뚯뒪??- `SqlAnalysisServiceTests.cs` + - migration intent/dependency/rollback note 寃€利?異붽? + - seed/reference data intent, transaction risk, lookup dependency 寃€利?異붽? - `CodeLanguageCatalogTests.cs` - - SQL workflow summary에 `migration order`, `dependencies`가 포함되는지 검증 -- `WorkspaceContextGeneratorTests.cs` - - SQL 저장소에서 `## SQL Review Focus` 섹션 생성 검증 -- `HtmlSkillConsultingSectionsTests.cs` - - `decision_matrix`, `metric_strip` 렌더링 회귀 추가 + - SQL workflow summary??`migration order`, `dependencies`媛€ ?ы븿?섎뒗吏€ 寃€利?- `WorkspaceContextGeneratorTests.cs` + - SQL ?€?μ냼?먯꽌 `## SQL Review Focus` ?뱀뀡 ?앹꽦 寃€利?- `HtmlSkillConsultingSectionsTests.cs` + - `decision_matrix`, `metric_strip` ?뚮뜑留??뚭? 異붽? - `ArtifactQualityReviewServiceTests.cs` - - decision matrix를 강점으로 인식하고, trade-off view 부재 시 별도 경고를 반환하는지 검증 -- `ArtifactRepairGuideServiceTests.cs` - - HTML repair guide에 decision matrix 보강 액션이 포함되는지 검증 -- `DeckQualityReviewServiceTests.cs` - - headline/trade-off/KPI context 추가 경고 회귀 검증 + - decision matrix瑜?媛뺤젏?쇰줈 ?몄떇?섍퀬, trade-off view 遺€????蹂꾨룄 寃쎄퀬瑜?諛섑솚?섎뒗吏€ 寃€利?- `ArtifactRepairGuideServiceTests.cs` + - HTML repair guide??decision matrix 蹂닿컯 ?≪뀡???ы븿?섎뒗吏€ 寃€利?- `DeckQualityReviewServiceTests.cs` + - headline/trade-off/KPI context 異붽? 寃쎄퀬 ?뚭? 寃€利? +### 寃€利?- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_code_sql_doc\\ -p:IntermediateOutputPath=obj\\verify_code_sql_doc\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "SqlDialectDetectorTests|SqlAnalysisServiceTests|CodeLanguageCatalogTests|WorkspaceContextGeneratorTests|ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|DeckQualityReviewServiceTests|HtmlSkillConsultingSectionsTests" -p:OutputPath=bin\\verify_code_sql_doc_tests\\ -p:IntermediateOutputPath=obj\\verify_code_sql_doc_tests\\` ?듦낵 62 -### 검증 -- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_code_sql_doc\\ -p:IntermediateOutputPath=obj\\verify_code_sql_doc\\` 경고 0 / 오류 0 -- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "SqlDialectDetectorTests|SqlAnalysisServiceTests|CodeLanguageCatalogTests|WorkspaceContextGeneratorTests|ArtifactQualityReviewServiceTests|ArtifactRepairGuideServiceTests|DeckQualityReviewServiceTests|HtmlSkillConsultingSectionsTests" -p:OutputPath=bin\\verify_code_sql_doc_tests\\ -p:IntermediateOutputPath=obj\\verify_code_sql_doc_tests\\` 통과 62 +?낅뜲?댄듃: 2026-04-15 11:50 (KST) -업데이트: 2026-04-15 11:50 (KST) - -### SQL review 계층 추가 -- 새 `SqlReviewService.cs` - - `SqlReviewResult`를 도입해 `review severity`, `key findings`, `review checklist`를 구조화했습니다. - - schema migration/schema change는 migration sequencing, dependent object readiness를 우선 체크합니다. - - seed/reference data는 rerun safety와 idempotent upsert 관점을 별도 체크합니다. - - query/reporting SQL은 join width와 downstream consumer 영향 검토 포인트를 추가합니다. - - destructive DDL, broad DML, unclear transaction scope, wildcard projection을 findings/checklist로 변환합니다. +### SQL review 怨꾩링 異붽? +- ??`SqlReviewService.cs` + - `SqlReviewResult`瑜??꾩엯??`review severity`, `key findings`, `review checklist`瑜?援ъ“?뷀뻽?듬땲?? + - schema migration/schema change??migration sequencing, dependent object readiness瑜??곗꽑 泥댄겕?⑸땲?? + - seed/reference data??rerun safety?€ idempotent upsert 愿€?먯쓣 蹂꾨룄 泥댄겕?⑸땲?? + - query/reporting SQL?€ join width?€ downstream consumer ?곹뼢 寃€???ъ씤?몃? 異붽??⑸땲?? + - destructive DDL, broad DML, unclear transaction scope, wildcard projection??findings/checklist濡?蹂€?섑빀?덈떎. - `SqlAnalysisService.cs` - - `BuildFallbackSummary()`가 `SqlReviewService.Review(report)` 결과를 이어붙여 SQL fallback을 `analysis + review` 2단 구조로 반환하도록 변경했습니다. + - `BuildFallbackSummary()`媛€ `SqlReviewService.Review(report)` 寃곌낵瑜??댁뼱遺숈뿬 SQL fallback??`analysis + review` 2??援ъ“濡?諛섑솚?섎룄濡?蹂€寃쏀뻽?듬땲?? - `CodeLanguageCatalog.cs` - - SQL workflow summary에 `review: confirm rollback notes, dependency order, and row-count guards before apply` 힌트를 추가했습니다. + - SQL workflow summary??`review: confirm rollback notes, dependency order, and row-count guards before apply` ?뚰듃瑜?異붽??덉뒿?덈떎. -### AgentLoop 응답 분해 helper 추가 -- 새 `AgentLoopResponseClassificationService.cs` - - LLM 응답 블록을 `TextResponse`, `TextParts`, `ToolCalls`, `NextConsecutiveNoToolResponses`로 분류합니다. - - `BuildThinkingSummary()`를 제공해 thinking preview 길이 제한도 helper에서 처리합니다. +### AgentLoop ?묐떟 遺꾪빐 helper 異붽? +- ??`AgentLoopResponseClassificationService.cs` + - LLM ?묐떟 釉붾줉??`TextResponse`, `TextParts`, `ToolCalls`, `NextConsecutiveNoToolResponses`濡?遺꾨쪟?⑸땲?? + - `BuildThinkingSummary()`瑜??쒓났??thinking preview 湲몄씠 ?쒗븳??helper?먯꽌 泥섎━?⑸땲?? - `AgentLoopService.cs` - - 수동 `text/tool_use` 분리 루프를 제거하고 `AgentLoopResponseClassificationService.Classify()`를 사용하도록 정리했습니다. - - no-tool 응답 누적 카운트와 thinking summary 생성 책임을 helper 호출로 대체했습니다. + - ?섎룞 `text/tool_use` 遺꾨━ 猷⑦봽瑜??쒓굅?섍퀬 `AgentLoopResponseClassificationService.Classify()`瑜??ъ슜?섎룄濡??뺣━?덉뒿?덈떎. + - no-tool ?묐떟 ?꾩쟻 移댁슫?몄? thinking summary ?앹꽦 梨낆엫??helper ?몄텧濡??€泥댄뻽?듬땲?? -### 테스트 -- 새 `SqlReviewServiceTests.cs` - - destructive migration은 `high` severity와 rollback checklist를 반환하는지 검증 - - seed/reference data는 idempotency와 rerun safety 체크리스트를 반환하는지 검증 -- 새 `AgentLoopResponseClassificationServiceTests.cs` - - text/tool_use 분리와 no-tool counter reset/increment 동작 검증 -- 기존 `SqlAnalysisServiceTests.cs`, `CodeLanguageCatalogTests.cs` - - SQL fallback summary에 `review severity`, `review checklist`, rollback review 힌트가 들어가는지 회귀 검증 +### ?뚯뒪??- ??`SqlReviewServiceTests.cs` + - destructive migration?€ `high` severity?€ rollback checklist瑜?諛섑솚?섎뒗吏€ 寃€利? - seed/reference data??idempotency?€ rerun safety 泥댄겕由ъ뒪?몃? 諛섑솚?섎뒗吏€ 寃€利?- ??`AgentLoopResponseClassificationServiceTests.cs` + - text/tool_use 遺꾨━?€ no-tool counter reset/increment ?숈옉 寃€利?- 湲곗〈 `SqlAnalysisServiceTests.cs`, `CodeLanguageCatalogTests.cs` + - SQL fallback summary??`review severity`, `review checklist`, rollback review ?뚰듃媛€ ?ㅼ뼱媛€?붿? ?뚭? 寃€利? +### 寃€利?- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_loop_sql_finalize\\ -p:IntermediateOutputPath=obj\\verify_loop_sql_finalize\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentLoopResponseClassificationServiceTests|AgentLoopLlmRequestPreparationServiceTests|AgentLoopIterationPreparationServiceTests|SqlAnalysisServiceTests|SqlReviewServiceTests|CodeLanguageCatalogTests|WorkspaceContextGeneratorTests" -p:OutputPath=bin\\verify_loop_sql_finalize_tests\\ -p:IntermediateOutputPath=obj\\verify_loop_sql_finalize_tests\\` ?듦낵 48 -### 검증 -- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_loop_sql_finalize\\ -p:IntermediateOutputPath=obj\\verify_loop_sql_finalize\\` 경고 0 / 오류 0 -- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentLoopResponseClassificationServiceTests|AgentLoopLlmRequestPreparationServiceTests|AgentLoopIterationPreparationServiceTests|SqlAnalysisServiceTests|SqlReviewServiceTests|CodeLanguageCatalogTests|WorkspaceContextGeneratorTests" -p:OutputPath=bin\\verify_loop_sql_finalize_tests\\ -p:IntermediateOutputPath=obj\\verify_loop_sql_finalize_tests\\` 통과 48 +?낅뜲?댄듃: 2026-04-15 14:00 (KST) -업데이트: 2026-04-15 14:00 (KST) +### Code ??鍮??묒뾽 ?대뜑 ?앹꽦 踰꾧렇 蹂닿컯 +- ??`AgentLoopCodeRuntimeGuards.cs` + - `skill_manager`, `mcp_list_resources`, `mcp_read_resource`瑜?Code 湲곕낯 ?고????꾧뎄 ?몄텧?먯꽌 ?쒖쇅?섎뒗 `ApplyCodeDefaultMetaToolFilter()`瑜?異붽??덉뒿?덈떎. + - 鍮??묒뾽 ?대뜑?먯꽌 `folder_map`, `glob`, `grep`, `code_search`, `file_read`, `env_tool`, `skill_manager`, `mcp_*` ?꾧뎄濡??고쉶 ?먯깋???쒕룄?섎㈃ `TryHandleEmptyWorkspaceFallbackTransition()`??李⑤떒?섍퀬, `file_write` 吏곸젒 ?앹꽦 蹂듦뎄 ?꾨\?꾪듃瑜?二쇱엯?섎룄濡?留뚮뱾?덉뒿?덈떎. + - ?곷? 寃쎈줈 `.`???묒뾽 ?대뜑 湲곗??쇰줈 ?댁꽍???몃? 猷⑦듃 ?먯깋怨?detour瑜?援щ텇?섎룄濡?`IsExternalWorkspaceEscalationTarget()`瑜?蹂댁젙?덉뒿?덈떎. + - direct-creation ?붿껌?대㈃???묒뾽 ?대뜑媛€ 鍮꾩뼱 ?덉쑝硫??쒖옉 ?쒖젏??怨㏓컮濡?`file_write` ?앹꽦 ?곗꽑 媛€?대뱶瑜?二쇱엯?섎뒗 `InjectInitialEmptyWorkspaceCreationGuidance()`瑜?異붽??덉뒿?덈떎. -### Code 탭 빈 작업 폴더 생성 버그 보강 -- 새 `AgentLoopCodeRuntimeGuards.cs` - - `skill_manager`, `mcp_list_resources`, `mcp_read_resource`를 Code 기본 런타임 도구 노출에서 제외하는 `ApplyCodeDefaultMetaToolFilter()`를 추가했습니다. - - 빈 작업 폴더에서 `folder_map`, `glob`, `grep`, `code_search`, `file_read`, `env_tool`, `skill_manager`, `mcp_*` 도구로 우회 탐색을 시도하면 `TryHandleEmptyWorkspaceFallbackTransition()`이 차단하고, `file_write` 직접 생성 복구 프롬프트를 주입하도록 만들었습니다. - - 상대 경로 `.`도 작업 폴더 기준으로 해석해 외부 루트 탐색과 detour를 구분하도록 `IsExternalWorkspaceEscalationTarget()`를 보정했습니다. - - direct-creation 요청이면서 작업 폴더가 비어 있으면 시작 시점에 곧바로 `file_write` 생성 우선 가이드를 주입하는 `InjectInitialEmptyWorkspaceCreationGuidance()`를 추가했습니다. - -### AgentLoop / Code 프롬프트 연동 +### AgentLoop / Code ?꾨\?꾪듃 ?곕룞 - `AgentLoopService.cs` - - `BuildContext()` 직후 `DetectEmptyWorkspace(context.WorkFolder)`로 빈 작업 폴더를 감지해 `runState.WorkspaceAppearsEmpty`에 반영합니다. - - `GetRuntimeActiveTools()`에서 `ApplyCodeDefaultMetaToolFilter()`를 실제 런타임 도구 목록에 적용합니다. - - 도구 실행 직전 `TryHandleEmptyWorkspaceFallbackTransition()`을 호출해 외부 루트 fallback과 메타 도구 detour를 막습니다. - - direct-creation 상태 메시지는 Code 탭에서 `즉시 생성 모드 · 바로 파일을 만드는 중`으로 분리해 사용자에게 현재 의도를 더 정확히 보이도록 정리했습니다. + - `BuildContext()` 吏곹썑 `DetectEmptyWorkspace(context.WorkFolder)`濡?鍮??묒뾽 ?대뜑瑜?媛먯???`runState.WorkspaceAppearsEmpty`??諛섏쁺?⑸땲?? + - `GetRuntimeActiveTools()`?먯꽌 `ApplyCodeDefaultMetaToolFilter()`瑜??ㅼ젣 ?고????꾧뎄 紐⑸줉???곸슜?⑸땲?? + - ?꾧뎄 ?ㅽ뻾 吏곸쟾 `TryHandleEmptyWorkspaceFallbackTransition()`???몄텧???몃? 猷⑦듃 fallback怨?硫뷀? ?꾧뎄 detour瑜?留됱뒿?덈떎. + - direct-creation ?곹깭 硫붿떆吏€??Code ??뿉??`利됱떆 ?앹꽦 紐⑤뱶 쨌 諛붾줈 ?뚯씪??留뚮뱶??以??쇰줈 遺꾨━???ъ슜?먯뿉寃??꾩옱 ?섎룄瑜????뺥솗??蹂댁씠?꾨줉 ?뺣━?덉뒿?덈떎. - `ChatWindow.SystemPromptBuilder.cs` - - Code/Cowork 프롬프트에 `빈 작업 폴더 + 새 파일/웹페이지/scaffold 생성 요청`이면 broad exploration 없이 `file_write`를 바로 호출하라는 규칙을 추가했습니다. - - Code 일반 작업에서 `skill_manager`, `mcp_list_resources`, `mcp_read_resource`를 쓰지 말라는 규칙도 함께 추가했습니다. + - Code/Cowork ?꾨\?꾪듃??`鍮??묒뾽 ?대뜑 + ???뚯씪/?뱁럹?댁?/scaffold ?앹꽦 ?붿껌`?대㈃ broad exploration ?놁씠 `file_write`瑜?諛붾줈 ?몄텧?섎씪??洹쒖튃??異붽??덉뒿?덈떎. + - Code ?쇰컲 ?묒뾽?먯꽌 `skill_manager`, `mcp_list_resources`, `mcp_read_resource`瑜??곗? 留먮씪??洹쒖튃???④퍡 異붽??덉뒿?덈떎. -### Tool-call 정합성 복구 +### Tool-call ?뺥빀??蹂듦뎄 - `AgentLoopResponseClassificationService.cs` - - 텍스트 블록 안에 `{...}` 형태로 섞여 들어온 호출을 `LlmService.TryExtractToolCallsFromText()`로 복구하도록 확장했습니다. - - `LlmService.StripToolCallTokens()`로 남은 텍스트는 thinking/assistant 요약에만 남기고 실제 도구 호출은 실행 경로로 넘깁니다. - - 이 보강으로 `file_write`가 스트리밍 중 텍스트에 묻혀 유실되는 케이스를 줄였습니다. + - ?띿뒪??釉붾줉 ?덉뿉 `{...}` ?뺥깭濡??욎뿬 ?ㅼ뼱???몄텧??`LlmService.TryExtractToolCallsFromText()`濡?蹂듦뎄?섎룄濡??뺤옣?덉뒿?덈떎. + - `LlmService.StripToolCallTokens()`濡??⑥? ?띿뒪?몃뒗 thinking/assistant ?붿빟?먮쭔 ?④린怨??ㅼ젣 ?꾧뎄 ?몄텧?€ ?ㅽ뻾 寃쎈줈濡??섍퉩?덈떎. + - ??蹂닿컯?쇰줈 `file_write`媛€ ?ㅽ듃由щ컢 以??띿뒪?몄뿉 臾삵? ?좎떎?섎뒗 耳€?댁뒪瑜?以꾩??듬땲?? -### 테스트 -- `AgentLoopE2ETests.cs` +### ?뚯뒪??- `AgentLoopE2ETests.cs` - `RunAsync_EmptyWorkspace_BlocksExternalFallbackAndRecoversToFileWrite()` - `RunAsync_EmptyWorkspace_DisallowsSkillManagerAndRecoversToFileWrite()` - `RunAsync_TextEmbeddedToolCall_RecoversAndExecutesFileWrite()` - - E2E helper `BuildLoopSettings()`는 ambient project/plugin/MCP skill discovery를 꺼서 현재 저장소 스킬 상태에 영향받지 않도록 격리했습니다. + - E2E helper `BuildLoopSettings()`??ambient project/plugin/MCP skill discovery瑜?爰쇱꽌 ?꾩옱 ?€?μ냼 ?ㅽ궗 ?곹깭???곹뼢諛쏆? ?딅룄濡?寃⑸━?덉뒿?덈떎. - `AgentLoopResponseClassificationServiceTests.cs` - - `Classify_ShouldRecoverToolCallEmbeddedInText()` 추가 + - `Classify_ShouldRecoverToolCallEmbeddedInText()` 異붽? -### 검증 -- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_empty_workspace_fix2\\ -p:IntermediateOutputPath=obj\\verify_empty_workspace_fix2\\` 경고 0 / 오류 0 -- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "FullyQualifiedName~RunAsync_EmptyWorkspace_BlocksExternalFallbackAndRecoversToFileWrite|FullyQualifiedName~RunAsync_EmptyWorkspace_DisallowsSkillManagerAndRecoversToFileWrite|FullyQualifiedName~RunAsync_TextEmbeddedToolCall_RecoversAndExecutesFileWrite|FullyQualifiedName~Classify_ShouldRecoverToolCallEmbeddedInText" -p:OutputPath=bin\\verify_empty_workspace_fix2_tests\\ -p:IntermediateOutputPath=obj\\verify_empty_workspace_fix2_tests\\` 통과 4 +### 寃€利?- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_empty_workspace_fix2\\ -p:IntermediateOutputPath=obj\\verify_empty_workspace_fix2\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "FullyQualifiedName~RunAsync_EmptyWorkspace_BlocksExternalFallbackAndRecoversToFileWrite|FullyQualifiedName~RunAsync_EmptyWorkspace_DisallowsSkillManagerAndRecoversToFileWrite|FullyQualifiedName~RunAsync_TextEmbeddedToolCall_RecoversAndExecutesFileWrite|FullyQualifiedName~Classify_ShouldRecoverToolCallEmbeddedInText" -p:OutputPath=bin\\verify_empty_workspace_fix2_tests\\ -p:IntermediateOutputPath=obj\\verify_empty_workspace_fix2_tests\\` ?듦낵 4 -업데이트: 2026-04-15 14:18 (KST) +?낅뜲?댄듃: 2026-04-15 14:18 (KST) -### AgentLoop 탭 정책 / broader E2E 정합성 수정 +### AgentLoop ???뺤콉 / broader E2E ?뺥빀???섏젙 - `AgentLoopE2ETests.cs` - `RunAsync_ExecutesToolCall_AndCompletesWithFinalText()` - `RunAsync_UnknownTool_RecoversAndCompletes()` - `RunAsync_PlanModeAlways_EmitsPlanningThenExecutesTool()` - `RunAsync_PreHookInputMutation_ChangesToolArguments()` - - 위 4개 시나리오의 `ActiveTab`을 `Chat`에서 `Cowork`로 정리했습니다. - - 근거: [AgentToolCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentToolCatalog.cs) 기준 `math_eval`은 `Cowork,Code` 도구이며 Chat 기본 노출 대상이 아닙니다. 기존 broader E2E 실패는 런타임 정책 누수라기보다 테스트가 현행 탭 정책보다 오래된 가정을 유지한 영향이었습니다. + - ??4媛??쒕굹由ъ삤??`ActiveTab`??`Chat`?먯꽌 `Cowork`濡??뺣━?덉뒿?덈떎. + - 洹쇨굅: [AgentToolCatalog.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentToolCatalog.cs) 湲곗? `math_eval`?€ `Cowork,Code` ?꾧뎄?대ʼn Chat 湲곕낯 ?몄텧 ?€?곸씠 ?꾨떃?덈떎. 湲곗〈 broader E2E ?ㅽ뙣???고????뺤콉 ?꾩닔?쇨린蹂대떎 ?뚯뒪?멸? ?꾪뻾 ???뺤콉蹂대떎 ?ㅻ옒??媛€?뺤쓣 ?좎????곹뼢?댁뿀?듬땲?? -### no-tool 상태 메시지 분기 보강 +### no-tool ?곹깭 硫붿떆吏€ 遺꾧린 蹂닿컯 - `AgentLoopService.cs` - - `activeTools.Count == 0`일 때의 오류 반환을 2갈래로 분리했습니다. - - 실제 `runtimeOverrides.AllowedToolNames`가 있을 때만 기존 `현재 스킬 정책에서 허용된 도구가 없어...` 문구를 유지합니다. - - 그 외에는 `현재 {탭} 탭에서 사용 가능한 도구가 없어...` 형식의 탭 기준 메시지를 반환해 원인 안내가 오해를 부르지 않도록 정리했습니다. + - `activeTools.Count == 0`???뚯쓽 ?ㅻ쪟 諛섑솚??2媛덈옒濡?遺꾨━?덉뒿?덈떎. + - ?ㅼ젣 `runtimeOverrides.AllowedToolNames`媛€ ?덉쓣 ?뚮쭔 湲곗〈 `?꾩옱 ?ㅽ궗 ?뺤콉?먯꽌 ?덉슜???꾧뎄媛€ ?놁뼱...` 臾멸뎄瑜??좎??⑸땲?? + - 洹??몄뿉??`?꾩옱 {?? ??뿉???ъ슜 媛€?ν븳 ?꾧뎄媛€ ?놁뼱...` ?뺤떇????湲곗? 硫붿떆吏€瑜?諛섑솚???먯씤 ?덈궡媛€ ?ㅽ빐瑜?遺€瑜댁? ?딅룄濡??뺣━?덉뒿?덈떎. -### 검증 -- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_runtime_policy_alignment_build\\ -p:IntermediateOutputPath=obj\\verify_runtime_policy_alignment_build\\` 경고 0 / 오류 0 -- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentLoopE2ETests|AgentLoopResponseClassificationServiceTests" -p:OutputPath=bin\\verify_runtime_policy_alignment\\ -p:IntermediateOutputPath=obj\\verify_runtime_policy_alignment\\` 통과 19 -업데이트: 2026-04-15 15:09 (KST) -- `src/AxCopilot/Views/ChatWindow.xaml.cs`의 작업 폴더 반영 경로를 보강했습니다. `SetWorkFolder(...)`가 이제 Code/Cowork 탭에서 현재 대화가 없더라도 `EnsureCurrentConversation(...)`으로 대화를 즉시 확보한 뒤 `WorkFolder`를 기록해, 폴더 선택 직후 빠른 전송에서도 대화 메타데이터가 비어 있지 않게 유지합니다. -- `GetCurrentWorkFolder()`는 전역 `Llm.WorkFolder`보다 탭별 `CodeWorkFolder`/`CoworkWorkFolder`를 먼저 읽도록 바꿨습니다. 폴더 바·워터마크·스킬 로더가 보는 경로와 실제 탭별 저장 경로를 더 잘 맞춰 UI fallback과 실행 경로가 어긋나는 상황을 줄였습니다. -- `BtnFolderClear_Click(...)`는 대화의 `WorkFolder`만 비우던 기존 동작에서 확장해 탭별 최근 작업 폴더 설정과 UI 상태도 함께 초기화합니다. 이전 경로가 설정 fallback으로 다시 나타나는 현상을 줄이고, 이후 스킬 재로드도 같은 기준으로 다시 시작합니다. -- `src/AxCopilot/Services/ChatSessionStateService.cs`의 `CreateFreshConversation(...)`는 Code/Cowork 탭 새 대화 생성 시 탭별 최근 작업 폴더를 기본 `WorkFolder`로 승계합니다. 이로써 “UI에는 폴더가 보이는데 전송 차단은 경로 없음으로 판단”하던 불일치를 완화합니다. -- 테스트: `src/AxCopilot.Tests/Services/ChatSessionStateServiceTests.cs`에서 fresh conversation 기본 폴더 승계와 탭별 우선순위를 검증하도록 확장 -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_workfolder_sync\\ -p:IntermediateOutputPath=obj\\verify_workfolder_sync\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ChatSessionStateServiceTests" -p:OutputPath=bin\\verify_workfolder_sync_tests\\ -p:IntermediateOutputPath=obj\\verify_workfolder_sync_tests\\` 통과 37 -업데이트: 2026-04-15 15:18 (KST) -- `src/AxCopilot/Models/AppSettings.cs`의 `LlmSettings.MaxContextTokens` 기본값을 `32_768`로 조정했습니다. 이제 신규 설치, 신규 세션, 초기화 이후의 코워크/코드 내부설정은 32K 컨텍스트 기준으로 시작합니다. -- `src/AxCopilot/Views/SettingsWindow.xaml`과 `src/AxCopilot/Views/SettingsWindow.xaml.cs`에는 `32K` 컨텍스트 카드와 선택 로직을 추가했습니다. 기존 4K/16K/64K 사이의 간격 때문에 32K 기본값이 64K처럼 보이던 불일치를 제거합니다. -- `src/AxCopilot/Views/AgentSettingsWindow.xaml.cs`는 `TxtMaxContextTokens` 파싱 실패 시 fallback 값을 4096에서 32768로 변경했습니다. 내부 설정 창에서 잘못된 입력을 저장하더라도 기본 컨텍스트가 다시 4K로 내려가지 않습니다. -- 테스트: `src/AxCopilot.Tests/Services/SettingsServiceTests.cs`에 `LlmSettings_DefaultMaxContextTokens_IsThirtyTwoK` 추가 -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_context32k\\ -p:IntermediateOutputPath=obj\\verify_context32k\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "SettingsServiceTests" -p:OutputPath=bin\\verify_context32k_tests\\ -p:IntermediateOutputPath=obj\\verify_context32k_tests\\` 통과 32 +### 寃€利?- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_runtime_policy_alignment_build\\ -p:IntermediateOutputPath=obj\\verify_runtime_policy_alignment_build\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "AgentLoopE2ETests|AgentLoopResponseClassificationServiceTests" -p:OutputPath=bin\\verify_runtime_policy_alignment\\ -p:IntermediateOutputPath=obj\\verify_runtime_policy_alignment\\` ?듦낵 19 +?낅뜲?댄듃: 2026-04-15 15:09 (KST) +- `src/AxCopilot/Views/ChatWindow.xaml.cs`???묒뾽 ?대뜑 諛섏쁺 寃쎈줈瑜?蹂닿컯?덉뒿?덈떎. `SetWorkFolder(...)`媛€ ?댁젣 Code/Cowork ??뿉???꾩옱 ?€?붽? ?녿뜑?쇰룄 `EnsureCurrentConversation(...)`?쇰줈 ?€?붾? 利됱떆 ?뺣낫????`WorkFolder`瑜?湲곕줉?? ?대뜑 ?좏깮 吏곹썑 鍮좊Ⅸ ?꾩넚?먯꽌???€??硫뷀??곗씠?곌? 鍮꾩뼱 ?덉? ?딄쾶 ?좎??⑸땲?? +- `GetCurrentWorkFolder()`???꾩뿭 `Llm.WorkFolder`蹂대떎 ??퀎 `CodeWorkFolder`/`CoworkWorkFolder`瑜?癒쇱? ?쎈룄濡?諛붽엥?듬땲?? ?대뜑 諛붋룹썙?곕쭏??룹뒪??濡쒕뜑媛€ 蹂대뒗 寃쎈줈?€ ?ㅼ젣 ??퀎 ?€??寃쎈줈瑜?????留욎떠 UI fallback怨??ㅽ뻾 寃쎈줈媛€ ?닿툔?섎뒗 ?곹솴??以꾩??듬땲?? +- `BtnFolderClear_Click(...)`???€?붿쓽 `WorkFolder`留?鍮꾩슦??湲곗〈 ?숈옉?먯꽌 ?뺤옣????퀎 理쒓렐 ?묒뾽 ?대뜑 ?ㅼ젙怨?UI ?곹깭???④퍡 珥덇린?뷀빀?덈떎. ?댁쟾 寃쎈줈媛€ ?ㅼ젙 fallback?쇰줈 ?ㅼ떆 ?섑??섎뒗 ?꾩긽??以꾩씠怨? ?댄썑 ?ㅽ궗 ?щ줈?쒕룄 媛숈? 湲곗??쇰줈 ?ㅼ떆 ?쒖옉?⑸땲?? +- `src/AxCopilot/Services/ChatSessionStateService.cs`??`CreateFreshConversation(...)`??Code/Cowork ?????€???앹꽦 ????퀎 理쒓렐 ?묒뾽 ?대뜑瑜?湲곕낯 `WorkFolder`濡??밴퀎?⑸땲?? ?대줈???쏹I?먮뒗 ?대뜑媛€ 蹂댁씠?붾뜲 ?꾩넚 李⑤떒?€ 寃쎈줈 ?놁쓬?쇰줈 ?먮떒?앺븯??遺덉씪移섎? ?꾪솕?⑸땲?? +- ?뚯뒪?? `src/AxCopilot.Tests/Services/ChatSessionStateServiceTests.cs`?먯꽌 fresh conversation 湲곕낯 ?대뜑 ?밴퀎?€ ??퀎 ?곗꽑?쒖쐞瑜?寃€利앺븯?꾨줉 ?뺤옣 +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_workfolder_sync\\ -p:IntermediateOutputPath=obj\\verify_workfolder_sync\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ChatSessionStateServiceTests" -p:OutputPath=bin\\verify_workfolder_sync_tests\\ -p:IntermediateOutputPath=obj\\verify_workfolder_sync_tests\\` ?듦낵 37 +?낅뜲?댄듃: 2026-04-15 15:18 (KST) +- `src/AxCopilot/Models/AppSettings.cs`??`LlmSettings.MaxContextTokens` 湲곕낯媛믪쓣 `32_768`濡?議곗젙?덉뒿?덈떎. ?댁젣 ?좉퇋 ?ㅼ튂, ?좉퇋 ?몄뀡, 珥덇린???댄썑??肄붿썙??肄붾뱶 ?대??ㅼ젙?€ 32K 而⑦뀓?ㅽ듃 湲곗??쇰줈 ?쒖옉?⑸땲?? +- `src/AxCopilot/Views/SettingsWindow.xaml`怨?`src/AxCopilot/Views/SettingsWindow.xaml.cs`?먮뒗 `32K` 而⑦뀓?ㅽ듃 移대뱶?€ ?좏깮 濡쒖쭅??異붽??덉뒿?덈떎. 湲곗〈 4K/16K/64K ?ъ씠??媛꾧꺽 ?뚮Ц??32K 湲곕낯媛믪씠 64K泥섎읆 蹂댁씠??遺덉씪移섎? ?쒓굅?⑸땲?? +- `src/AxCopilot/Views/AgentSettingsWindow.xaml.cs`??`TxtMaxContextTokens` ?뚯떛 ?ㅽ뙣 ??fallback 媛믪쓣 4096?먯꽌 32768濡?蹂€寃쏀뻽?듬땲?? ?대? ?ㅼ젙 李쎌뿉???섎せ???낅젰???€?ν븯?붾씪??湲곕낯 而⑦뀓?ㅽ듃媛€ ?ㅼ떆 4K濡??대젮媛€吏€ ?딆뒿?덈떎. +- ?뚯뒪?? `src/AxCopilot.Tests/Services/SettingsServiceTests.cs`??`LlmSettings_DefaultMaxContextTokens_IsThirtyTwoK` 異붽? +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_context32k\\ -p:IntermediateOutputPath=obj\\verify_context32k\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "SettingsServiceTests" -p:OutputPath=bin\\verify_context32k_tests\\ -p:IntermediateOutputPath=obj\\verify_context32k_tests\\` ?듦낵 32 -업데이트: 2026-04-15 14:55 (KST) +?낅뜲?댄듃: 2026-04-15 14:55 (KST) -### Code 탭 LLM 대기 heartbeat 진단 보강 +### Code ??LLM ?€湲?heartbeat 吏꾨떒 蹂닿컯 - `src/AxCopilot/Services/Agent/StreamingToolExecutionCoordinator.cs` - - 첫 응답 전 `LLM 요청 시작`, 첫 응답 수신 시점, 이후 장시간 대기 구간을 `[AgentLoopWait]` 로그로 남기도록 보강했습니다. - - `onStreamEventAsync`가 있는 스트리밍 경로에서 첫 이벤트가 늦게 오면 `메인 루프 N: 모델 첫 응답을 기다리는 중입니다... (n초)` heartbeat를 주기적으로 `Thinking` 이벤트로 발행합니다. - - 첫 이벤트가 늦게 도착한 경우 `메인 루프 N: 모델 첫 응답을 받아 계속 진행합니다.`를 한 번 더 기록해, 설치본 로그와 UI 진행 이력만으로도 “아예 멈춤”과 “응답 대기”를 구분할 수 있게 했습니다. - - 빠른 응답에서는 waiting heartbeat를 남기지 않도록 기본 heartbeat 지연값을 두고, 테스트에서는 짧은 지연값으로만 동작을 검증합니다. + - 泥??묐떟 ??`LLM ?붿껌 ?쒖옉`, 泥??묐떟 ?섏떊 ?쒖젏, ?댄썑 ?μ떆媛??€湲?援ш컙??`[AgentLoopWait]` 濡쒓렇濡??④린?꾨줉 蹂닿컯?덉뒿?덈떎. + - `onStreamEventAsync`媛€ ?덈뒗 ?ㅽ듃由щ컢 寃쎈줈?먯꽌 泥??대깽?멸? ??쾶 ?ㅻ㈃ `硫붿씤 猷⑦봽 N: 紐⑤뜽 泥??묐떟??湲곕떎由щ뒗 以묒엯?덈떎... (n珥?` heartbeat瑜?二쇨린?곸쑝濡?`Thinking` ?대깽?몃줈 諛쒗뻾?⑸땲?? + - 泥??대깽?멸? ??쾶 ?꾩갑??寃쎌슦 `硫붿씤 猷⑦봽 N: 紐⑤뜽 泥??묐떟??諛쏆븘 怨꾩냽 吏꾪뻾?⑸땲??`瑜???踰???湲곕줉?? ?ㅼ튂蹂?濡쒓렇?€ UI 吏꾪뻾 ?대젰留뚯쑝濡쒕룄 ?쒖븘??硫덉땄?앷낵 ?쒖쓳???€湲겸€앸? 援щ텇?????덇쾶 ?덉뒿?덈떎. + - 鍮좊Ⅸ ?묐떟?먯꽌??waiting heartbeat瑜??④린吏€ ?딅룄濡?湲곕낯 heartbeat 吏€?곌컪???먭퀬, ?뚯뒪?몄뿉?쒕뒗 吏㏃? 吏€?곌컪?쇰줈留??숈옉??寃€利앺빀?덈떎. -### 테스트 -- 새 `src/AxCopilot.Tests/Services/StreamingToolExecutionCoordinatorTests.cs` - - 느린 첫 응답일 때 waiting heartbeat와 first-response recovery 메시지가 나오는지 검증 - - 빠른 첫 응답에서는 대기 heartbeat가 발생하지 않는지 검증 +### ?뚯뒪??- ??`src/AxCopilot.Tests/Services/StreamingToolExecutionCoordinatorTests.cs` + - ?먮┛ 泥??묐떟????waiting heartbeat?€ first-response recovery 硫붿떆吏€媛€ ?섏삤?붿? 寃€利? - 鍮좊Ⅸ 泥??묐떟?먯꽌???€湲?heartbeat媛€ 諛쒖깮?섏? ?딅뒗吏€ 寃€利? +### 寃€利?- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_llm_wait_diag\\ -p:IntermediateOutputPath=obj\\verify_llm_wait_diag\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "StreamingToolExecutionCoordinatorTests|AgentLoopLlmRequestPreparationServiceTests|AgentLoopIterationPreparationServiceTests" -p:OutputPath=bin\\verify_llm_wait_diag_tests\\ -p:IntermediateOutputPath=obj\\verify_llm_wait_diag_tests\\` ?듦낵 6 -### 검증 -- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_llm_wait_diag\\ -p:IntermediateOutputPath=obj\\verify_llm_wait_diag\\` 경고 0 / 오류 0 -- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "StreamingToolExecutionCoordinatorTests|AgentLoopLlmRequestPreparationServiceTests|AgentLoopIterationPreparationServiceTests" -p:OutputPath=bin\\verify_llm_wait_diag_tests\\ -p:IntermediateOutputPath=obj\\verify_llm_wait_diag_tests\\` 통과 6 +?낅뜲?댄듃: 2026-04-15 15:27 (KST) -업데이트: 2026-04-15 15:27 (KST) - -### Cowork/Code 라이브 카드 시작 경로 복구 +### Cowork/Code ?쇱씠釉?移대뱶 ?쒖옉 寃쎈줈 蹂듦뎄 - `src/AxCopilot/Views/ChatWindow.xaml.cs` - - `StartLiveAgentProgressHints()`가 Cowork/Code 실행 시작 시 `ShowAgentLiveCard(runTab)`를 다시 호출하도록 복구했습니다. - - 메인 루프2 이후 상태 힌트/하단 바만 시작되고, 채팅창 바로 위 라이브 카드 컨테이너를 만들지 않던 회귀를 수정한 것입니다. - - 비대상 탭(Chat 등) 실행 시작 시에는 `RemoveAgentLiveCard(animated: false)`로 기존 라이브 카드를 즉시 정리해 탭 전환 뒤 잔상이 남지 않게 맞췄습니다. + - `StartLiveAgentProgressHints()`媛€ Cowork/Code ?ㅽ뻾 ?쒖옉 ??`ShowAgentLiveCard(runTab)`瑜??ㅼ떆 ?몄텧?섎룄濡?蹂듦뎄?덉뒿?덈떎. + - 硫붿씤 猷⑦봽2 ?댄썑 ?곹깭 ?뚰듃/?섎떒 諛붾쭔 ?쒖옉?섍퀬, 梨꾪똿李?諛붾줈 ???쇱씠釉?移대뱶 而⑦뀒?대꼫瑜?留뚮뱾吏€ ?딅뜕 ?뚭?瑜??섏젙??寃껋엯?덈떎. + - 鍮꾨?????Chat ?? ?ㅽ뻾 ?쒖옉 ?쒖뿉??`RemoveAgentLiveCard(animated: false)`濡?湲곗〈 ?쇱씠釉?移대뱶瑜?利됱떆 ?뺣━?????꾪솚 ???붿긽???⑥? ?딄쾶 留욎톬?듬땲?? - `src/AxCopilot/Views/ChatWindow.LiveProgressPresentation.cs` - - `IsAgentLiveCardEligibleTab(string? runTab)` 헬퍼를 추가해 라이브 카드 대상 탭을 `Cowork`, `Code`로 고정했습니다. - - 시작 경로와 회귀 테스트가 같은 판정식을 사용하도록 묶어 탭 조건이 다시 어긋나지 않게 했습니다. + - `IsAgentLiveCardEligibleTab(string? runTab)` ?ы띁瑜?異붽????쇱씠釉?移대뱶 ?€????쓣 `Cowork`, `Code`濡?怨좎젙?덉뒿?덈떎. + - ?쒖옉 寃쎈줈?€ ?뚭? ?뚯뒪?멸? 媛숈? ?먯젙?앹쓣 ?ъ슜?섎룄濡?臾띠뼱 ??議곌굔???ㅼ떆 ?닿툔?섏? ?딄쾶 ?덉뒿?덈떎. -### 테스트 -- `src/AxCopilot.Tests/Views/ChatWindowSlashPolicyTests.cs` - - `IsAgentLiveCardEligibleTab_ShouldMatchExpectedTabs()` 추가 +### ?뚯뒪??- `src/AxCopilot.Tests/Views/ChatWindowSlashPolicyTests.cs` + - `IsAgentLiveCardEligibleTab_ShouldMatchExpectedTabs()` 異붽? -### 검증 -- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_live_card_restore\\ -p:IntermediateOutputPath=obj\\verify_live_card_restore\\` 경고 0 / 오류 0 -- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ChatWindowSlashPolicyTests" -p:OutputPath=bin\\verify_live_card_restore_tests\\ -p:IntermediateOutputPath=obj\\verify_live_card_restore_tests\\` 통과 49 -업데이트: 2026-04-15 15:40 (KST) -- Code 탭 워크스페이스/권한 정합성 수정. `src/AxCopilot/Services/Agent/AgentLoopService.cs`에 `RuntimeWorkFolderOverride`를 추가해, loop가 settings의 `CodeWorkFolder`보다 현재 대화의 `WorkFolder`를 우선 사용하도록 바꿨습니다. 이제 UI가 보여주는 작업 폴더와 실제 도구 실행/권한 검사 기준이 같은 경로를 바라봅니다. -- `src/AxCopilot/Views/ChatWindow.xaml.cs`의 `RunAgentLoopAsync(...)`는 현재 conversation의 `WorkFolder`를 해당 탭 loop에 직접 주입하고, 권한 팝업 안내 문구도 `_currentConversation` 대신 실행 중인 loop의 runtime workspace override를 우선 참조합니다. 사내 모드에서는 지정 워크스페이스 하위는 무승인, 외부 경로만 승인 대상이라는 규칙이 Code 탭에도 일관되게 적용됩니다. -- `src/AxCopilot.Tests/Services/AgentLoopE2ETests.cs`에 세 가지 회귀를 추가했습니다. 대화 워크스페이스가 stale settings 폴더보다 우선 적용되는지, 사내 모드 + BypassPermissions에서 워크스페이스 내부 쓰기가 승인 없이 허용되는지, 외부 경로 쓰기는 반드시 승인 콜백을 타는지를 각각 검증합니다. -- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_workspace_permission_fix\\ -p:IntermediateOutputPath=obj\\verify_workspace_permission_fix\\` 경고 0 / 오류 0 -- 검증: `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "FullyQualifiedName~RunAsync_CodeRuntimeWorkspaceOverride_PrefersConversationWorkspaceOverSettingsFolder|FullyQualifiedName~RunAsync_InternalMode_BypassPermissions_AllowsWorkspaceWriteWithoutPrompt|FullyQualifiedName~RunAsync_InternalMode_BypassPermissions_RequestsApprovalForPathOutsideWorkspace|FullyQualifiedName~RunAsync_EmptyWorkspace_BlocksExternalFallbackAndRecoversToFileWrite|FullyQualifiedName~RunAsync_EmptyWorkspace_DisallowsSkillManagerAndRecoversToFileWrite|FullyQualifiedName~RunAsync_TextEmbeddedToolCall_RecoversAndExecutesFileWrite" -p:OutputPath=bin\\verify_workspace_permission_fix_tests\\ -p:IntermediateOutputPath=obj\\verify_workspace_permission_fix_tests\\` 통과 6 -업데이트: 2026-04-15 16:30 (KST) +### 寃€利?- `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_live_card_restore\\ -p:IntermediateOutputPath=obj\\verify_live_card_restore\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "ChatWindowSlashPolicyTests" -p:OutputPath=bin\\verify_live_card_restore_tests\\ -p:IntermediateOutputPath=obj\\verify_live_card_restore_tests\\` ?듦낵 49 +?낅뜲?댄듃: 2026-04-15 15:40 (KST) +- Code ???뚰겕?ㅽ럹?댁뒪/沅뚰븳 ?뺥빀???섏젙. `src/AxCopilot/Services/Agent/AgentLoopService.cs`??`RuntimeWorkFolderOverride`瑜?異붽??? loop媛€ settings??`CodeWorkFolder`蹂대떎 ?꾩옱 ?€?붿쓽 `WorkFolder`瑜??곗꽑 ?ъ슜?섎룄濡?諛붽엥?듬땲?? ?댁젣 UI媛€ 蹂댁뿬二쇰뒗 ?묒뾽 ?대뜑?€ ?ㅼ젣 ?꾧뎄 ?ㅽ뻾/沅뚰븳 寃€??湲곗???媛숈? 寃쎈줈瑜?諛붾씪遊낅땲?? +- `src/AxCopilot/Views/ChatWindow.xaml.cs`??`RunAgentLoopAsync(...)`???꾩옱 conversation??`WorkFolder`瑜??대떦 ??loop??吏곸젒 二쇱엯?섍퀬, 沅뚰븳 ?앹뾽 ?덈궡 臾멸뎄??`_currentConversation` ?€???ㅽ뻾 以묒씤 loop??runtime workspace override瑜??곗꽑 李몄“?⑸땲?? ?щ궡 紐⑤뱶?먯꽌??吏€???뚰겕?ㅽ럹?댁뒪 ?섏쐞??臾댁듅?? ?몃? 寃쎈줈留??뱀씤 ?€?곸씠?쇰뒗 洹쒖튃??Code ??뿉???쇨??섍쾶 ?곸슜?⑸땲?? +- `src/AxCopilot.Tests/Services/AgentLoopE2ETests.cs`????媛€吏€ ?뚭?瑜?異붽??덉뒿?덈떎. ?€???뚰겕?ㅽ럹?댁뒪媛€ stale settings ?대뜑蹂대떎 ?곗꽑 ?곸슜?섎뒗吏€, ?щ궡 紐⑤뱶 + BypassPermissions?먯꽌 ?뚰겕?ㅽ럹?댁뒪 ?대? ?곌린媛€ ?뱀씤 ?놁씠 ?덉슜?섎뒗吏€, ?몃? 寃쎈줈 ?곌린??諛섎뱶???뱀씤 肄쒕갚???€?붿?瑜?媛곴컖 寃€利앺빀?덈떎. +- 寃€利? `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_workspace_permission_fix\\ -p:IntermediateOutputPath=obj\\verify_workspace_permission_fix\\` 寃쎄퀬 0 / ?ㅻ쪟 0 +- 寃€利? `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "FullyQualifiedName~RunAsync_CodeRuntimeWorkspaceOverride_PrefersConversationWorkspaceOverSettingsFolder|FullyQualifiedName~RunAsync_InternalMode_BypassPermissions_AllowsWorkspaceWriteWithoutPrompt|FullyQualifiedName~RunAsync_InternalMode_BypassPermissions_RequestsApprovalForPathOutsideWorkspace|FullyQualifiedName~RunAsync_EmptyWorkspace_BlocksExternalFallbackAndRecoversToFileWrite|FullyQualifiedName~RunAsync_EmptyWorkspace_DisallowsSkillManagerAndRecoversToFileWrite|FullyQualifiedName~RunAsync_TextEmbeddedToolCall_RecoversAndExecutesFileWrite" -p:OutputPath=bin\\verify_workspace_permission_fix_tests\\ -p:IntermediateOutputPath=obj\\verify_workspace_permission_fix_tests\\` ?듦낵 6 +?낅뜲?댄듃: 2026-04-15 16:30 (KST) -### 권한 체계 정리 1차 -- `src/AxCopilot/Services/OperationModePolicy.cs` - - 사내 모드에서 차단할 외부 접근 기준을 보강했습니다. - - `open_external`은 HTTP/HTTPS뿐 아니라 `mailto:` 같은 외부 URI scheme도 차단하고, `process`/`build_run`에서 재사용할 네트워크성 명령 패턴 판정 helper를 추가했습니다. +### 沅뚰븳 泥닿퀎 ?뺣━ 1李?- `src/AxCopilot/Services/OperationModePolicy.cs` + - ?щ궡 紐⑤뱶?먯꽌 李⑤떒???몃? ?묎렐 湲곗???蹂닿컯?덉뒿?덈떎. + - `open_external`?€ HTTP/HTTPS肉??꾨땲??`mailto:` 媛숈? ?몃? URI scheme??李⑤떒?섍퀬, `process`/`build_run`?먯꽌 ?ъ궗?⑺븷 ?ㅽ듃?뚰겕??紐낅졊 ?⑦꽩 ?먯젙 helper瑜?異붽??덉뒿?덈떎. - `src/AxCopilot/Services/Agent/ProcessTool.cs` - - 사내 모드에서 `curl`, `Invoke-WebRequest` 등 외부 네트워크 접근 가능성이 높은 명령은 실행 전에 즉시 차단합니다. + - ?щ궡 紐⑤뱶?먯꽌 `curl`, `Invoke-WebRequest` ???몃? ?ㅽ듃?뚰겕 ?묎렐 媛€?μ꽦???믪? 紐낅졊?€ ?ㅽ뻾 ?꾩뿉 利됱떆 李⑤떒?⑸땲?? - `src/AxCopilot/Services/Agent/BuildRunTool.cs` - - 사내 모드에서 `action=custom`은 차단하고, 알려진 네트워크성 명령 패턴도 실행 전에 막습니다. + - ?щ궡 紐⑤뱶?먯꽌 `action=custom`?€ 李⑤떒?섍퀬, ?뚮젮吏??ㅽ듃?뚰겕??紐낅졊 ?⑦꽩???ㅽ뻾 ?꾩뿉 留됱뒿?덈떎. - `src/AxCopilot/Services/Agent/OpenExternalTool.cs` - - 직접 도구 호출 경로에서도 외부 URI 차단이 일관되게 적용되도록 `OperationModePolicy.IsExternalUri(...)`를 사용하도록 정리했습니다. + - 吏곸젒 ?꾧뎄 ?몄텧 寃쎈줈?먯꽌???몃? URI 李⑤떒???쇨??섍쾶 ?곸슜?섎룄濡?`OperationModePolicy.IsExternalUri(...)`瑜??ъ슜?섎룄濡??뺣━?덉뒿?덈떎. - `src/AxCopilot/Views/ChatWindow.xaml.cs` - - `이번 실행 동안 허용` 승인 규칙을 탭 실행 단위로 관리하도록 바꿨습니다. - - 실행 시작과 종료 시 run-scope 승인 캐시를 비우고, 같은 실행 안에서만 동일 범위 접근을 재질문 없이 통과시킵니다. + - `?대쾲 ?ㅽ뻾 ?숈븞 ?덉슜` ?뱀씤 洹쒖튃?????ㅽ뻾 ?⑥쐞濡?愿€由ы븯?꾨줉 諛붽엥?듬땲?? + - ?ㅽ뻾 ?쒖옉怨?醫낅즺 ??run-scope ?뱀씤 罹먯떆瑜?鍮꾩슦怨? 媛숈? ?ㅽ뻾 ?덉뿉?쒕쭔 ?숈씪 踰붿쐞 ?묎렐???ъ쭏臾??놁씠 ?듦낵?쒗궢?덈떎. - `src/AxCopilot/Services/Agent/PermissionModePresentationCatalog.cs` - - 권한 모드 설명을 실제 동작에 맞게 재작성했습니다. + - 沅뚰븳 紐⑤뱶 ?ㅻ챸???ㅼ젣 ?숈옉??留욊쾶 ?ъ옉?깊뻽?듬땲?? - `src/AxCopilot/Views/ChatWindow.PermissionPresentation.cs` - - `권한 건너뛰기` 배너 문구를 사내 모드 예외까지 반영하도록 수정했습니다. + - `沅뚰븳 嫄대꼫?곌린` 諛곕꼫 臾멸뎄瑜??щ궡 紐⑤뱶 ?덉쇅源뚯? 諛섏쁺?섎룄濡??섏젙?덉뒿?덈떎. - `src/AxCopilot/Services/AppStateService.cs` - - 앱 상태 요약의 권한 설명도 동일한 의미론으로 맞췄습니다. + - ???곹깭 ?붿빟??沅뚰븳 ?ㅻ챸???숈씪???섎?濡좎쑝濡?留욎톬?듬땲?? -### 테스트 -- `src/AxCopilot.Tests/Services/OperationModePolicyTests.cs` - - 외부 URI/mailto 차단 - - 네트워크성 shell 명령 감지 - - `ProcessTool` 사내 모드 차단 - - `BuildRunTool` custom 차단 +### ?뚯뒪??- `src/AxCopilot.Tests/Services/OperationModePolicyTests.cs` + - ?몃? URI/mailto 李⑤떒 + - ?ㅽ듃?뚰겕??shell 紐낅졊 媛먯? + - `ProcessTool` ?щ궡 紐⑤뱶 李⑤떒 + - `BuildRunTool` custom 李⑤떒 - `src/AxCopilot.Tests/Services/OperationModeReadinessTests.cs` - - `OpenExternalTool`의 외부 URI scheme 차단 회귀 추가 -- 검증 - - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_permission_policy_cleanup\\ -p:IntermediateOutputPath=obj\\verify_permission_policy_cleanup\\` 경고 0 / 오류 0 - - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "OperationModePolicyTests|OperationModeReadinessTests|AgentLoopE2ETests" -p:OutputPath=bin\\verify_permission_policy_cleanup_tests\\ -p:IntermediateOutputPath=obj\\verify_permission_policy_cleanup_tests\\` 통과 46 - - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "LlmOperationModeTests" -p:OutputPath=bin\\verify_permission_policy_llm_tests\\ -p:IntermediateOutputPath=obj\\verify_permission_policy_llm_tests\\` 통과 3 + - `OpenExternalTool`???몃? URI scheme 李⑤떒 ?뚭? 異붽? +- 寃€利? - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_permission_policy_cleanup\\ -p:IntermediateOutputPath=obj\\verify_permission_policy_cleanup\\` 寃쎄퀬 0 / ?ㅻ쪟 0 + - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "OperationModePolicyTests|OperationModeReadinessTests|AgentLoopE2ETests" -p:OutputPath=bin\\verify_permission_policy_cleanup_tests\\ -p:IntermediateOutputPath=obj\\verify_permission_policy_cleanup_tests\\` ?듦낵 46 + - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "LlmOperationModeTests" -p:OutputPath=bin\\verify_permission_policy_llm_tests\\ -p:IntermediateOutputPath=obj\\verify_permission_policy_llm_tests\\` ?듦낵 3 -업데이트: 2026-04-15 16:40 (KST) +?낅뜲?댄듃: 2026-04-15 16:40 (KST) -### 사내 모드 외부 LLM 범위 고정 +### ?щ궡 紐⑤뱶 ?몃? LLM 踰붿쐞 怨좎젙 - `src/AxCopilot.Tests/Services/LlmOperationModeTests.cs` - - 인코딩이 깨져 있던 기존 테스트를 UTF-8 기준으로 정리했습니다. - - 사내 모드에서 `Gemini`, `Claude`만 외부 LLM 차단 대상으로 보고, `Ollama`, `vLLM`은 차단 가드를 통과해야 한다는 회귀 테스트를 추가했습니다. -- 정책 기준 - - 외부 LLM: `Gemini`, `Claude` - - 사내/사외 모두 허용: `Ollama`, `vLLM` -- 검증 - - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_internal_llm_scope\\ -p:IntermediateOutputPath=obj\\verify_internal_llm_scope\\` 경고 0 / 오류 0 - - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "LlmOperationModeTests" -p:OutputPath=bin\\verify_internal_llm_scope_tests\\ -p:IntermediateOutputPath=obj\\verify_internal_llm_scope_tests\\` 통과 5 + - ?몄퐫?⑹씠 源⑥졇 ?덈뜕 湲곗〈 ?뚯뒪?몃? UTF-8 湲곗??쇰줈 ?뺣━?덉뒿?덈떎. + - ?щ궡 紐⑤뱶?먯꽌 `Gemini`, `Claude`留??몃? LLM 李⑤떒 ?€?곸쑝濡?蹂닿퀬, `Ollama`, `vLLM`?€ 李⑤떒 媛€?쒕? ?듦낵?댁빞 ?쒕떎???뚭? ?뚯뒪?몃? 異붽??덉뒿?덈떎. +- ?뺤콉 湲곗? + - ?몃? LLM: `Gemini`, `Claude` + - ?щ궡/?ъ쇅 紐⑤몢 ?덉슜: `Ollama`, `vLLM` +- 寃€利? - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_internal_llm_scope\\ -p:IntermediateOutputPath=obj\\verify_internal_llm_scope\\` 寃쎄퀬 0 / ?ㅻ쪟 0 + - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "LlmOperationModeTests" -p:OutputPath=bin\\verify_internal_llm_scope_tests\\ -p:IntermediateOutputPath=obj\\verify_internal_llm_scope_tests\\` ?듦낵 5 + diff --git a/src/AxCopilot.Tests/Core/ContextManagerTests.cs b/src/AxCopilot.Tests/Core/ContextManagerTests.cs index adae478..1e24456 100644 --- a/src/AxCopilot.Tests/Core/ContextManagerTests.cs +++ b/src/AxCopilot.Tests/Core/ContextManagerTests.cs @@ -1,6 +1,7 @@ using AxCopilot.Core; using AxCopilot.Models; using FluentAssertions; +using System.IO; using Xunit; namespace AxCopilot.Tests.Core; @@ -154,4 +155,196 @@ public class ContextManagerTests BrowserWorkspaceStateHelper.ShouldLaunchNewWindow(snapshot, candidate).Should().BeFalse(); } + + [Fact] + public void AppLaunchPlan_CreatesExplorerWindowWithCapturedFolder() + { + using var folder1 = new TempDirectory(); + using var folder2 = new TempDirectory(); + + var state = new AppWindowState + { + Kind = "explorer", + PrimaryPath = folder1.Path, + Paths = [folder1.Path, folder2.Path] + }; + + var plan = AppWorkspaceStateHelper.CreateLaunchPlan( + @"C:\Windows\explorer.exe", + state); + + plan.Should().NotBeNull(); + plan!.Arguments.Should().ContainSingle() + .Which.Should().Be(folder1.Path); + } + + [Fact] + public void AppLaunchPlan_CreatesNotepadWindowWithCapturedFiles() + { + using var file1 = new TempFile(".txt"); + using var file2 = new TempFile(".log"); + + var state = new AppWindowState + { + Kind = "notepad", + PrimaryPath = file1.Path, + Paths = [file1.Path, file2.Path] + }; + + var plan = AppWorkspaceStateHelper.CreateLaunchPlan( + @"C:\Windows\System32\notepad.exe", + state); + + plan.Should().NotBeNull(); + plan!.Arguments.Should().ContainInOrder(file1.Path, file2.Path); + } + + [Fact] + public void AppLaunchPlan_UsesSystemExecutableFallbackForPackagedNotepad() + { + using var file1 = new TempFile(".txt"); + + var state = new AppWindowState + { + Kind = "notepad", + PrimaryPath = file1.Path, + Paths = [file1.Path] + }; + + var plan = AppWorkspaceStateHelper.CreateLaunchPlan( + @"C:\Program Files\WindowsApps\Microsoft.WindowsNotepad_11.2401.32.0_x64__8wekyb3d8bbwe\Notepad.exe", + state); + + plan.Should().NotBeNull(); + plan!.FileName.Should().Be("notepad.exe"); + } + + [Fact] + public void AppShouldLaunchNewWindow_WithCapturedStateAndDifferentTitle_ReturnsTrue() + { + using var folder = new TempDirectory(); + + var snapshot = new WindowSnapshot + { + Exe = @"C:\Windows\explorer.exe", + Title = "문서 - 파일 탐색기", + AppState = new AppWindowState + { + Kind = "explorer", + PrimaryPath = folder.Path, + Paths = [folder.Path] + } + }; + + var candidate = new ContextManager.WindowCandidate( + new IntPtr(7), + snapshot.Exe, + "다운로드 - 파일 탐색기"); + + AppWorkspaceStateHelper.ShouldLaunchNewWindow(snapshot, candidate).Should().BeTrue(); + } + + [Fact] + public void AppShouldLaunchNewWindow_WithCapturedStateAndExactTitle_ReturnsFalse() + { + var snapshot = new WindowSnapshot + { + Exe = @"C:\Windows\System32\notepad.exe", + Title = "todo.txt - 메모장", + AppState = new AppWindowState + { + Kind = "notepad", + PrimaryPath = @"C:\Temp\todo.txt", + Paths = [@"C:\Temp\todo.txt"] + } + }; + + var candidate = new ContextManager.WindowCandidate( + new IntPtr(8), + snapshot.Exe, + "todo.txt - 메모장"); + + AppWorkspaceStateHelper.ShouldLaunchNewWindow(snapshot, candidate).Should().BeFalse(); + } + + [Fact] + public void CalculateRestoreLaunchDelayMs_Disabled_ReturnsZero() + { + var settings = new LauncherSettings + { + EnableAdaptiveWorkspaceRestoreThrottle = false, + WorkspaceRestoreBaseDelayMs = 250, + WorkspaceRestoreMaxDelayMs = 1200 + }; + + var delay = ContextManager.CalculateRestoreLaunchDelayMs(settings, 85, 92, 3); + + delay.Should().Be(0); + } + + [Fact] + public void CalculateRestoreLaunchDelayMs_HighLoadIncreasesDelay() + { + var settings = new LauncherSettings + { + EnableAdaptiveWorkspaceRestoreThrottle = true, + WorkspaceRestoreBaseDelayMs = 250, + WorkspaceRestoreMaxDelayMs = 1200 + }; + + var lowLoadDelay = ContextManager.CalculateRestoreLaunchDelayMs(settings, 20, 45, 1); + var highLoadDelay = ContextManager.CalculateRestoreLaunchDelayMs(settings, 88, 91, 4); + + lowLoadDelay.Should().Be(250); + highLoadDelay.Should().BeGreaterThan(lowLoadDelay); + highLoadDelay.Should().BeLessOrEqualTo(1200); + } + + private sealed class TempFile : IDisposable + { + public TempFile(string extension) + { + Path = System.IO.Path.ChangeExtension(System.IO.Path.GetTempFileName(), extension); + File.WriteAllText(Path, "temp"); + } + + public string Path { get; } + + public void Dispose() + { + try + { + if (File.Exists(Path)) + File.Delete(Path); + } + catch + { + // 테스트 정리 실패는 무시합니다. + } + } + } + + private sealed class TempDirectory : IDisposable + { + public TempDirectory() + { + Path = System.IO.Path.Combine(System.IO.Path.GetTempPath(), $"axcopilot-test-{Guid.NewGuid():N}"); + Directory.CreateDirectory(Path); + } + + public string Path { get; } + + public void Dispose() + { + try + { + if (Directory.Exists(Path)) + Directory.Delete(Path, true); + } + catch + { + // 테스트 정리 실패는 무시합니다. + } + } + } } diff --git a/src/AxCopilot.Tests/Services/SettingsServiceTests.cs b/src/AxCopilot.Tests/Services/SettingsServiceTests.cs index e5cf868..4699587 100644 --- a/src/AxCopilot.Tests/Services/SettingsServiceTests.cs +++ b/src/AxCopilot.Tests/Services/SettingsServiceTests.cs @@ -40,6 +40,21 @@ public class SettingsServiceTests new LauncherSettings().EnableBrowserSessionRestore.Should().BeTrue(); } + [Fact] + public void LauncherSettings_DefaultAdaptiveWorkspaceRestoreThrottle_IsEnabled() + { + new LauncherSettings().EnableAdaptiveWorkspaceRestoreThrottle.Should().BeTrue(); + } + + [Fact] + public void LauncherSettings_DefaultWorkspaceRestoreDelayRange_IsValid() + { + var settings = new LauncherSettings(); + + settings.WorkspaceRestoreBaseDelayMs.Should().Be(250); + settings.WorkspaceRestoreMaxDelayMs.Should().BeGreaterOrEqualTo(settings.WorkspaceRestoreBaseDelayMs); + } + [Fact] public void AppSettings_DefaultMonitorMismatch_IsWarn() { @@ -244,6 +259,39 @@ public class SettingsServiceTests "https://portal.example.com"); } + [Fact] + public void WorkspaceProfile_Serialization_PreservesAppState() + { + var profile = new WorkspaceProfile + { + Name = "앱 상태 프로필", + Windows = + [ + new() + { + Exe = "explorer.exe", + Title = "문서 - 파일 탐색기", + AppState = new AppWindowState + { + Kind = "explorer", + PrimaryPath = @"C:\Docs", + ActivePathIndex = 0, + Paths = [@"C:\Docs", @"C:\Docs\Archive"] + } + } + ] + }; + + var json = JsonSerializer.Serialize(profile, JsonOptions); + var restored = JsonSerializer.Deserialize(json, JsonOptions)!; + + restored.Windows.Should().HaveCount(1); + restored.Windows[0].AppState.Should().NotBeNull(); + restored.Windows[0].AppState!.Kind.Should().Be("explorer"); + restored.Windows[0].AppState!.PrimaryPath.Should().Be(@"C:\Docs"); + restored.Windows[0].AppState!.Paths.Should().ContainInOrder(@"C:\Docs", @"C:\Docs\Archive"); + } + // ─── ClipboardTransformer ──────────────────────────────────────────────── [Fact] diff --git a/src/AxCopilot/Core/AppWorkspaceStateHelper.cs b/src/AxCopilot/Core/AppWorkspaceStateHelper.cs new file mode 100644 index 0000000..66a0c4c --- /dev/null +++ b/src/AxCopilot/Core/AppWorkspaceStateHelper.cs @@ -0,0 +1,291 @@ +using System.IO; +using System.Runtime.InteropServices; +using System.Web; +using AxCopilot.Models; +using AxCopilot.Services; + +namespace AxCopilot.Core; + +internal static class AppWorkspaceStateHelper +{ + public static AppWindowState? TryCapture(IntPtr hWnd, string exePath, string title) + { + var exeName = NormalizeExeName(Path.GetFileNameWithoutExtension(exePath) ?? string.Empty); + return exeName switch + { + "explorer" => TryCaptureExplorer(hWnd, title), + "notepad" => TryCaptureNotepad(hWnd), + _ => null + }; + } + + internal static bool ShouldLaunchNewWindow(WindowSnapshot snapshot, ContextManager.WindowCandidate? candidate) + { + if (!HasRestorableState(snapshot.AppState)) + return false; + + return candidate is null || !BrowserWorkspaceStateHelper.TitlesRepresentSameWindow(snapshot.Title, candidate.Value.Title); + } + + internal static AppLaunchPlan? CreateLaunchPlan(string exePath, AppWindowState? state) + { + if (string.IsNullOrWhiteSpace(exePath) || state == null) + return null; + + return NormalizeKind(state.Kind) switch + { + "explorer" => CreateExplorerLaunchPlan(exePath, state), + "notepad" => CreateNotepadLaunchPlan(exePath, state), + _ => null + }; + } + + private static AppWindowState? TryCaptureExplorer(IntPtr hWnd, string title) + { + try + { + var entries = GetExplorerEntries(hWnd) + .Where(entry => Directory.Exists(entry.Path)) + .GroupBy(entry => entry.Path, StringComparer.OrdinalIgnoreCase) + .Select(group => group.First()) + .ToList(); + + if (entries.Count == 0) + return null; + + var activeIndex = entries.FindIndex(entry => TitleRepresentsExplorerEntry(title, entry)); + + if (activeIndex < 0) + activeIndex = 0; + + return new AppWindowState + { + Kind = "explorer", + PrimaryPath = entries[activeIndex].Path, + ActivePathIndex = activeIndex, + Paths = entries.Select(entry => entry.Path).ToList() + }; + } + catch (Exception ex) + { + LogService.Warn($"파일 탐색기 경로 수집 실패: {ex.Message}"); + return null; + } + } + + private static AppWindowState? TryCaptureNotepad(IntPtr hWnd) + { + try + { + GetWindowThreadProcessId(hWnd, out var processId); + if (processId == 0) + return null; + + var commandLine = ProcessCommandLineHelper.TryGetProcessCommandLine((int)processId); + if (string.IsNullOrWhiteSpace(commandLine)) + return null; + + var args = ProcessCommandLineHelper.SplitCommandLine(commandLine); + if (args.Count <= 1) + return null; + + var paths = args + .Skip(1) + .Where(argument => !string.IsNullOrWhiteSpace(argument)) + .Where(argument => !argument.StartsWith("-", StringComparison.Ordinal)) + .Select(argument => argument.Trim().Trim('"')) + .Where(File.Exists) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + if (paths.Count == 0) + return null; + + return new AppWindowState + { + Kind = "notepad", + PrimaryPath = paths[0], + ActivePathIndex = 0, + Paths = paths + }; + } + catch (Exception ex) + { + LogService.Warn($"메모장 파일 경로 수집 실패: {ex.Message}"); + return null; + } + } + + private static IEnumerable GetExplorerEntries(IntPtr hWnd) + { + var shellType = Type.GetTypeFromProgID("Shell.Application"); + if (shellType == null) + yield break; + + dynamic? shell = null; + dynamic? windows = null; + + try + { + shell = Activator.CreateInstance(shellType); + windows = shell?.Windows(); + + if (windows == null) + yield break; + + foreach (var window in windows) + { + string fullName; + string locationUrl; + string locationName; + int windowHwnd; + + try + { + fullName = window.FullName as string ?? string.Empty; + locationUrl = window.LocationURL as string ?? string.Empty; + locationName = window.LocationName as string ?? string.Empty; + windowHwnd = (int)window.HWND; + } + catch + { + continue; + } + + if (windowHwnd != hWnd.ToInt32()) + continue; + + if (!Path.GetFileName(fullName).Equals("explorer.exe", StringComparison.OrdinalIgnoreCase)) + continue; + + var path = TryConvertExplorerUrlToPath(locationUrl); + if (string.IsNullOrWhiteSpace(path)) + continue; + + yield return new ExplorerEntry(path, locationName); + } + } + finally + { + ReleaseComObject(windows); + ReleaseComObject(shell); + } + } + + private static string? TryConvertExplorerUrlToPath(string locationUrl) + { + if (string.IsNullOrWhiteSpace(locationUrl)) + return null; + + if (!Uri.TryCreate(locationUrl, UriKind.Absolute, out var uri)) + return null; + + if (!uri.IsFile) + return null; + + var localPath = HttpUtility.UrlDecode(uri.LocalPath); + return string.IsNullOrWhiteSpace(localPath) ? null : localPath; + } + + private static AppLaunchPlan? CreateExplorerLaunchPlan(string exePath, AppWindowState state) + { + var path = ResolvePrimaryPath(state, Directory.Exists); + if (string.IsNullOrWhiteSpace(path)) + return null; + + return new AppLaunchPlan(ResolveLaunchFileName(exePath, state.Kind), [path]); + } + + private static AppLaunchPlan? CreateNotepadLaunchPlan(string exePath, AppWindowState state) + { + var paths = state.Paths + .Where(File.Exists) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + if (paths.Count == 0 && File.Exists(state.PrimaryPath)) + paths.Add(state.PrimaryPath!); + + if (paths.Count == 0) + return null; + + return new AppLaunchPlan(ResolveLaunchFileName(exePath, state.Kind), paths); + } + + private static bool HasRestorableState(AppWindowState? state) + { + if (state == null) + return false; + + return NormalizeKind(state.Kind) switch + { + "explorer" => !string.IsNullOrWhiteSpace(ResolvePrimaryPath(state, Directory.Exists)), + "notepad" => state.Paths.Any(File.Exists) || File.Exists(state.PrimaryPath), + _ => false + }; + } + + private static string? ResolvePrimaryPath(AppWindowState state, Func exists) + { + if (!string.IsNullOrWhiteSpace(state.PrimaryPath) && exists(state.PrimaryPath)) + return state.PrimaryPath; + + return state.Paths.FirstOrDefault(exists); + } + + private static string NormalizeExeName(string exeName) => exeName.Trim().ToLowerInvariant(); + + private static string NormalizeKind(string kind) => kind.Trim().ToLowerInvariant(); + + private static bool TitleRepresentsExplorerEntry(string title, ExplorerEntry entry) + { + if (string.IsNullOrWhiteSpace(title)) + return false; + + if (!string.IsNullOrWhiteSpace(entry.LocationName) && + title.Contains(entry.LocationName, StringComparison.OrdinalIgnoreCase)) + return true; + + if (title.Contains(entry.Path, StringComparison.OrdinalIgnoreCase)) + return true; + + var folderName = Path.GetFileName(entry.Path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)); + return !string.IsNullOrWhiteSpace(folderName) && + title.Contains(folderName, StringComparison.OrdinalIgnoreCase); + } + + private static string ResolveLaunchFileName(string exePath, string kind) + { + if (!string.IsNullOrWhiteSpace(exePath) && File.Exists(exePath)) + return exePath; + + return NormalizeKind(kind) switch + { + "explorer" => "explorer.exe", + "notepad" => "notepad.exe", + _ => exePath + }; + } + + private static void ReleaseComObject(object? instance) + { + if (instance == null || !Marshal.IsComObject(instance)) + return; + + try + { + Marshal.FinalReleaseComObject(instance); + } + catch + { + // COM 해제 실패는 저장/복원을 중단하지 않습니다. + } + } + + [DllImport("user32.dll")] + private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId); + + private sealed record ExplorerEntry(string Path, string LocationName); +} + +internal sealed record AppLaunchPlan(string FileName, IReadOnlyList Arguments); diff --git a/src/AxCopilot/Core/BrowserWorkspaceStateHelper.cs b/src/AxCopilot/Core/BrowserWorkspaceStateHelper.cs index 667a2f0..6a10554 100644 --- a/src/AxCopilot/Core/BrowserWorkspaceStateHelper.cs +++ b/src/AxCopilot/Core/BrowserWorkspaceStateHelper.cs @@ -1,5 +1,4 @@ using System.IO; -using System.Management; using System.Runtime.InteropServices; using System.Windows.Automation; using AxCopilot.Models; @@ -191,79 +190,23 @@ internal static class BrowserWorkspaceStateHelper if (string.IsNullOrWhiteSpace(commandLine)) return; - var args = SplitCommandLine(commandLine); + var args = ProcessCommandLineHelper.SplitCommandLine(commandLine); if (args.Count == 0) return; if (state.Kind == "firefox") { - state.UserDataDir = GetArgumentValue(args, "-profile"); - state.ProfileDirectory = GetArgumentValue(args, "-P"); + state.UserDataDir = ProcessCommandLineHelper.GetArgumentValue(args, "-profile"); + state.ProfileDirectory = ProcessCommandLineHelper.GetArgumentValue(args, "-P"); return; } - state.UserDataDir = GetArgumentValue(args, "--user-data-dir"); - state.ProfileDirectory = GetArgumentValue(args, "--profile-directory"); + state.UserDataDir = ProcessCommandLineHelper.GetArgumentValue(args, "--user-data-dir"); + state.ProfileDirectory = ProcessCommandLineHelper.GetArgumentValue(args, "--profile-directory"); } private static string? TryGetProcessCommandLine(int processId) - { - try - { - using var searcher = new ManagementObjectSearcher( - $"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {processId}"); - using var results = searcher.Get(); - - foreach (ManagementObject process in results) - return process["CommandLine"]?.ToString(); - } - catch (Exception ex) - { - LogService.Warn($"프로세스 명령줄 조회 실패: PID={processId} - {ex.Message}"); - } - - return null; - } - - private static List SplitCommandLine(string commandLine) - { - var argv = CommandLineToArgvW(commandLine, out var argc); - if (argv == IntPtr.Zero || argc <= 0) - return new List(); - - try - { - var args = new List(argc); - for (var i = 0; i < argc; i++) - { - var value = Marshal.ReadIntPtr(argv, i * IntPtr.Size); - args.Add(Marshal.PtrToStringUni(value) ?? string.Empty); - } - - return args; - } - finally - { - LocalFree(argv); - } - } - - private static string? GetArgumentValue(IReadOnlyList args, string key) - { - for (var i = 1; i < args.Count; i++) - { - var current = args[i]; - if (current.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase)) - return current[(key.Length + 1)..].Trim().Trim('"'); - - if (!current.Equals(key, StringComparison.OrdinalIgnoreCase) || i + 1 >= args.Count) - continue; - - return args[i + 1].Trim().Trim('"'); - } - - return null; - } + => ProcessCommandLineHelper.TryGetProcessCommandLine(processId); private static void CaptureTabs(IntPtr hWnd, BrowserWindowState state) { @@ -616,13 +559,6 @@ internal static class BrowserWorkspaceStateHelper [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); - [DllImport("shell32.dll", SetLastError = true)] - private static extern IntPtr CommandLineToArgvW( - [MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, - out int pNumArgs); - - [DllImport("kernel32.dll")] - private static extern IntPtr LocalFree(IntPtr hMem); } internal sealed record BrowserLaunchPlan(string FileName, IReadOnlyList Arguments); diff --git a/src/AxCopilot/Core/ContextManager.cs b/src/AxCopilot/Core/ContextManager.cs index 0e65ce6..5f031e5 100644 --- a/src/AxCopilot/Core/ContextManager.cs +++ b/src/AxCopilot/Core/ContextManager.cs @@ -12,8 +12,43 @@ namespace AxCopilot.Core; /// public class ContextManager { + private static volatile PerformanceCounter? _workspaceRestoreCpuCounter; + private static readonly object WorkspaceRestoreCpuLock = new(); + private static float _workspaceRestoreCpuCached = -1; + private static DateTime _workspaceRestoreCpuUpdated = DateTime.MinValue; private readonly SettingsService _settings; + static ContextManager() + { + AppDomain.CurrentDomain.ProcessExit += (_, _) => + { + try + { + _workspaceRestoreCpuCounter?.Dispose(); + } + catch + { + // 종료 시 정리 실패는 무시합니다. + } + + _workspaceRestoreCpuCounter = null; + }; + + _ = Task.Run(() => + { + try + { + var counter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); + counter.NextValue(); + _workspaceRestoreCpuCounter = counter; + } + catch + { + // 일부 환경에서는 PerformanceCounter를 지원하지 않을 수 있습니다. + } + }); + } + public ContextManager(SettingsService settings) { _settings = settings; @@ -59,10 +94,13 @@ public class ContextManager int monitorIndex = GetMonitorIndex(hWnd, monitorMap); BrowserWindowState? browserState = null; + AppWindowState? appState = null; if (shouldCaptureBrowserState) browserState = BrowserWorkspaceStateHelper.TryCapture(hWnd, exePath); + appState = AppWorkspaceStateHelper.TryCapture(hWnd, exePath, title); + snapshots.Add(new WindowSnapshot { Exe = exePath, @@ -76,7 +114,8 @@ public class ContextManager }, ShowCmd = showCmd, Monitor = monitorIndex, - Browser = browserState + Browser = browserState, + AppState = appState }); return true; @@ -117,6 +156,7 @@ public class ContextManager var results = new List(); var monitorCount = GetMonitorCount(); var usedHandles = new HashSet(); + var launchedWindowCount = 0; foreach (var snapshot in profile.Windows) { @@ -125,10 +165,11 @@ public class ContextManager // 1. 실행 중인 창 찾기 var matchedCandidate = FindMatchingWindowCandidate(snapshot, usedHandles); var hWnd = matchedCandidate?.Handle ?? IntPtr.Zero; - var launchedBrowserWindow = false; + var launchedSpecialWindow = false; - // 2. 브라우저 상태가 있으면 새 창 복원을 우선 시도 - if (File.Exists(snapshot.Exe) && BrowserWorkspaceStateHelper.ShouldLaunchNewWindow(snapshot, matchedCandidate)) + // 2. 브라우저/탐색기/메모장 상태가 있으면 새 창 복원을 우선 시도 + if (BrowserWorkspaceStateHelper.ShouldLaunchNewWindow(snapshot, matchedCandidate) || + AppWorkspaceStateHelper.ShouldLaunchNewWindow(snapshot, matchedCandidate)) { try { @@ -136,9 +177,11 @@ public class ContextManager .Select(candidate => candidate.Handle) .ToHashSet(); - launchedBrowserWindow = LaunchBrowserWindow(snapshot); - if (launchedBrowserWindow) + await ApplyRestoreLaunchThrottleAsync(launchedWindowCount, ct); + launchedSpecialWindow = LaunchSpecialWindow(snapshot); + if (launchedSpecialWindow) { + launchedWindowCount++; hWnd = await WaitForLaunchedWindowAsync( snapshot, preLaunchHandles, @@ -159,11 +202,13 @@ public class ContextManager } // 3. 창이 없으면 EXE 실행 후 대기 - if (hWnd == IntPtr.Zero && !launchedBrowserWindow && File.Exists(snapshot.Exe)) + if (hWnd == IntPtr.Zero && !launchedSpecialWindow && File.Exists(snapshot.Exe)) { try { + await ApplyRestoreLaunchThrottleAsync(launchedWindowCount, ct); Process.Start(new ProcessStartInfo(snapshot.Exe) { UseShellExecute = true }); + launchedWindowCount++; hWnd = await WaitForWindowAsync(snapshot, usedHandles, TimeSpan.FromSeconds(3), ct); } catch (Exception ex) @@ -212,7 +257,7 @@ public class ContextManager SWP_NOZORDER | SWP_NOACTIVATE); } - if (launchedBrowserWindow && snapshot.Browser != null) + if (launchedSpecialWindow && snapshot.Browser != null) BrowserWorkspaceStateHelper.TryRestoreActiveTab(hWnd, snapshot.Browser); results.Add($"✓ {snapshot.Title}: 복원 완료"); @@ -309,22 +354,129 @@ public class ContextManager return IntPtr.Zero; } - private static bool LaunchBrowserWindow(WindowSnapshot snapshot) + private async Task ApplyRestoreLaunchThrottleAsync(int launchedWindowCount, CancellationToken ct) { - var plan = BrowserWorkspaceStateHelper.CreateLaunchPlan(snapshot.Exe, snapshot.Browser); - if (plan == null) - return false; + var delayMs = GetRestoreLaunchDelayMs(_settings.Settings.Launcher, launchedWindowCount); + if (delayMs <= 0) + return; - var startInfo = new ProcessStartInfo(plan.FileName) + await Task.Delay(delayMs, ct); + } + + private static int GetRestoreLaunchDelayMs(LauncherSettings settings, int launchedWindowCount) + { + if (launchedWindowCount <= 0 || !settings.EnableAdaptiveWorkspaceRestoreThrottle) + return 0; + + return CalculateRestoreLaunchDelayMs( + settings, + GetWorkspaceRestoreCpuUsagePercent(), + GetWorkspaceRestoreMemoryLoadPercent(), + launchedWindowCount); + } + + internal static int CalculateRestoreLaunchDelayMs( + LauncherSettings settings, + float cpuUsagePercent, + uint memoryLoadPercent, + int launchedWindowCount) + { + if (launchedWindowCount <= 0 || !settings.EnableAdaptiveWorkspaceRestoreThrottle) + return 0; + + var baseDelay = Math.Clamp(settings.WorkspaceRestoreBaseDelayMs, 0, 3000); + var maxDelay = Math.Max(baseDelay, Math.Clamp(settings.WorkspaceRestoreMaxDelayMs, 0, 5000)); + var delay = baseDelay; + + if (launchedWindowCount > 1) + delay += Math.Min((launchedWindowCount - 1) * 120, 600); + + if (cpuUsagePercent >= 80f) + delay += 550; + else if (cpuUsagePercent >= 65f) + delay += 350; + else if (cpuUsagePercent >= 50f) + delay += 180; + else if (cpuUsagePercent >= 35f) + delay += 80; + + if (memoryLoadPercent >= 90) + delay += 500; + else if (memoryLoadPercent >= 80) + delay += 300; + else if (memoryLoadPercent >= 70) + delay += 150; + + return Math.Clamp(delay, baseDelay, maxDelay); + } + + private static float GetWorkspaceRestoreCpuUsagePercent() + { + try { - UseShellExecute = false, - WorkingDirectory = Path.GetDirectoryName(plan.FileName) ?? Environment.CurrentDirectory + var counter = _workspaceRestoreCpuCounter; + if (counter == null) + return -1; + + lock (WorkspaceRestoreCpuLock) + { + if ((DateTime.UtcNow - _workspaceRestoreCpuUpdated).TotalMilliseconds > 800) + { + _workspaceRestoreCpuCached = counter.NextValue(); + _workspaceRestoreCpuUpdated = DateTime.UtcNow; + } + + return _workspaceRestoreCpuCached; + } + } + catch + { + return -1; + } + } + + private static uint GetWorkspaceRestoreMemoryLoadPercent() + { + var memory = new MEMORYSTATUSEX + { + dwLength = (uint)Marshal.SizeOf() }; - foreach (var argument in plan.Arguments) - startInfo.ArgumentList.Add(argument); + return GlobalMemoryStatusEx(ref memory) ? memory.dwMemoryLoad : 0; + } - Process.Start(startInfo); + private static bool LaunchSpecialWindow(WindowSnapshot snapshot) + { + var browserPlan = BrowserWorkspaceStateHelper.CreateLaunchPlan(snapshot.Exe, snapshot.Browser); + if (browserPlan != null) + { + var startInfo = new ProcessStartInfo(browserPlan.FileName) + { + UseShellExecute = false, + WorkingDirectory = Path.GetDirectoryName(browserPlan.FileName) ?? Environment.CurrentDirectory + }; + + foreach (var argument in browserPlan.Arguments) + startInfo.ArgumentList.Add(argument); + + Process.Start(startInfo); + return true; + } + + var appPlan = AppWorkspaceStateHelper.CreateLaunchPlan(snapshot.Exe, snapshot.AppState); + if (appPlan == null) + return false; + + var appStartInfo = new ProcessStartInfo(appPlan.FileName) + { + UseShellExecute = false, + WorkingDirectory = Path.GetDirectoryName(appPlan.FileName) ?? Environment.CurrentDirectory + }; + + foreach (var argument in appPlan.Arguments) + appStartInfo.ArgumentList.Add(argument); + + Process.Start(appStartInfo); return true; } @@ -561,6 +713,20 @@ public class ContextManager [StructLayout(LayoutKind.Sequential)] private struct POINT { public int x, y; } + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + private struct MEMORYSTATUSEX + { + public uint dwLength; + public uint dwMemoryLoad; + public ulong ullTotalPhys; + public ulong ullAvailPhys; + public ulong ullTotalPageFile; + public ulong ullAvailPageFile; + public ulong ullTotalVirtual; + public ulong ullAvailVirtual; + public ulong ullAvailExtendedVirtual; + } + private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); private delegate bool MonitorEnumProc(IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData); @@ -576,6 +742,9 @@ public class ContextManager [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); [DllImport("user32.dll")] private static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags); [DllImport("user32.dll")] private static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, MonitorEnumProc lpfnEnum, IntPtr dwData); + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); internal readonly record struct WindowCandidate(IntPtr Handle, string Exe, string Title); } diff --git a/src/AxCopilot/Core/ProcessCommandLineHelper.cs b/src/AxCopilot/Core/ProcessCommandLineHelper.cs new file mode 100644 index 0000000..5f712df --- /dev/null +++ b/src/AxCopilot/Core/ProcessCommandLineHelper.cs @@ -0,0 +1,75 @@ +using System.Management; +using System.Runtime.InteropServices; +using AxCopilot.Services; + +namespace AxCopilot.Core; + +internal static class ProcessCommandLineHelper +{ + public static string? TryGetProcessCommandLine(int processId) + { + try + { + using var searcher = new ManagementObjectSearcher( + $"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {processId}"); + using var results = searcher.Get(); + + foreach (ManagementObject process in results) + return process["CommandLine"]?.ToString(); + } + catch (Exception ex) + { + LogService.Warn($"프로세스 명령줄 조회 실패: PID={processId} - {ex.Message}"); + } + + return null; + } + + public static List SplitCommandLine(string commandLine) + { + var argv = CommandLineToArgvW(commandLine, out var argc); + if (argv == IntPtr.Zero || argc <= 0) + return new List(); + + try + { + var args = new List(argc); + for (var i = 0; i < argc; i++) + { + var value = Marshal.ReadIntPtr(argv, i * IntPtr.Size); + args.Add(Marshal.PtrToStringUni(value) ?? string.Empty); + } + + return args; + } + finally + { + LocalFree(argv); + } + } + + public static string? GetArgumentValue(IReadOnlyList args, string key) + { + for (var i = 1; i < args.Count; i++) + { + var current = args[i]; + if (current.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase)) + return current[(key.Length + 1)..].Trim().Trim('"'); + + if (!current.Equals(key, StringComparison.OrdinalIgnoreCase) || i + 1 >= args.Count) + continue; + + return args[i + 1].Trim().Trim('"'); + } + + return null; + } + + [DllImport("shell32.dll", SetLastError = true)] + private static extern IntPtr CommandLineToArgvW( + [MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, + out int pNumArgs); + + [DllImport("kernel32.dll")] + private static extern IntPtr LocalFree(IntPtr hMem); +} diff --git a/src/AxCopilot/Models/AppSettings.cs b/src/AxCopilot/Models/AppSettings.cs index deea71f..3024872 100644 --- a/src/AxCopilot/Models/AppSettings.cs +++ b/src/AxCopilot/Models/AppSettings.cs @@ -235,6 +235,18 @@ public class LauncherSettings [JsonPropertyName("enableBrowserSessionRestore")] public bool EnableBrowserSessionRestore { get; set; } = true; + /// 워크스페이스 복원 시 새 창 실행 간격을 시스템 부하에 맞춰 자동 조절합니다. 기본 true. + [JsonPropertyName("enableAdaptiveWorkspaceRestoreThrottle")] + public bool EnableAdaptiveWorkspaceRestoreThrottle { get; set; } = true; + + /// 워크스페이스 복원 시 새 창 실행 사이의 기본 대기 시간(ms). 기본 250. + [JsonPropertyName("workspaceRestoreBaseDelayMs")] + public int WorkspaceRestoreBaseDelayMs { get; set; } = 250; + + /// 워크스페이스 복원 시 새 창 실행 사이의 최대 대기 시간(ms). 기본 1200. + [JsonPropertyName("workspaceRestoreMaxDelayMs")] + public int WorkspaceRestoreMaxDelayMs { get; set; } = 1200; + /// 단축키 헬프 창에서 아이콘 색상을 테마 AccentColor 기준으로 표시. 기본 true(테마색). [JsonPropertyName("shortcutHelpUseThemeColor")] public bool ShortcutHelpUseThemeColor { get; set; } = true; @@ -402,6 +414,9 @@ public class WindowSnapshot [JsonPropertyName("browser")] public BrowserWindowState? Browser { get; set; } + + [JsonPropertyName("appState")] + public AppWindowState? AppState { get; set; } } public class BrowserWindowState @@ -425,6 +440,21 @@ public class BrowserWindowState public List TabUrls { get; set; } = new(); } +public class AppWindowState +{ + [JsonPropertyName("kind")] + public string Kind { get; set; } = ""; + + [JsonPropertyName("primaryPath")] + public string? PrimaryPath { get; set; } + + [JsonPropertyName("activePathIndex")] + public int ActivePathIndex { get; set; } + + [JsonPropertyName("paths")] + public List Paths { get; set; } = new(); +} + public class WindowRect { [JsonPropertyName("x")] diff --git a/src/AxCopilot/ViewModels/SettingsViewModel.cs b/src/AxCopilot/ViewModels/SettingsViewModel.cs index eca7e95..ae4f5a9 100644 --- a/src/AxCopilot/ViewModels/SettingsViewModel.cs +++ b/src/AxCopilot/ViewModels/SettingsViewModel.cs @@ -182,6 +182,9 @@ public class SettingsViewModel : INotifyPropertyChanged private bool _showWidgetBattery; private bool _showLauncherBottomQuickActions; private bool _enableBrowserSessionRestore; + private bool _enableAdaptiveWorkspaceRestoreThrottle; + private int _workspaceRestoreBaseDelayMs = 250; + private int _workspaceRestoreMaxDelayMs = 1200; private bool _shortcutHelpUseThemeColor; // LLM 공통 설정 @@ -955,6 +958,49 @@ public class SettingsViewModel : INotifyPropertyChanged set { _enableBrowserSessionRestore = value; OnPropertyChanged(); } } + public bool EnableAdaptiveWorkspaceRestoreThrottle + { + get => _enableAdaptiveWorkspaceRestoreThrottle; + set { _enableAdaptiveWorkspaceRestoreThrottle = value; OnPropertyChanged(); } + } + + public int WorkspaceRestoreBaseDelayMs + { + get => _workspaceRestoreBaseDelayMs; + set + { + var clamped = Math.Clamp(value, 0, 3000); + if (_workspaceRestoreBaseDelayMs == clamped) + return; + + _workspaceRestoreBaseDelayMs = clamped; + if (_workspaceRestoreMaxDelayMs < clamped) + { + _workspaceRestoreMaxDelayMs = clamped; + OnPropertyChanged(nameof(WorkspaceRestoreMaxDelayMs)); + } + + OnPropertyChanged(); + } + } + + public int WorkspaceRestoreMaxDelayMs + { + get => _workspaceRestoreMaxDelayMs; + set + { + var clamped = Math.Clamp(value, 0, 5000); + if (clamped < _workspaceRestoreBaseDelayMs) + clamped = _workspaceRestoreBaseDelayMs; + + if (_workspaceRestoreMaxDelayMs == clamped) + return; + + _workspaceRestoreMaxDelayMs = clamped; + OnPropertyChanged(); + } + } + public bool EnableIconAnimation { get => _enableIconAnimation; @@ -1253,6 +1299,9 @@ public class SettingsViewModel : INotifyPropertyChanged _showWidgetBattery = s.Launcher.ShowWidgetBattery; _showLauncherBottomQuickActions = s.Launcher.ShowLauncherBottomQuickActions; _enableBrowserSessionRestore = s.Launcher.EnableBrowserSessionRestore; + _enableAdaptiveWorkspaceRestoreThrottle = s.Launcher.EnableAdaptiveWorkspaceRestoreThrottle; + _workspaceRestoreBaseDelayMs = s.Launcher.WorkspaceRestoreBaseDelayMs; + _workspaceRestoreMaxDelayMs = Math.Max(_workspaceRestoreBaseDelayMs, s.Launcher.WorkspaceRestoreMaxDelayMs); _shortcutHelpUseThemeColor = s.Launcher.ShortcutHelpUseThemeColor; _enableTextAction = s.Launcher.EnableTextAction; // v1.7.1: 파일 대화상자 통합 기본값을 false로 변경 (브라우저 업로드 오작동 방지) @@ -1729,6 +1778,9 @@ public class SettingsViewModel : INotifyPropertyChanged s.Launcher.ShowWidgetBattery = _showWidgetBattery; s.Launcher.ShowLauncherBottomQuickActions = _showLauncherBottomQuickActions; s.Launcher.EnableBrowserSessionRestore = _enableBrowserSessionRestore; + s.Launcher.EnableAdaptiveWorkspaceRestoreThrottle = _enableAdaptiveWorkspaceRestoreThrottle; + s.Launcher.WorkspaceRestoreBaseDelayMs = _workspaceRestoreBaseDelayMs; + s.Launcher.WorkspaceRestoreMaxDelayMs = Math.Max(_workspaceRestoreBaseDelayMs, _workspaceRestoreMaxDelayMs); s.Launcher.ShortcutHelpUseThemeColor = _shortcutHelpUseThemeColor; s.Launcher.EnableTextAction = _enableTextAction; s.Launcher.EnableFileDialogIntegration = _enableFileDialogIntegration; diff --git a/src/AxCopilot/Views/SettingsWindow.xaml b/src/AxCopilot/Views/SettingsWindow.xaml index d117b92..39f8234 100644 --- a/src/AxCopilot/Views/SettingsWindow.xaml +++ b/src/AxCopilot/Views/SettingsWindow.xaml @@ -3076,6 +3076,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +