Commit Graph

60 Commits

Author SHA1 Message Date
d6f1e85cec [Phase 17-C] 훅 이벤트 시스템 확장 및 AgentSettingsPanel 훅 UI
AgentLoopService.Skills.cs:
- RunSkillInForkAsync에 PreSkillExecute 훅 발화 추가 (LLM 호출 직전)
- RunSkillInForkAsync에 PostSkillExecute 훅 발화 추가 (응답 수신 후, fire-and-forget)

ChatWindow.WorkFolder.cs:
- SetWorkFolder()에 CwdChanged 훅 발화 추가 (작업 폴더 변경 시, fire-and-forget)
- toolInput=path로 변경된 경로 훅 컨텍스트에 전달

ChatWindow.SlashCommands.cs:
- InjectSlashCommand() 수정: 잘못된 ResolveSlashCommand/SendUserMessageAsync 호출 제거
- ShowSlashChip + SendMessageAsync 올바른 패턴으로 교체 (빌드 오류 4개 수정)

AgentSettingsPanel.xaml / .xaml.cs:
- 훅 이벤트 섹션 추가: ChkExtendedHooks 토글, HookSummaryText, BtnViewHooks, BtnOpenHookSettings
- RefreshHookSummary(): 이벤트 종류별 활성 훅 수 집계 표시
- BtnViewHooks_Click → InjectSlashCommand("/hooks") 연동
- BtnOpenHookSettings_Click → settings.dat 기본 편집기로 열기

빌드: 경고 0, 오류 0
2026-04-04 13:34:36 +09:00
dab633edd5 [Phase L6] 런처 워크플로우 자동화 확장 완료
MacroEntry/MacroStep 모델 (AppSettings.Models.cs):
- MacroEntry: Id, Name, Description, Steps, CreatedAt
- MacroStep: Type(app/url/folder/notification/cmd), Target, Args, Label, DelayMs
- AppSettings.Macros List<MacroEntry> 추가

Handlers/MacroHandler.cs (170줄 신규):
- prefix=macro, 서브커맨드: new/edit/del/play
- 목록: 단계 미리보기(최대 3단계) 표시
- 재생: Process.Start + 알림 + PowerShell 순서 실행

Views/MacroEditorWindow.xaml (135줄 신규):
- 이름/설명 입력, 열 헤더(유형/대상/표시이름/딜레이)
- 동적 행 ScrollViewer + 하단 단계 추가/저장 버튼

Views/MacroEditorWindow.xaml.cs (230줄 신규):
- StepRowUi 내부 클래스: Grid+TypeButton+TargetBox+LabelBox+DelayBox
- 공유 Popup 타입 선택기(5종): PlacementTarget 동적 설정
- BtnSave: 빈 Target 행 필터링 후 MacroEntry 저장

Handlers/ContextHandler.cs (185줄 신규):
- prefix=ctx, GetForegroundWindow P/Invoke 프로세스 감지
- 5개 컨텍스트 규칙(웹/코드/오피스/탐색기/커뮤니케이션) → 상황별 제안
- Enter 시 Views.LauncherWindow.SetInputText(prefix) 호출

ScheduleEntry 조건 필드 (AppSettings.Models.cs):
- ConditionProcess: 프로세스 이름 (비어있으면 조건 없음)
- ConditionProcessMustRun: true=실행중, false=비실행중

Services/SchedulerService.cs:
- ShouldFire() 확장: Process.GetProcessesByName() 조건 체크

Views/ScheduleEditorWindow.xaml / .cs:
- 조건 섹션 UI: 프로세스명 TextBox + 실행중/비실행중 세그먼트
- LoadFromEntry/BtnSave_Click 조건 필드 연동

App.xaml.cs:
- Phase L6-2 MacroHandler(settings) 등록
- Phase L6-3 ContextHandler() 등록

docs/LAUNCHER_ROADMAP.md:
- Phase L6 섹션 추가 (L6-1~4 전체 )

빌드: 경고 0, 오류 0
2026-04-04 13:24:41 +09:00
e92800165d [Phase L5-6] 자동화 스케줄러 구현 완료
ScheduleEntry 모델 (AppSettings.Models.cs):
- Id(8자 GUID), Name, Enabled, TriggerType(daily/weekdays/weekly/once)
- TriggerTime(HH:mm), WeekDays(List<int>), TriggerDate(nullable), LastRun(nullable)
- ActionType(app/notification), ActionTarget, ActionArgs

AppSettings.cs:
- [JsonPropertyName("schedules")] public List<ScheduleEntry> Schedules 추가

Services/SchedulerService.cs (197줄 신규):
- System.Threading.Timer 30초 간격 백그라운드 체크
- ShouldFire(): ±1분 윈도우, LastRun.Date == today 중복 방지, once 자동 비활성화
- ExecuteAction(): 앱 실행(ProcessStartInfo) / 알림(NotificationService.Notify)
- ComputeNextRun(): 다음 실행 예정 시각 계산 (핸들러·편집기 공유)
- TriggerLabel(): 트리거 유형 표시명 반환

Handlers/ScheduleHandler.cs (171줄 신규):
- prefix="sched", 서브커맨드: new / edit 이름 / del 이름
- 목록: 트리거 라벨·시각·액션 아이콘·다음 실행 시각 표시
- Enter: 활성/비활성 토글 + 저장

Views/ScheduleEditorWindow.xaml (307줄 신규):
- 트리거 유형 4-세그먼트(매일/주중/매주/한번), 요일 7버튼, 날짜 입력
- 액션 2-세그먼트(앱 실행/알림), 앱 경로+찾아보기+인자, 알림 메시지
- 활성화 ToggleSwitch, 저장/취소 하단바

Views/ScheduleEditorWindow.xaml.cs (230줄 신규):
- OnLoaded에서 기존 항목 로드 (편집) 또는 기본값 초기화
- SetTriggerUi(): 세그먼트 색상·WeekDaysPanel/DatePanel 표시 전환
- WeekDay_Click/SetDaySelected(): 요일 다중 토글
- SetActionUi(): 앱경로 패널 / 알림 패널 전환
- BtnSave_Click(): HH:mm 파싱 + 날짜 검증 + ScheduleEntry 생성·수정 저장

App.xaml.cs:
- _schedulerService 필드 + Phase L5-6 등록 블록 추가
- schedulerService.Start() 호출

docs/LAUNCHER_ROADMAP.md:
- L5-6  완료 표시 + 구현 내용 상세 기록

빌드: 경고 0, 오류 0
2026-04-04 13:07:12 +09:00
2d3e5f6a72 [Phase L5-4] 앱 세션 스냅 (session) 구현
AppSettings.Models.cs (수정):
- AppSession 클래스 신규: Name/Description/Apps/CreatedAt
- SessionApp 클래스 신규: Path/Arguments/Label/SnapPosition/DelayMs
- 스냅 위치 14종: full/left/right/tl~br/center/third-l/c/r/two3-l/r/none

AppSettings.cs (수정):
- [JsonPropertyName("appSessions")] AppSessions 리스트 추가

SessionHandler.cs (신규, ~160줄):
- prefix="session", GetItemsAsync: 목록+필터, new/edit/del 서브커맨드
- ExecuteAsync: 편집기 열기 또는 LaunchSessionAsync 실행
- LaunchSessionAsync: Process.Start → 창 핸들 대기(최대 6초 폴링) → ApplySnapToWindow
- ApplySnapToWindow: P/Invoke(SetWindowPos, ShowWindow, MonitorFromWindow, GetMonitorInfo) + 14종 스냅 좌표 계산

SessionEditorWindow.xaml (신규, ~200줄):
- 타이틀바 + 세션명·설명 TextBox + 앱 목록 영역 + 하단 버튼 바
- SnapPickerPopup: PlacementTarget 코드에서 동적 지정, ContentControl에 StackPanel 14개 옵션

SessionEditorWindow.xaml.cs (신규, ~240줄):
- AppRowUi 내부 모델: Path/Label/SnapPosition/Args/DelayMs + SnapLabelRef 갱신
- BuildRowGrid(): 경로TextBox + 라벨TextBox + 스냅Border(팝업) + 삭제Border
- BtnAddApp: OpenFileDialog → 자동 라벨(파일명)
- BtnSave: 유효 행 필터 → AppSession 구성 → 기존 교체 또는 신규 추가 → Save()

App.xaml.cs (수정):
- Phase L5-4 섹션에 SessionHandler 등록

docs/LAUNCHER_ROADMAP.md (수정):
- L5-4 항목  완료 표시 + 구현 상세 기록

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 12:54:24 +09:00
375ea0566d [Phase L5-5] 배치 파일 이름변경 (batchren) 구현
BatchRenameHandler.cs (신규, ~55줄):
- prefix="batchren" 핸들러, batchren [glob패턴] 으로 파일 미리 로드
- ExecuteAsync: BatchRenameWindow 열기 + 초기 경로 패턴 지정 지원

BatchRenameWindow.xaml (신규, ~380줄):
- 타이틀바(파일 수 배지) + 패턴 입력 영역 + DataGrid 미리보기 + 하단 버튼 바
- 변수 힌트 팝업: {name}/{n}/{n:3}/{date}/{date:format}/{ext}/정규식 설명
- 빈 상태 안내 패널, 드래그 앤 드롭 오버레이
- DataGrid 3열: 원본 파일명 / 새 파일명 / 상태(✓·⚠ 충돌·─)
- 충돌 행: 붉은 배경(#18EF5350) 강조

BatchRenameWindow.xaml.cs (신규, ~280줄):
- RenameEntry (INotifyPropertyChanged): OriginalPath/Name/NewName/HasConflict/StatusText
- ApplyPattern(): {n:자릿수} 패딩, {date:format}, {name}/{ext} 치환, 정규식 /rx/repl/ 모드
- UpdatePreviews(): 전체 패턴 재계산 + 충돌 감지(중복 새 이름 & 기존 파일 존재)
- AddFiles(), BtnAddFolder/Files/RemoveSelected/ClearAll 이벤트
- ExtToggle: 확장자 유지 슬라이드 토글
- BtnModeVar/Regex: 변수 ↔ 정규식 모드 전환 (UI 색상 갱신)
- StartNumberBox: 시작 번호 지정
- 드래그 앤 드롭: 파일/폴더 모두 처리
- BtnApply: File.Move 적용 후 엔트리 경로 갱신, 성공/실패 알림

App.xaml.cs (수정):
- Phase L5 섹션에 BatchRenameHandler 등록

docs/LAUNCHER_ROADMAP.md (수정):
- L5-5 항목  완료 표시 + 구현 상세 기록

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 12:42:24 +09:00
3bfa82c06d [Phase L5-3] QuickLook 인라인 편집 기능 구현
QuickLookWindow.xaml:
- 타이틀바 우측에 ✏ 편집 버튼(BtnEdit) 추가 (텍스트 파일일 때만 Visible)
  - 닫기 버튼과 StackPanel으로 묶음, 호버 시 #28FFFFFF 배경
- TextEditBox (TextBox) 추가 — TextScrollViewer와 동일 위치(Grid.Row=1)
  - Cascadia Code 12px, Border 없음, AcceptsReturn/Tab, 기본 Collapsed
  - TextChanged → TextEditBox_TextChanged 이벤트 연결

QuickLookWindow.xaml.cs:
- 편집 상태 필드: _currentFilePath, _currentFileExt, _isEditMode, _isModified, _suppressTextChanged
- LoadPreview() 수정:
  - _currentFilePath/_currentFileExt 저장
  - TextExts 파일일 때만 BtnEdit.Visibility=Visible
- BtnEdit_Click / BtnEdit_Click → ToggleEditMode()
- TextEditBox_TextChanged → _isModified=true, 파일명에 "● " 마커 추가
- OnKeyDown 확장:
  - 편집 모드: Ctrl+S(저장), Ctrl+E(토글), Esc(미저장 확인)
  - 미리보기 모드: Ctrl+E(편집 모드 진입)
  - BtnClose_Click: 미저장 확인 후 닫기
- EnterEditMode(): 파일 전체 읽기(300줄 제한 없음), TextEditBox 표시, 아이콘→👁, 상태바 힌트
- ExitEditMode(): TextScrollViewer 복원, 아이콘→✏, ReloadPreview() 호출
- SaveEditedFile(): File.WriteAllText(UTF8), ● 마커 제거, 상태바 갱신, 완료 알림
- ReloadPreview(): 저장 후 PreviewText 새로고침 (편집 내용 반영)

HelpDetailWindow.Shortcuts.cs:
- "기타 창" 카테고리에 "Ctrl+E (QuickLook)" 및 "Ctrl+S (QuickLook 편집 중)" 단축키 추가

docs/LAUNCHER_ROADMAP.md:
- L5-3  완료 표시

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 12:25:25 +09:00
ce02343624 [Phase L5-2] OCR 화면 텍스트 추출 기능 구현
OcrHandler.cs 신규 생성 (Handlers/, 220줄):
- prefix="ocr" — "화면 영역 텍스트 추출" / "클립보드 이미지 텍스트 추출" 2가지 옵션
- ExecuteRegionOcrAsync(): 180ms 대기 → 전체 화면 캡처 → RegionSelectWindow 오버레이 → 영역 크롭
- ExecuteClipboardOcrAsync(): 클립보드 BitmapSource → System.Drawing.Bitmap 변환 → OCR
- RunOcrOnBitmapAsync(): Bitmap → 임시 PNG → WinStorageFile → WinBitmapDecoder → WinOcrEngine.RecognizeAsync()
  (기존 ClipboardHistoryService.ImageCache.cs 패턴 재사용, 5,000자 상한)
- HandleOcrResult(): 클립보드 복사 + 런처 입력창 자동 채움 + 완료 알림

App.xaml.cs:
- OcrHandler 등록 (Phase L5-2 주석)

LauncherWindow.Keyboard.cs:
- F4 키: 런처 Hide → OcrHandler.__ocr_region__ 즉시 실행 (백그라운드 Task)

HelpDetailWindow.Shortcuts.cs:
- F4 단축키 항목 추가 (F3 바로 다음, 아이콘 \uE8D2, 색상 #0F766E)

HelpDetailWindow.xaml.cs:
- "런처 탐색" 카테고리에 F4/OCR 항목 추가

Services/L10n.cs:
- Phase L5 신기능 팁 5종 추가 (OCR F4, ocr 예약어, 전용 핫키 설정, hotkey 예약어, OCR 입력창 채움)

docs/LAUNCHER_ROADMAP.md:
- L5-2  완료 표시

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 12:19:13 +09:00
c12e863e3a [Phase L5-1] 항목별 전용 핫키 기능 구현
HotkeyAssignment 모델 추가 (AppSettings.Models.cs):
- Hotkey, Target, Label, Type 필드 (app/url/folder/command)
- AppSettings.CustomHotkeys (List<HotkeyAssignment>) 추가

InputListener.cs 확장 (Core/):
- _customHotkeys 목록 (스레드 안전 lock)
- UpdateCustomHotkeys() 메서드 — 설정 저장 후 즉시 갱신
- CustomHotkeyTriggered 이벤트 (CustomHotkeyEventArgs: Target, Type)
- WH_KEYBOARD_LL 콜백에 전용 핫키 감지 분기 추가

HotkeyHandler.cs 신규 생성 (Handlers/, 140줄):
- prefix="hotkey" — 등록 목록 표시 / 설정 열기
- ExecuteHotkeyTarget() — app/url/folder/command 타입별 실행

App.xaml.cs + App.Settings.cs:
- HotkeyHandler 등록 (Phase L5 주석)
- OnCustomHotkeyTriggered 이벤트 핸들러 연결
- 설정 저장 시 UpdateCustomHotkeys() 호출

SettingsViewModel 3파일 업데이트:
- HotkeyRowModel (Properties.cs): Hotkey/Target/Label/Type + TypeSymbol
- CustomHotkeys ObservableCollection + New* 필드 (Properties.cs)
- AddCustomHotkey() / RemoveCustomHotkey() 메서드 (Methods.cs)
  - HotkeyParser 형식 검증, 중복 핫키 방지
- Load/Save에 CustomHotkeys 매핑 (SettingsViewModel.cs, Methods.cs)

SettingsWindow.xaml + .xaml.cs:
- "전용 핫키" 탭 신규 추가 (배치 명령 탭 다음)
  - 안내 배너, 입력 폼 (핫키 레코더 + 표시이름 + 타입 + 대상)
  - 핫키 목록 (배지 + 타입아이콘 + 이름/경로 + 삭제 버튼)
- HotkeyRecord_Click: 클릭 후 키 입력 → 자동 핫키 감지 (PreviewKeyDown)
- AddHotkey_Click, RemoveHotkey_Click, BrowseHotkeyTarget_Click 핸들러

docs/LAUNCHER_ROADMAP.md:
- L5-1  완료 표시, 구현 내용 업데이트

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 12:12:32 +09:00
e103a3a65a [Phase L4 문서] 헬프·가이드·팁 문구 L4 신기능 반영
HelpDetailWindow.xaml.cs (+47줄):
- 런처 탐색 카테고리 신설: 인라인 파일 탐색기, F3 QuickLook, 검색 히스토리, 고급 필터, 단위 변환 5항목 추가

HelpDetailWindow.Shortcuts.cs (+12줄):
- → 단축키: 파일 탐색기 폴더 진입 기능 추가 설명
- ← 단축키 신규: 파일 탐색기 상위 폴더 이동
- F3 단축키 신규: QuickLook 미리보기 토글

L10n.cs (+13줄):
- Phase L4 신기능 홍보 팁 12종 추가 (파일탐색기, F3, 검색히스토리, 필터문법, 단위변환)

개발자가이드.htm:
- 단축키 테이블에 F3 QuickLook 행 추가
- = 예약어에 단위 변환 자동 제안·날짜 계산 예시 추가
- 팁 섹션에 4개 박스 추가: 인라인 파일탐색기, 고급 검색 필터, 검색 히스토리, F3 QuickLook
- 버전 이력 v1.7.3 추가 (L4 전 기능 기록)

사용가이드.htm: 개발자 가이드에서 버전 이력 제거 후 재생성
가이드 암호화: guide_dev.enc, guide_user.enc 재암호화 완료
빌드: 경고 0, 오류 0
2026-04-04 11:49:07 +09:00
e088a73925 [Phase L5] 런처 고도화 5단계 계획 수립 및 L4 완료 마킹
LAUNCHER_ROADMAP.md 업데이트:
- Phase L4 전체  완료 표시 (L4-1~L4-6 구현 내용 기록)
- Phase L5 신규 추가: 전용 핫키·OCR·QuickLook편집·세션 스냅·배치 이름변경·스케줄러
- 각 L5 항목에 C# 인터페이스·클래스 시그니처 수준 설계 명세 추가
- 구현 순서: L5-1 → L5-2 → L5-3 → L5-5 → L5-4 → L5-6
2026-04-04 11:39:47 +09:00
d70e6357d0 [Phase L4-5] 고급 검색 필터 문법 구현 (ext/type/in/size/modified)
Core/SearchFilterParser.cs (285줄) — 신규:
- Parse(): 쿼리에서 필터 토큰 추출 후 순수 텍스트 쿼리 반환
- 지원 필터: ext:.pdf,.docx / type:file|folder|app / in:경로조각
  size:>1mb|<500kb / modified:today|week|month|year|>날짜
- Matches(): 8가지 조건(ext,type,in,size,modified) 순차 검사
  size/modified는 파일시스템 접근이 필요해 마지막에 체크
- Describe(): UI 힌트용 필터 요약 텍스트 생성
- ParsedFilters 클래스: 파싱된 필터 상태 컨테이너

Core/FuzzyEngine.cs (+23줄):
- SearchWithFilter(query, predicate, max): 텍스트 없으면 전체, 있으면 ×15 후보→필터

Core/CommandResolver.cs (+91줄):
- ResolveAsync(): 경로 쿼리 감지 다음에 필터 감지 단계 추가
- BuildFilteredResults(): 필터 힌트 항목(상단) + 필터 적용 결과 목록
  파일 항목에 size/수정일 부가 정보 subtitle 표시
- FormatBytes(): 파일 크기 포맷 (B/KB/MB/GB)
- 빌드: 경고 0, 오류 0
2026-04-04 11:34:37 +09:00
d4a1532d81 [Phase L4] 파일탐색기·QuickLook·단위변환 단축 3종 완료
FileBrowserHandler (185줄) — L4-1 인라인 파일 탐색기:
- Handlers/FileBrowserHandler.cs: Prefix=null, 경로 패턴 감지(C:\, D:\, \, ~\)
- 폴더/파일 나열: 상위폴더(..) + 하위폴더 40개 + 파일 30개
- 확장자별 MDL2 아이콘, 파일 크기 포맷(B/KB/MB/GB), 필터링 지원
- FileBrowserEntry(Path, IsFolder) record 정의
- App.xaml.cs: Phase L4 섹션에 FileBrowserHandler 등록

CommandResolver (18줄 추가) — 경로 쿼리 우선 처리:
- 퍼지 검색 전 IsPathQuery() 감지 → 파일탐색기 단독 결과 반환(항목 수 제한 없음)
- FileBrowserEntry 실행 라우팅 → ExecuteNullPrefixAsync 위임

LauncherWindow.Keyboard.cs (41줄 추가) — 키보드 탐색:
- Key.Right: FileBrowserEntry {IsFolder:true} 선택 시 해당 경로로 InputText 업데이트
- Key.Left: 경로 쿼리 상태에서 상위 폴더로 이동(Path.GetDirectoryName)
- 기존 → 키 액션모드 진입 로직 유지

QuickLookWindow (L4-2 F3 미리보기 강화):
- XAML: 줄번호 열(LineNumBg+LineNumbers), PDF 패널(빨강 배지), Office 패널(파랑 배지) 추가
- Code-behind: PDF(PdfPig), Word(OpenXml), Excel(OpenXml) 미리보기 구현
- ApplyCodeStyle(): 언어별 배경 색조(C#=파랑, Python=녹색, JS=앰버 등)
- 빌드: 경고 0, 오류 0
2026-04-04 11:23:18 +09:00
75cb4ba6e9 [Phase L4-4/L4-6] 검색 히스토리 + 계산기 단위변환 단축 문법
L4-4 검색 히스토리 (↑/↓ 키 탐색):
- Services/SearchHistoryService.cs (신규 100줄): 50개 FIFO JSON 저장
  Add() · GetAll() · Clear(). 2자 미만/중복 최상단 무시
- ViewModels/LauncherViewModel.cs:
  _historyIndex·_isHistoryNavigation 필드 추가
  NavigateHistoryPrev() / NavigateHistoryNext() / SetInputFromHistory()
  InputText setter: 직접 입력 시 _historyIndex 초기화
  ExecuteSelectedAsync: 실행 전 히스토리 저장 (2자 이상)
  OnShown: _historyIndex = -1 초기화
- Views/LauncherWindow.Keyboard.cs:
  Key.Up/Down — Results.Count==0 분기: 히스토리 탐색 / 목록 탐색 분기

L4-3 클립보드 핀/카테고리: 기존 완전 구현 확인 (IsPinned, Category,
  TogglePin, Ctrl+P, #pin/#url/#코드/#경로 필터)

L4-6 계산기 단위 변환 단축 문법:
- Handlers/UnitConverter.cs:
  AutoSuggest(): "20km", "100f", "5lb" 등 목표 없이 주요 단위 자동 제안
  _suggestions 테이블: 길이/무게/속도/데이터/온도 40개 단위 매핑
  DateShortcut: "today+30d", "today-7w" → = 접두어에서 날짜 계산
- Handlers/CalculatorHandler.cs:
  DateShortcut.TryMatch 분기 추가 (통화 감지 전)
  UnitConverter.AutoSuggest 분기 추가 (명시 변환 후)
- 힌트 텍스트: "20km · 100°F · today+30d" 추가

docs/LAUNCHER_ROADMAP.md: Phase L4 계획 테이블 추가

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 11:15:11 +09:00
fc881124b9 [Phase L2-8] DockBar 위젯 확장 — 날씨·일정·배터리 추가
Services/WeatherWidgetService.cs (신규 58줄):
- wttr.in API 호출, 30분 캐시
- 사내 모드(InternalModeEnabled=true)에서는 "--" 즉시 반환
- Invalidate()로 강제 캐시 초기화 지원

ViewModels/LauncherViewModel.Widgets.cs:
- Widget_WeatherText (setter: 코드비하인드에서 직접 갱신)
- Widget_CalText: DateTime.Now → "M/d (ddd)" 형식 (ko-KR)
- Widget_BatteryText / Widget_BatteryIcon / Widget_BatteryVisible

Views/LauncherWindow.Widgets.cs:
- StartWidgetUpdates(): 배터리 즉시 갱신 + 날씨 비동기 갱신 호출
- 1초 타이머: 배터리 30초마다, 날씨 캐시체크 2분마다
- UpdateBatteryWidget(): PowerStatus 읽기, 잔량별 MDL2 아이콘 선택
- RefreshWeatherAsync(): WeatherWidgetService 호출 → VM 프로퍼티 갱신
- WgtWeather_Click: 사외 모드=wttr.in 열기, 사내 모드=캐시 초기화
- WgtCal_Click: ms-clock: 또는 outlookcal: 열기
- WgtBattery_Click: ms-settings:powersleep 열기

Views/LauncherWindow.xaml:
- WidgetBar 내부: Grid → StackPanel + 2행 구조로 변환
- Row A: 기존 4개 위젯 (시스템·포모·메모·서버, 변경 없음)
- Row B: E(날씨 파랑) · F(일정 핑크) · G(배터리 녹색) 신규 추가
- 배터리: BoolToVisibilityConverter로 데스크톱에서 자동 숨김

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 10:50:57 +09:00
f557f53449 [Phase L2-7] 퀵 액션 바 — 최근 실행 항목 칩 표시
Models/QuickActionChip.cs (신규 12줄):
- Title, Symbol, Path, Background 레코드

Services/UsageRankingService.cs:
- GetTopItems(int n) 메서드 추가: 실행 횟수 상위 N개 (경로, 횟수) 반환

ViewModels/LauncherViewModel.cs:
- QuickActionItems (ObservableCollection<QuickActionChip>) 프로퍼티 추가
- ShowQuickActions: 입력 비었을 때 칩 표시 조건
- LoadQuickActions(): 상위 8개 경로 → 파일 존재 확인 → 타입별 아이콘/색상 칩 생성
- OnShown()에서 LoadQuickActions() 호출
- InputText 변경 시 ShowQuickActions 알림

Views/LauncherWindow.xaml:
- 입력 Grid를 2행 구조로 변환 (RowDefinitions 추가)
- Row 1: ItemsControl + WrapPanel + DataTemplate 칩 UI
  - CornerRadius=10 Border, 아이콘+제목 StackPanel
  - 호버 시 AccentColor 테두리, 최대 너비 100px 말줄임

Views/LauncherWindow.Shell.cs:
- QuickActionChip_Click 핸들러: 창 숨김 → 경로 실행 → 사용 통계 기록

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 10:44:02 +09:00
679de30f68 [Phase L2-6] 검색 결과 그룹핑 (앱/폴더/파일/단축키)
AxCopilot.SDK/IActionHandler.cs:
- LauncherItem 레코드에 Group? 선택 매개변수 추가 (기존 호출 코드 무변경)

Core/CommandResolver.cs:
- Fuzzy 검색 결과에 Group 태깅: 앱/폴더/단축키/파일

ViewModels/LauncherViewModel.cs:
- ICollectionView GroupedResults 프로퍼티 추가
- CollectionViewSource + PropertyGroupDescription(nameof(LauncherItem.Group)) 초기화

Views/LauncherWindow.xaml:
- ItemsSource: Results → GroupedResults 변경
- ListView.GroupStyle 추가: 그룹 이름 헤더(10px, SemiBold, 흐린 보조 텍스트)
- GroupItem ContainerStyle로 헤더+아이템 수직 배치
- Group=null 항목은 NullToCollapsedConverter로 헤더 숨김

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 10:36:26 +09:00
d6d5f518d0 [Phase L2-4/L2-5] 클립보드 OCR 이미지 검색 + Ctrl+Click 다중 선택
Phase L2-4: 클립보드 이미지 OCR 텍스트 추출 및 검색
- AxCopilot.csproj: TFM net8.0-windows → net8.0-windows10.0.17763.0 (Windows OCR API 활성화)
- ClipboardEntry: OcrText 프로퍼티 추가 (set), Preview → OCR 텍스트 우선 표시 (72자 상한)
- SavedClipEntry: OcrText 직렬화 필드 추가, BuildSnapshot/LoadHistory 연동
- ClipboardHistoryService.OnClipboardUpdate: 이미지 저장 후 백그라운드 OCR 트리거
  (EnableOcrSearch 설정 체크, capturedEntry.OcrText 비동기 갱신)
- ClipboardHistoryService.ImageCache.cs: ExtractOcrTextAsync() 추가
  (WinRT BitmapDecoder → SoftwareBitmap → OcrEngine.RecognizeAsync, 5,000자 상한)
  WinRT 별칭(WinBitmapDecoder, WinSoftwareBitmap 등) 으로 WPF 네임스페이스 충돌 방지
- AppSettings.Models.cs: ClipboardHistorySettings.EnableOcrSearch (default=true)
- ClipboardHistoryHandler.GetItemsAsync: OcrText 포함 검색, 'OCR ·' 표시 배지

Phase L2-5: Ctrl+Click 클립보드 항목 다중 선택
- LauncherWindow.Shell.cs: ResultList_PreviewMouseLeftButtonUp에 Ctrl+Click 분기 추가
  (IsClipboardMode + Ctrl 조합 시 ToggleMergeItem 호출, 기존 단일 선택 흐름 유지)
- LauncherWindow.ShortcutHelp.cs: Ctrl+Click / Shift+↑↓ / 병합 단축키 도움말 추가

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 10:18:45 +09:00
e78da8eb81 [Phase L2-3] LAUNCHER_ROADMAP 완료 표시 갱신
L2-3 클립보드 이미지 미리보기 창 구현 완료 기록:
- ClipboardImagePreviewWindow (신규): 원본 해상도 표시, 줌, 저장, 복사
- Shift+Enter로 # 이미지 항목에서 미리보기 창 열기
- 빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 09:56:19 +09:00
ff048a6198 [Phase L2-3] 클립보드 이미지 미리보기 창 구현
신규 파일:
- ClipboardImagePreviewWindow.xaml (신규, 140줄):
  WindowStyle=None, 커스텀 타이틀바, 이미지 ScaleTransform 줌,
  하단 툴바(축소/줌레이블/확대 / 1:1 / 창맞춤 / 저장 / 복사)
- ClipboardImagePreviewWindow.xaml.cs (신규, 173줄):
  원본 해상도 이미지 로드(OriginalImagePath → 썸네일 폴백),
  FitToWindow() 초기 자동 맞춤, ApplyZoom(ScaleTransform),
  Ctrl+휠 줌, 키보드 단축키(+/-/0/F/Esc/Ctrl+C/Ctrl+S),
  PNG·JPEG·BMP 저장(SaveFileDialog), NotificationCenterService 피드백

변경 파일:
- LauncherWindow.Keyboard.cs: Shift+Enter 시 ClipboardEntry 이미지 항목 → 미리보기 창 열기(기존 폴더열기 분기 전에 추가)
- LauncherWindow.ShortcutHelp.cs: "Shift+Enter — 대형 텍스트 / 이미지 미리보기 (#)" 안내 갱신

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 09:55:59 +09:00
cc14de8da3 [Phase 17-E/F/G] NEXT_ROADMAP 완료 기록 추가
Phase 17-E 계층 메모리/컨텍스트 고도화 완료 기록:
- AxMdIncludeResolver.cs (@include 재귀 해석, 최대 5단계)
- PathScopedRuleInjector.cs (paths: 프론트매터 경로 규칙 주입)
- HierarchicalMemoryService.cs (4-layer 계층 메모리)
- AgentLoopService.Memory.cs (105줄, 세션 시작 시 주입)

Phase 17-F 권한 시스템 고도화 완료 기록:
- AgentLoopService.Permissions.cs (97줄, acceptEdits 모드)
- PermissionSystem.cs (패턴 기반 Allow/Deny 규칙)
- CompoundCommandParser.cs (&&·||·; 복합 명령 분해)

Phase 17-G 멀티파일 Diff + 자동 컨텍스트 수집 완료 기록:
- AgentLoopService.DiffTracker.cs (99줄, 원본 캡처→Diff 기록)
- AutoContextCollector.cs (@멘션·경로 자동 컨텍스트 수집)
- 최종 업데이트 라인: "17-A~D" → "17-A~G"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 09:49:44 +09:00
8997d3b330 [Phase L3-9] LAUNCHER_ROADMAP 완료 표시 갱신
L3-9 런처 미니 위젯 구현 완료 기록:
- 시스템 모니터(CPU/RAM/디스크), 뽀모도로, 메모 건수, 서버 상태 4종 위젯
- PerformanceMonitorService, PomodoroService, ServerStatusService 싱글턴
- pomo 프리픽스 핸들러 (집중/휴식/중지/리셋/상태 조회)
- 빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 09:42:08 +09:00
72b92b905c [Phase L3-9 + 버그] AX Agent 오류 수정 + 런처 미니 위젯 4종 구현
AX Agent 오류 수정:
- AgentSettingsPanel.xaml에 <UserControl.Resources> 추가
- ToggleSwitch 스타일 자체 정의 (SettingsWindow 리소스 미접근 문제 해결)
- 원인: XamlParseException — 'ToggleSwitch' 리소스 찾을 수 없음 (CS 로그 확인)

PerformanceMonitorService.cs (신규, 138줄):
- GetSystemTimes P/Invoke → CPU% (이전/현재 샘플 델타 계산)
- GlobalMemoryStatusEx P/Invoke → RAM% + "6.1/16GB" 형식 텍스트
- DriveInfo → C: 드라이브 사용률/용량 텍스트
- 2초 폴링, StartPolling/StopPolling 제어

PomodoroService.cs (신규, 179줄):
- 집중(25분)/휴식(5분) 타이머, 상태: Idle/Focus/Break
- pomodoro.json 영속성 (경과 시간 자동 보정)
- StateChanged 이벤트 → 위젯 실시간 갱신

ServerStatusService.cs (신규, 124줄):
- Ollama(/api/version), LLM API, 첫 번째 MCP 서버 15초 주기 핑
- HttpClient 1.5초 타임아웃, StatusChanged 이벤트

PomoHandler.cs (신규, 130줄):
- pomo prefix: 상태보기/start/break/stop/reset
- PomodoroService 직접 연동

LauncherViewModel.Widgets.cs (신규, 81줄):
- Widget_PerfText, Widget_PomoText, Widget_PomoRunning
- Widget_NoteText, Widget_OllamaOnline, Widget_LlmOnline, Widget_McpOnline
- UpdateWidgets() — 5틱마다 메모 건수 갱신 (파일 I/O 최소화)

LauncherWindow.Widgets.cs (신규, 143줄):
- IsVisibleChanged 이벤트로 위젯 자동 시작/중지
- DispatcherTimer 1초마다 UpdateWidgets + 서버 상태 dot 색상 직접 갱신
- 위젯 클릭 → 해당 prefix 자동 입력 (perf→info, pomo→pomo, note→note, server→port)

LauncherWindow.xaml:
- RowDefinition 6개 → 7개
- Row 6: 위젯 바 (시스템모니터/뽀모도로/메모/서버 4열)

빌드: 경고 0, 오류 0
2026-04-04 09:28:07 +09:00
bfa8e8c548 [Phase L3-8] 알림 센터 핸들러(notif) 구현 완료
NotifHandler.cs (신규, 120줄):
- notif 프리픽스: 최근 알림 이력 목록 표시 (최대 12건)
- notif [검색어]: 제목·내용 기반 필터링
- notif clear: 전체 이력 초기화 (건수 표시 후 확인)
- Enter: 선택 알림 내용 클립보드 복사
- NotificationType(Error/Warning/Success/Info)별 심볼 자동 적용
- TimeAgo() 헬퍼: 방금 전/N분 전/N시간 전/N일 전

NotificationService.cs (정리, 24줄):
- 중복 정의된 NotificationEntry 레코드 제거 (CS0101 오류 해결)
- 이력 관리는 NotificationCenterService에 위임
- LogOnly(): NotificationCenterService.Show() 호출로 대체

App.xaml.cs:
- commandResolver.RegisterHandler(new NotifHandler()) 추가

LauncherViewModel.cs:
- PrefixMap에 notif 배지 추가 (알림, ReminderBell, #F59E0B)

docs/LAUNCHER_ROADMAP.md:
- L3-8 알림 센터 통합  완료 표시

빌드: 경고 0, 오류 0
2026-04-04 09:10:12 +09:00
1b215579d2 [v2.0.0] Phase L3-7 다중 디스플레이 지원
LauncherWindow.Animations.cs:
- CenterOnScreen(): SystemParameters.WorkArea(주 모니터 고정) → 마우스 커서 위치 모니터 기반으로 변경
- GetCurrentMonitorWorkArea() 신규: Screen.FromPoint(Cursor.Position)으로 현재 모니터 탐색
  · PresentationSource.TransformFromDevice로 물리 픽셀 → WPF DIP 정확 변환
  · PresentationSource 미사용 가능 시 SystemParameters.WorkArea 폴백
- using AxCopilot.Services 추가

AppSettings.cs:
- LauncherSettings에 MonitorDockPositions 딕셔너리 추가
  · key=모니터 디바이스 이름 (\.\DISPLAY1 등), value=[Left, Top]
  · JSON 직렬화 지원

App.Settings.cs:
- ToggleDockBar(): 독 바 위치 변경 시 per-monitor 위치 저장 (GetMonitorDeviceNameAt)
- 독 바 복원 시 IsDockPositionOnAnyMonitor로 유효성 검사
  · 연결 끊긴 모니터 위치면 중앙 하단(-1,-1)으로 자동 초기화
- GetMonitorDeviceNameAt(): WPF DIP → 물리 픽셀 변환 후 모니터 디바이스명 반환
- IsDockPositionOnAnyMonitor(): Screen.AllScreens 범위 검사

docs/LAUNCHER_ROADMAP.md: L3-7  완료 표시

효과:
- 듀얼 모니터에서 핫키 → 마우스가 있는 모니터에 런처 표시
- 독 바 드래그 시 해당 모니터 이름으로 위치 기억
- 모니터 분리 후 재실행 시 독 바 위치 자동 복원

빌드: 경고 0, 오류 0
2026-04-04 09:00:15 +09:00
cb9d197969 [v2.0.0] Phase L3-5 파일 태그 시스템 구현
FileTagService.cs (140줄) — 신규:
- 파일·폴더에 사용자 태그 부여 서비스 (싱글턴)
- AddTag / RemoveTag / ClearTags / GetTags / GetFilesByTag / GetAllTags / HasTags
- %APPDATA%\AxCopilot\file_tags.json 로컬 저장 (key=경로, value=태그목록)
- 태그 정규화: 소문자 + 공백→하이픈 변환

TagHandler.cs (190줄) — 신규:
- "tag" 프리픽스 핸들러 (IActionHandler 구현)
- tag              → 전체 태그 목록 (파일 수 내림차순)
- tag work         → "work" 태그 파일 목록 (prefix match + contains)
- tag add [태그] [경로] → 파일에 태그 추가 (Enter로 확정)
- tag del [태그] [경로] → 파일에서 태그 제거 (Enter로 확정)
- tag clear [경로]       → 파일의 모든 태그 삭제 (Enter로 확정)
- 파일 열기: Process.Start UseShellExecute

Symbols.cs (+1줄):
- Tag = "\uEAB4" 심볼 상수 추가

LauncherViewModel.cs (+2줄):
- PrefixMap에 "tag" → ("태그", Symbols.Tag, "#6366F1") 추가

App.xaml.cs (+2줄):
- Phase L3 핸들러 섹션에 TagHandler 등록

docs/LAUNCHER_ROADMAP.md:
- L3-1~L3-5 완료 표시 ()

빌드: 경고 0, 오류 0
2026-04-04 08:51:04 +09:00
d67c378389 [v2.0.0] AgentSettingsPanel 프리셋 섹션 추가
AgentSettingsPanel.xaml (+46줄):
- 프리셋 섹션 신규 추가 (MCP 서버 ↔ 고급 사이)
- "새 프리셋 저장" 버튼 (BtnPresetSave, 보라 아이콘)
- "프리셋 관리 →" 버튼 (BtnPresetManage, 화살표 아이콘)
- 호버 스타일 DynamicResource 적용

AgentSettingsPanel.xaml.cs (+10줄):
- PresetSaveRequested / PresetManageRequested Action 콜백 프로퍼티 추가
- BtnPresetSave_Click / BtnPresetManage_Click 핸들러 추가

ChatWindow.CustomPresets.cs (+110줄):
- ShowPresetManagePopup() 메서드 신규 구현
  · 현재 탭의 커스텀 프리셋 목록을 Popup으로 표시
  · 각 항목에 편집(✏)·삭제(🗑) 아이콘 인라인 배치
  · "새 프리셋 추가" 단축 버튼 하단 고정
  · PlacementMode.Left로 설정 패널 왼쪽에 앵커

ChatWindow.MoodMenu.cs (+2줄):
- ToggleSettingsPanel() 내 PresetSaveRequested·PresetManageRequested 콜백 연결

빌드: 경고 0, 오류 0
2026-04-04 08:44:50 +09:00
23d1534536 [v2.0.0] AgentSettingsPanel 기능 완성 — 서비스·모델·작업폴더·MCP
AgentSettingsPanel.xaml.cs:
- BtnServiceSelector_Click: ServiceSelectorRequested 콜백 실행 (ChatWindow 위임)
- BtnModelSelector_Click: ModelSelectorRequested 콜백 실행 (ChatWindow 위임)
- ServiceSelectorRequested / ModelSelectorRequested / WorkFolderBrowseRequested Action 추가
- LoadFromSettings: UpdateWorkFolder() + BuildMcpServerList() 호출 추가
- LoadFromSettings: PanelWorkFolder 가시성 제어 추가
- UpdateActiveTab: PanelWorkFolder 가시성 제어 추가
- BtnWorkFolderBrowse_Click, UpdateWorkFolder, BuildMcpServerList, McpToggle_Changed 추가
- using System.Linq / using AxCopilot.Models 추가

AgentSettingsPanel.xaml:
- PanelWorkFolder 섹션 추가 (Code 탭 전용 — 폴더 표시 + 탐색 버튼)
- PanelMcpServers 섹션 추가 (도구 관리 뒤, 고급 앞)

ChatWindow.MoodMenu.cs:
- ToggleSettingsPanel(): 패널 열 때 ServiceSelector/ModelSelector/WorkFolder 콜백 연결

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 08:38:51 +09:00
0e8d58d3aa [v2.0.0] SettingsWindow AX Agent 탭 제거 + 고급 에이전트 탭 분리
CLAUDE.md 절대 원칙: AX Agent 설정을 ChatWindow 내 AgentSettingsPanel로 이관.

SettingsWindow.xaml:
- AgentTabItem Visibility="Collapsed" 추가 (기존 AX Agent 탭 완전 숨김)
- AdvancedAgentTabItem 신규 추가 (line 3255 앞에 삽입):
  · 안내 배너: "기본 에이전트 설정은 채팅 화면에서" + ⚙ 아이콘 안내
  · MCP 서버 등록 안내 섹션
  · 훅·권한 규칙 편집 안내 섹션
  · 태그: &#xE8EF; (Segoe MDL2 Assets)

SettingsWindow.AiToggle.cs (ApplyAiEnabledState):
- AgentTabItem: 항상 Collapsed (AiEnabled 상관없이)
- AdvancedAgentTabItem: AiEnabled=true → Visible, false → Collapsed

빌드: 경고 0, 오류 0
2026-04-04 02:14:42 +09:00
05539b0d83 [v2.0.0] Phase 17/18 완료 — 멀티에이전트·Reflexion·훅·스킬 고도화 릴리즈
Phase 17 완료 표시 (AGENT_ROADMAP.md 갱신):
- 17-A1/A2: Reflexion 자기성찰 메모리 + 검증 강제 확대
- 17-B1/B2: TaskState Working Memory + AgentEventLog .jsonl 영속화
- 17-C1/C2/C3: 훅 11개 이벤트·4타입(Command/Http/Prompt/Agent) 완비
- 17-D1/D2/D3: 스킬 fork 격리·paths 자동활성화·user-invocable 필터

Phase 18 완료 표시:
- 18-C2 (AiSnippetHandler), 18-C3 (QuickLinkHandler)

버전 v1.8.0 → v2.0.0:
- AxCopilot.csproj, Installer.csproj, SetupForm.cs, McpClientService.cs

DEVELOPMENT.md 버전 이력 v2.0.0 추가
Phase 17 섹션 헤더: 차기 개발 →  완료

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 02:12:21 +09:00
8693204d2d [Phase 18] 코디네이터 에이전트·플러그인 갤러리·SlashRegistry·watchPaths 완성
Phase 18-A1 — CoordinatorAgentService (신규):
- CoordinatorAgentService.cs (264줄): LLM 계획 수립 → JSON 파싱 → 의존성 토폴로지 정렬 → 병렬 서브에이전트 실행 → 결과 합성
- AgentLoopService.Coordinator.cs (100줄): RunCoordinatorModeAsync 파셜 + FormatCoordinatorPlan
- AppSettings.LlmSettings.cs: EnableCoordinatorMode bool 설정 추가
- AgentLoopService.cs: EnableCoordinatorMode 체크 → RunCoordinatorModeAsync fallback 로직

Phase 17-C4 — watchPaths FileWatcherService 연동 (AgentLoopService.ExtendedHooks.cs):
- SessionStart 훅 결과의 WatchPaths → FileWatcherService.Watch() 등록
- 파일 변경 시 FileChanged 훅 fire-and-forget 트리거

Phase 18-C1 — 플러그인 갤러리 (SettingsWindow):
- SettingsWindow.Plugins.cs (249줄): InitPluginGallery, RenderPluginList, 활성화 토글, 제거 버튼
- SettingsWindow.xaml: 플러그인 탭 추가 (PluginListPanel, 설치/새로고침 버튼)
- SettingsWindow.xaml.cs: Loaded에서 InitPluginGallery() 호출

SlashCommandRegistry ChatWindow 통합:
- ChatWindow.SlashContext.cs (175줄): IAgentChatContext 구현, GetRegistrySlashMatches, TryExecuteRegistrySlashCommandAsync
- ChatWindow.SlashCommands.cs: 레지스트리 명령 팝업 후보 추가
- ChatWindow.Sending.cs: 전송 전 레지스트리 슬래시 명령 우선 처리

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 02:02:37 +09:00
84e5cd9485 [Phase 18] 멀티에이전트 인프라 완성 + 리플레이 탭 통합
Phase 17-D3 수정:
- SkillManagerTool.ListSkills(): UserInvocable=false 내부 스킬 필터링 추가
  (SkillServiceExtensions.IsUserInvocable() 활용)

Phase 18-A 연결 완성:
- ToolRegistry: BackgroundAgentService 프로퍼티 노출 (AgentCompleted 구독용)
- ToolRegistry: WorktreeManager 인스턴스 생성 → DelegateAgentTool에 주입 (18-A2 완성)
- ChatWindow.xaml.cs: _toolRegistry.BackgroundAgentService.AgentCompleted 구독
- ChatWindow.AgentSupport.cs: OnBackgroundAgentCompleted() — 완료/실패 트레이 알림

Phase 18-B: 리플레이/디버깅 UI 통합:
- WorkflowAnalyzerWindow.xaml: "리플레이" 탭 버튼 추가 (&#xE768;)
- WorkflowAnalyzerWindow.xaml: 리플레이 패널 — 세션 목록, 재생 컨트롤, 속도 슬라이더, 진행 바, 이벤트 스트림
- WorkflowAnalyzerWindow.xaml.cs: TabReplay_Click, UpdateTabVisuals 3탭 지원
- WorkflowAnalyzerWindow.xaml.cs: LoadReplaySessions, BtnReplayStart/Stop, BuildReplayEventRow
- ReplayTimelineViewModel 통합 — StartReplayAsync/StopReplay, ReplayEventReceived 이벤트
- AGENT_ROADMAP.md: 18-A2/A3/A4/B1  완료 표시 갱신

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 01:30:29 +09:00
0ef37554bc [v1.8.0] 배포 준비 — 가이드 문서 갱신 및 암호화
DEVELOPMENT.md v1.8.0 항목 상세 보완:
- Phase 17-B: TaskStateService JSON 영속화 + AgentEventLog JSONL 7종 이벤트 정확히 기술
- Phase 17-C: ExtendedHookRunner 18종 이벤트 + Prompt/Command/Http 3타입 상세 기술
- Phase 17-D: PathBasedSkillActivator + context:fork DI 콜백 주입 방식 기술
- Phase 17-E: HierarchicalMemoryService 4-layer + AxMdIncludeResolver + PathScopedRuleInjector 정확히 기술
- Phase 17-F: PermissionDecisionService Chain 5단계 + EvaluateToolPermission 3종 결정 기술
- Phase 17-G: DiffTracker CaptureOriginalFileContent + ToolRiskMapper 위험도 태그 기술

개발자 가이드 v1.8.0 버전 이력 항목 추가 (15개 신기능):
- 자기성찰 메모리, 세션 상태 영속화, 훅 시스템, 스킬 fork
- 경로 기반 스킬/규칙, 계층 메모리, 권한 시스템, 멀티파일 Diff
- 사내/사외 모드, 멀티에이전트, AI 스니펫, 퀵링크, 알림 센터

사용자 가이드: 개발자 가이드에서 버전 이력 섹션 제거 후 재생성
암호화: guide_dev.enc + guide_user.enc 재생성 (AES-256-CBC)
빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 01:17:09 +09:00
a635f24399 [Phase 17-F+G] 권한 시스템 고도화 + 멀티파일 Diff 추적기
Phase 17-F — 권한 시스템 고도화:
AgentLoopService.Permissions.cs (신규, 97줄):
- GetPermissionService(): PermissionsConfig → PermissionDecisionService 빌드·캐시
  Chain: DenyRuleHandler → AllowRuleHandler → AcceptEditsHandler → PlanModeHandler → BypassHandler
- EvaluateToolPermission(): Deny=즉시차단 / Allow=CheckDecisionRequired 스킵 / Ask=기존 흐름
- CheckMcpToolAllowed(): MCP 서버·도구 단위 권한 확인
- PermissionRuleEntry(설정) → PermissionRule(런타임) 자동 변환

Phase 17-G — 멀티파일 Diff 추적기:
AgentLoopService.DiffTracker.cs (신규, 99줄):
- DiffViewModel 프로퍼티: MultiFileDiffViewModel 지연 초기화, ChatWindow UI 바인딩용
- ExtractFilePathFromInput(): 도구 입력 JSON에서 path/file_path 추출
- CaptureOriginalFileContent(): 쓰기 도구 실행 전 원본 내용 캡처 (신규=빈 문자열)
- TrackFileModificationForDiff(): 성공 후 디스크에서 신규 내용 읽어 DiffViewModel에 기록
- ResetDiffTracker(): 세션 시작 시 Diff 목록 초기화

AgentLoopService.Execution.cs (편집):
- toolName17 변수 도입: call.ToolName ?? "" — CS8604 nullable 경고 전면 제거 (0개)
- Phase 17-G2: EmitEvent(ToolCall)에 위험도 태그 [⚠ 높음]/[• 보통] 접미사 추가
- Phase 17-F: Deny→즉시차단+DENIED 메시지, Allow→skipLegacyDecisionCheck=true
- Phase 17-G: Pre-실행 diffFilePath+diffOriginalContent 캡처, Post-성공 TrackFileModificationForDiff 호출

AgentLoopService.cs (편집):
- 세션 시작 시 ResetDiffTracker() 호출 (이전 세션 Diff 항목 초기화)

AppSettings.LlmSettings.cs (편집):
- EnableDiffTracker 설정 추가 (기본 true, json: "enableDiffTracker")

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 01:10:09 +09:00
f1b1f1604c [Phase 17-E] 계층 메모리/컨텍스트 고도화 — AgentLoopService 통합
AgentLoopService.Memory.cs (신규, 105줄):
- InjectHierarchicalMemoryAsync(): 세션 시작 시 4-layer 계층 메모리 수집
  (Managed→User→Project→Local AX.md + rules/*.md)
  AxMdIncludeResolver.ResolveAsync()로 @include 지시어 최대 5단계 재귀 해석
  40,000자 초과 시 크기 경고, 마커 기반 in-place 교체(중복 방지)
- InjectPathScopedRulesAsync(): 파일 도구 실행 후 .ax/rules/*.md paths: 프론트매터
  기반 경로 범위 규칙 주입. workFolder별 PathScopedRuleInjector 캐시 적용

AgentLoopService.cs (편집):
- Phase 17-A(Reflexion) 이후 await InjectHierarchicalMemoryAsync() 호출 추가

AgentLoopService.Execution.cs (편집):
- InjectPathBasedSkills() 이후 InjectPathScopedRulesAsync() fire-and-forget 추가

AppSettings.LlmSettings.cs (편집):
- EnableMemorySystem 설정 추가 (기본 true, json: "enableMemorySystem")

docs/AGENT_ROADMAP.md:
- Group E 완료 표시 + 구현 내역 기록 (17-E1/E2 완료, 17-E3 차기)

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 00:56:49 +09:00
1313c65e5e [Phase 17-D] 스킬 시스템 고도화 — paths:glob 자동주입 + context:fork 격리 실행
AgentLoopService.Skills.cs (신규, 95줄):
- InjectPathBasedSkills(): 파일 도구 성공 후 filePath로 GlobMatcher 매칭
  → 매칭 스킬 시스템 프롬프트를 시스템 메시지에 in-place 주입
  → SkillActivated JSONL 이벤트 로그 기록
- RunSkillInForkAsync(): context:fork 스킬 격리 LLM 실행 (도구 없음)
  → SkillCompleted JSONL 이벤트 로그 기록

SkillManagerTool.cs:
- SetForkRunner(Func<SkillDefinition, string, CancellationToken, Task<string>>) 추가
- exec 액션 + arguments 파라미터 추가
- ExecSkillAsync(): PrepareSkillBodyAsync 인자 치환
  → IsForkContext=true: fork runner 호출 → [Fork 스킬 결과] 반환
  → 일반 스킬: 시스템 프롬프트 + 준비된 본문 반환

AgentLoopService.cs:
- 생성자: SkillManagerTool.SetForkRunner(RunSkillInForkAsync) 주입

AgentLoopService.Execution.cs:
- 도구 성공 직후 InjectPathBasedSkills(result.FilePath, messages) 호출

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 00:39:25 +09:00
0a58419c8a [Phase 17-C] 훅 시스템 고도화 — 11종 이벤트 연결 + Prompt 모드 구현
AppSettings.AgentConfig.cs:
- ExtendedHooksConfig에 4개 이벤트 추가:
  preToolUse, postToolUse, postToolUseFailure, agentStop

AgentLoopService.ExtendedHooks.cs (신규, 150줄):
- RunExtendedEventAsync(): 이벤트 훅 실행, 결과(additionalContext) 시스템 메시지 주입, HookFired 이벤트 로그
- GetExtendedHooks(): 설정에서 HookEventKind별 런타임 엔트리 조회
- ConvertToRuntimeEntries(): ExtendedHookEntryConfig → ExtendedHookEntry 변환
- ApplyExtendedHookResult(): additionalContext in-place 주입 (marker 기반 교체)

ExtendedHookRunner.cs:
- RunEventAsync() / ExecuteSingleAsync()에 LlmService? llm 파라미터 추가
- RunPromptHookAsync() 신규: {{tool_name/input/output/user_message/event/session_id}} 치환
  → LLM 호출 → block/deny/차단 감지 시 Block=true 반환
- using AxCopilot.Models 추가

AgentLoopService.cs:
- SessionStart 훅 (fire-and-forget, TaskState init 직후)
- UserPromptSubmit 훅 (동기, Block=true 시 즉시 반환 "⚠ 훅 정책에 의해 차단")
- PreCompact 훅 (적극적 압축 직전, 동기)
- PostCompact 훅 × 2 (기본/적극적 압축 완료 후, fire-and-forget)
- SessionEnd + AgentStop 훅 (finally 블록, fire-and-forget)

AgentLoopService.Execution.cs:
- RunToolHooksAsync() 개선: 레거시 AgentHookRunner 유지
  + ExtendedHookRunner PreToolUse/PostToolUse/PostToolUseFailure 추가
이벤트 커버리지: 11종 완전 연결. Agent 모드는 Phase 18-A 예정.
빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 00:14:19 +09:00
2383b1e220 [Phase 17-B] TaskState Working Memory + 이벤트 로그 완전 통합
AgentLoopService.TaskState.cs (신규, 96줄):
- InitTaskStateAsync(): 세션 시작 시 TaskStateService 초기화, 현재 작업 기록
- TrackToolFile(): 도구 성공 시 파일 경로 참조 목록 추가 (fire-and-forget)
- InjectTaskStateContext(): 압축 전 Working Memory를 시스템 메시지에 in-place 주입
  (## 현재 작업 상태 마커로 기존 섹션 탐지·교체 → 중복 방지)
- UpdateTaskStateSummaryAsync(): 압축 완료 후 컨텍스트 요약 갱신 (fire-and-forget)

AgentLoopService.cs:
- userQuery 선언 후 UserMessage 이벤트 기록 + InitTaskStateAsync() 호출
- 압축 블록: InjectTaskStateContext() 호출 (압축 전 Working Memory 주입)
- 기본 압축 완료 시: CompactionCompleted 이벤트 + UpdateTaskStateSummaryAsync()
- 적극적 압축 트리거 시: CompactionTriggered 이벤트 (usagePct 포함)
- LLM 텍스트 응답 후: AssistantMessage 이벤트 기록 (length, hasToolCalls)

AgentLoopService.Execution.cs:
- 도구 성공(state.ConsecutiveErrors = 0) 직후 TrackToolFile(result.FilePath) 호출

이벤트 커버리지: SessionStart/End·UserMessage·AssistantMessage·
ToolRequest·ToolResult·CompactionTriggered·CompactionCompleted 전 구간 기록
저장: %APPDATA%\AxCopilot\sessions\{sessionId}\{task_state.json, events.jsonl}
빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 23:22:40 +09:00
90d5943327 [Phase 17-A] Reflexion 자기성찰 메모리 시스템 구현
ReflexionEvaluatorService 신규 구현 (ReflexionService.cs):
- LLM 기반 자기평가: 완성도 점수(0~1), 강점/약점/교훈 추출
- $$raw string 평가 프롬프트로 JSON 포맷 안전하게 삽입
- JSON 블록 추출 + 역직렬화, LLM 실패 시 규칙 기반 폴백 엔트리
- ReflexionRepository.BuildContextPromptAsync() maxEntries 파라미터 추가

AgentLoopService.Reflexion.cs (신규, 82줄):
- InjectReflexionContextAsync(): 세션 시작 전 과거 교훈→시스템 메시지 주입
- FireAndForgetReflexionEval(): 세션 완료 후 Task.Run 비동기 자기평가 저장
- 지연 초기화(_reflexionRepo, _reflexionEval): 사용 시점에 생성

AgentLoopService.cs 통합 포인트 2개 추가:
- RunAsync() 루프 시작 전: await InjectReflexionContextAsync()
- finally 블록 통계 섹션: FireAndForgetReflexionEval() 호출

AgentSettingsPanel — 자기성찰 메모리 섹션 추가:
- 활성화 토글(ChkReflexionEnabled)
- 성공 세션만 평가 토글(ChkReflexionSuccessOnly)
- 최대 참고 교훈 수 슬라이더(1~20, 기본값 5)
- LoadFromSettings() 초기화 + 3개 이벤트 핸들러

빌드: 경고 0, 오류 0
2026-04-03 23:07:59 +09:00
5fe6d5c6ba [Phase 17-UI-C/D/E] AgentSessionHeaderBar·AgentSidebarView·AgentInputArea UserControl 통합
Phase 17-UI-C: AgentSessionHeaderBar 통합 (ChatWindow.xaml 인라인 칩 교체)
- AgentSessionHeaderBar.xaml: 외부 Border 투명화, 높이 42→38px, PlanIcon/PermIcon x:Name 추가
- AgentSessionHeaderBar.xaml.cs: SetPlanMode() x:Name 직접 참조, ChipPermission_Click 이벤트 위임
- ChatWindow.xaml: ModelHeaderChip/BtnPlanMode/PermissionHeaderChip → SessionHeaderBar UserControl 교체
- ChatWindow.SessionHeaderBar.cs (신규, 46줄): InitSessionHeaderBar() 이벤트 구독
- ChatWindow.ModelSelector.cs: UpdateModelLabel() SessionHeaderBar.SetModel() 동기화
- ChatWindow.PermissionMenu.cs: UpdatePermissionUI() SessionHeaderBar.SetPermissionMode() 동기화
- ChatWindow.TabSwitching.cs: UpdatePlanModeUI() 단순화, UpdateTabUI() SetTabLabel() 동기화

Phase 17-UI-D: AgentSidebarView 통합 (SidebarPanel 인라인 110줄 → UserControl 1줄)
- AgentSidebarView.xaml: 7행 구조(헤더/탭세그먼트/검색/카테고리/대화목록/삭제/사용자계정) 재작성
- AgentSidebarView.xaml.cs: internal 프록시 프로퍼티 8개 + 5개 이벤트 추가, 완전 재작성
- ChatWindow.xaml: <Border x:Name="SidebarPanel"> 110줄 → <ctrl:AgentSidebarView x:Name="Sidebar"/> 1줄
- ChatWindow.SidebarCompat.cs (신규, 80줄): 프록시 계산 프로퍼티 8개 + InitSidebarEvents()
- ChatWindow.PermissionMenu.cs: SidebarPanel.Visibility → Sidebar.Visibility, PermissionHeaderChip → SessionHeaderBar
- ChatWindow.TabSwitching.cs: 탭 핸들러 3개 Sidebar?.SetActiveTab() 동기화 추가

Phase 17-UI-E: AgentInputArea IsToolbarOnly 모드 + 입력 툴바 추가
- AgentInputArea.xaml: OuterBorder/InputTextBoxRow/ChipsSendRow x:Name 추가
- AgentInputArea.xaml.cs: IsToolbarOnly 의존성 프로퍼티 + ApplyToolbarOnlyMode() 추가
- ChatWindow.xaml: InputBorder Grid에 Row 0 추가(AgentInputArea IsToolbarOnly=True), 기존 행 0→1/1→2/2→3 시프트
- ChatWindow.InputToolbar.cs (신규, 37줄): InitInputToolbar() — @/스킬/첨부 이벤트 기존 동작 위임
- ChatWindow.xaml.cs: Loaded에 InitSidebarEvents(), InitInputToolbar() 호출 추가

빌드: 경고 0, 오류 0
2026-04-03 22:36:19 +09:00
26c20cf3dc [Phase 17-UI-B] 헤더 바 모델·권한 칩 추가
ChatWindow.xaml:
- 서브 헤더 바(Row 1) 우측에 ModelHeaderChip 버튼 추가
  (Segoe MDL2 브레인 아이콘 + ModelHeaderLabel TextBlock)
- 서브 헤더 바 우측에 PermissionHeaderChip 버튼 추가
  (잠금 아이콘 #4FC3F7 + PermissionHeaderLabel TextBlock)

ChatWindow.ModelSelector.cs:
- UpdateModelLabel(): ModelHeaderLabel 동기 갱신 코드 추가

ChatWindow.PermissionMenu.cs:
- UpdatePermissionUI(): PermissionHeaderLabel 동기 갱신 코드 추가
- PermissionHeaderChip_Click() 신규: PlacementTarget을 헤더 칩으로
  교체 후 기존 BtnPermission_Click 호출

ChatWindow.xaml.cs:
- Loaded 핸들러에 UpdatePermissionUI() 초기 호출 추가

docs/NEXT_ROADMAP.md:
- Phase 17-UI-B 완료 항목 추가

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 22:05:30 +09:00
e7aa107b16 [Phase 17-UI-A] AgentSettingsPanel 완전 통합 — 설정 버튼 직접 연결
ChatWindow.MoodMenu.cs (BtnSettings_Click 개선):
- Shift+클릭 조건 제거 → 기어 버튼 클릭 시 AgentSettingsPanel 직접 열기
- Ctrl+클릭으로 전역 SettingsWindow 열기 (기존 동작 유지)
- ToggleSettingsPanel(): _toolRegistry 패널에 전달, SettingsChanged 이벤트 연결
- OnSettingsPanelChanged() 신규: 설정 변경 시 ModelLabel·AnalyzerButton 즉시 갱신

ChatWindow.TabSwitching.cs:
- UpdateTabUI(): 설정 패널 열린 상태이면 UpdateActiveTab() 자동 호출
- 탭 전환 시 탭별 전용 설정(Cowork 검증/Code LSP 등) 패널 자동 반영

ChatWindow.xaml:
- 설정 버튼 ToolTip: "설정 패널 (Ctrl+클릭: 전역 설정)"으로 UX 안내 추가

AgentSettingsPanel.xaml.cs:
- LoadFromSettings(): ToolRegistry? 매개변수 추가 (외부 레지스트리 주입)
- BuildToolToggles(): 외부 레지스트리 우선, 없으면 ToolRegistry.CreateDefault() 폴백
- 반영 방식 개선: 리플렉션 해킹 제거 → 실제 ChatWindow._toolRegistry 참조

docs/NEXT_ROADMAP.md:
- Phase 17-UI-A 완료 항목 추가 (변경 파일 테이블, 개선 효과)

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 21:57:58 +09:00
4fa38a7b9e [Phase52] PreviewWindow.xaml.cs 분리 — Content.cs 추출
- PreviewWindow.xaml.cs: 505 → 317줄 (P/Invoke + 싱글턴 + 탭 관리 유지)
- PreviewWindow.Content.cs (신규): 콘텐츠 로드(LoadContent/LoadCsvContent/ParseCsvLine)
  + 타이틀바 핸들러 9개 (170줄)

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 21:43:10 +09:00
b750849c9f [Phase52] 7개 파일 추가 분리 — 14개 파일로 재구성
LlmService.Streaming:
- LlmService.Streaming.cs: 516 → 256줄 (Ollama/OpenAI 유지)
- LlmService.GeminiClaude.cs (신규): Gemini+Claude 스트리밍 (~260줄)

DocxSkill:
- DocxSkill.cs: 543 → 158줄 (ExecuteAsync 유지)
- DocxSkill.Builders.cs (신규): 11개 문서 빌더 헬퍼 (290줄)

ChartSkill:
- ChartSkill.cs: 537 → 174줄 (ExecuteAsync+RenderChart 유지)
- ChartSkill.Renderers.cs (신규): 7개 차트 렌더러+헬퍼+Dataset (280줄)

ScreenCaptureHandler:
- ScreenCaptureHandler.cs: 637 → 241줄 (기본 캡처 유지)
- ScreenCaptureHandler.Helpers.cs (신규): 스크롤/영역 캡처+헬퍼 (310줄)

SystemInfoHandler:
- SystemInfoHandler.cs: 509 → 352줄
- SystemInfoHandler.Helpers.cs (신규): 8개 헬퍼+StarInfoHandler (161줄)

AppSettings:
- AppSettings.cs: 564 → 309줄 (AppSettings/Launcher/CustomTheme 유지)
- AppSettings.Models.cs (신규): 14개 설정 모델 클래스 (233줄)

SkillEditorWindow:
- SkillEditorWindow.xaml.cs: 528 → 303줄
- SkillEditorWindow.PreviewSave.cs (신규): 미리보기+저장+로드 (226줄)

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 21:40:56 +09:00
55befebf34 [Phase51] 대규모 파일 분리 — 9개 파일 → 19개 파일
SettingsWindow.Tools:
- SettingsWindow.Tools.cs: 605 → 238줄 (BuildToolRegistryPanel 유지)
- SettingsWindow.SkillListPanel.cs (신규): BuildSkillListSection, CreateSkillGroupCard (295줄)

LauncherWindow.Keyboard:
- LauncherWindow.Keyboard.cs: 593 → 454줄
- LauncherWindow.ShortcutHelp.cs (신규): ShowShortcutHelp, ShowToast, TryHandleSpecialAction (139줄)

CalculatorHandler:
- CalculatorHandler.cs: 566 → ~240줄 (CalculatorHandler 클래스만 유지)
- UnitConverter.cs (신규): 단위변환 클래스 독립 파일 (152줄)
- MathEvaluator.cs (신규): 수식파서 클래스 독립 파일 (183줄)

EmojiHandler:
- EmojiHandler.cs: 553 → 70줄 (핸들러 메서드만 유지)
- EmojiHandler.Data.cs (신규): 이모지 데이터베이스 배열 (~490줄)

DocumentPlannerTool:
- DocumentPlannerTool.cs: 598 → 324줄 (Execute 메서드 유지)
- DocumentPlannerTool.Generators.cs (신규): GenerateHtml/Docx/Markdown, BuildSections 등 (274줄)

DocumentReaderTool:
- DocumentReaderTool.cs: 571 → 338줄 (ExecuteAsync + PDF 메서드 유지)
- DocumentReaderTool.Formats.cs (신규): BibTeX/RIS/DOCX/XLSX/Text/Helpers (233줄)

CodeIndexService:
- CodeIndexService.cs: 588 → 285줄 (DB/인덱싱 유지)
- CodeIndexService.Search.cs (신규): Search, TF-IDF, Tokenize, Dispose (199줄)

ClipboardHistoryService:
- ClipboardHistoryService.cs: 575 → 458줄
- ClipboardHistoryService.ImageCache.cs (신규): 이미지 캐시 유틸리티 (120줄)

IndexService:
- IndexService.cs: 568 → 412줄
- IndexService.Helpers.cs (신규): 경로 탐색 헬퍼 + 검색 캐시 (163줄)

빌드: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 21:34:51 +09:00
5bed67f64e [Phase50] PlanViewerWindow·SettingsWindow 분리 — 6개 파일
변경 파일:
- PlanViewerWindow.StepRenderer.cs: 616 → 425줄 (RenderSteps/SwapSteps/EditStep 유지)
- PlanViewerWindow.EditButtons.cs (신규): BuildApprovalButtons, BuildExecutionButtons,
  BuildCloseButton, ShowEditInput, CreateMiniButton, CreateActionButton (197줄)
- SettingsWindow.AgentConfig.cs: 608 → 303줄 (모델/스킬/템플릿 관리 유지)
- SettingsWindow.AiToggle.cs (신규): ApplyAiEnabledState, AiEnabled_Changed,
  NetworkMode_Changed, StepApprovalCheckBox_Checked, BtnClearMemory_Click (316줄)
- SettingsWindow.AgentHooks.cs: 605 → 334줄 (훅 관리 유지)
- SettingsWindow.McpAdvanced.cs (신규): MCP 서버 관리, 감사 로그, 폴백 모델,
  LoadAdvancedSettings/SaveAdvancedSettings (271줄)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 21:26:50 +09:00
306529a02c [Phase49] MarkdownRenderer·ChatWindow.MessageRendering 분리
변경 파일:
- MarkdownRenderer.cs: 621 → 405줄 (Render/AddInlines/Table 유지)
- MarkdownRenderer.CodeBlock.cs (신규): CreateCodeBlock, CreateCodeHeaderButton,
  GetExtensionForLang, ShowCodeFullScreen (~218줄)
- ChatWindow.MessageRendering.cs: 522 → 220줄 (RenderMessages/AddMessageBubble 유지)
- ChatWindow.Animations.cs (신규): GetCheckStyle, CreateCheckIcon, AnimateScale,
  ApplyHoverScaleAnimation, ApplyHoverBounceAnimation, CreateSimpleCheck,
  ApplyMenuItemHover (172줄)
- ChatWindow.FeedbackButtons.cs (신규): CreateActionButton, CreateFeedbackButton,
  AddLinkedFeedbackButtons (121줄)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 21:22:47 +09:00
c4f23eb2b0 [Phase49] ChatWindow.Sending.cs 분리 — MessageEdit, StreamingTimers 분할
변경 파일:
- ChatWindow.Sending.cs: 720 → ~300줄 (전송 섹션만 유지)
- ChatWindow.MessageEdit.cs (신규): ApplyMessageEntryAnimation, _isEditing 필드,
  EnterEditMode, SubmitEditAsync (~180줄)
- ChatWindow.StreamingTimers.cs (신규): StopAiIconPulse, CursorTimer_Tick,
  ElapsedTimer_Tick, TypingTimer_Tick (~58줄)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 21:18:27 +09:00
39e07dd947 [Phase48] 대형 파일 분할 리팩터링 4차 — 4개 신규 파셜 파일 생성
## 분할 대상 및 결과

### ChatWindow.Controls.cs (595줄 → 372줄)
- ChatWindow.TabSwitching.cs (232줄, 신규): _activeTab 필드, _tabConversationId 필드
  TabChat/Cowork/Code_Checked, UpdateTabUI, BtnPlanMode_Click, UpdatePlanModeUI,
  SwitchToTabConversation, SaveCurrentTabConversationId, StopStreamingIfActive

### ChatWindow.SlashCommands.cs (579줄 → 406줄)
- ChatWindow.DropActions.cs (160줄, 신규): DropActions 딕셔너리, CodeExtensions, DataExtensions,
  _dropActionPopup 필드, ShowDropActionMenu() 메서드

### WorkflowAnalyzerWindow.Charts.cs (667줄 → 397줄)
- WorkflowAnalyzerWindow.Timeline.cs (281줄, 신규): CreateTimelineNode, GetEventVisual, CreateBadge,
  ShowDetail, UpdateSummaryCards, FormatMs, Truncate, 윈도우 이벤트 핸들러, WndProc

### SkillGalleryWindow.xaml.cs (631줄 → ~430줄)
- SkillGalleryWindow.SkillDetail.cs (197줄, 신규): ShowSkillDetail() 메서드 전체
  (스킬 상세 보기 팝업 — 메타정보·프롬프트 미리보기·Action 버튼)

## 빌드 결과: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 21:12:38 +09:00
27bd8de83a [Phase47] 대형 파일 분할 리팩터링 3차 — 8개 신규 파셜 파일 생성
## 분할 대상 및 결과

### ChatWindow.ResponseHandling.cs (741줄 → 269줄)
- ChatWindow.StreamingUI.cs (303줄, 신규): CreateStreamingContainer, FinalizeStreamingContainer, ParseSuggestionChips, FormatTokenCount, EstimateTokenCount, StopGeneration
- ChatWindow.ConversationExport.cs (188줄, 신규): ForkConversation, OpenCommandPalette, ExecuteCommand, ExportConversation, ExportToHtml

### ChatWindow.PreviewAndFiles.cs (709줄 → ~340줄)
- ChatWindow.PreviewPopup.cs (~230줄, 신규): ShowPreviewTabContextMenu, OpenPreviewPopupWindow, _previewTabPopup 필드

### HelpDetailWindow.xaml.cs (673줄 → 254줄)
- HelpDetailWindow.Shortcuts.cs (168줄, 신규): BuildShortcutItems() 정적 메서드 (단축키 항목 160개+ 생성)
- HelpDetailWindow.Navigation.cs (266줄, 신규): 테마 프로퍼티, BuildTopMenu/SwitchTopMenu, BuildCategoryBar, NavigateToPage, 이벤트 핸들러
- partial class 전환: `public partial class HelpDetailWindow : Window`

### SkillService.cs (661줄 → 386줄)
- SkillService.Import.cs (203줄, 신규): ExportSkill, ImportSkills, MapToolNames — 가져오기/내보내기 섹션
- SkillDefinition.cs (81줄, 신규): SkillDefinition 클래스 독립 파일로 분리 (별도 최상위 클래스)
- partial class 전환: `public static partial class SkillService`

## NEXT_ROADMAP.md Phase 46 완료 항목 추가

## 빌드 결과: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 21:02:53 +09:00
aa907d7b79 [Phase46] 대형 파일 분할 리팩터링 2차 — 19개 신규 파셜 파일 생성
## 분할 대상 및 결과

### AgentLoopService.cs (1,334줄 → 846줄)
- AgentLoopService.HtmlReport.cs (151줄): AutoSaveAsHtml, ConvertTextToHtml, EscapeHtml
- AgentLoopService.Verification.cs (349줄): 도구 분류 판별 + RunPostToolVerificationAsync + EmitEvent + CheckDecisionRequired + FormatToolCallSummary

### ChatWindow 분할 (8개 신규 파셜 파일)
- ChatWindow.PlanViewer.cs (474줄): 계획 뷰어 — AddPlanningCard, AddDecisionButtons, CollapseDecisionButtons, ShowPlanButton 등 8개 메서드
- ChatWindow.EventBanner.cs (411줄): AddAgentEventBanner, BuildFileQuickActions
- ChatWindow.TaskDecomposition.cs (1,170줄 → 307줄): RenderSuggestActionChips, BuildFeedbackContext, UpdateProgressBar, BuildDiffView 잔류
- ChatWindow.BottomBar.cs (345줄): BuildBottomBar, BuildCodeBottomBar, ShowLogLevelMenu, ShowLanguageMenu 등
- ChatWindow.MoodMenu.cs (456줄): ShowFormatMenu, ShowMoodMenu, ShowCustomMoodDialog 등
- ChatWindow.CustomPresets.cs (978줄 → 203줄): ShowCustomPresetDialog, SelectTopic 잔류
- ChatWindow.ConversationMenu.cs (255줄): ShowConversationMenu (카테고리/삭제/즐겨찾기 팝업)
- ChatWindow.ConversationTitleEdit.cs (108줄): EnterTitleEditMode

### SettingsViewModel 분할
- SettingsViewModel.LlmProperties.cs (417줄): LLM·에이전트 관련 바인딩 프로퍼티
- SettingsViewModel.Properties.cs (837줄 → 427줄): 기능 토글·테마·스니펫 등 앱 수준 프로퍼티

### TemplateService 분할
- TemplateService.Css.cs (559줄): 11종 CSS 테마 문자열 상수
- TemplateService.cs (734줄 → 179줄): 메서드 로직만 잔류

### PlanViewerWindow 분할
- PlanViewerWindow.StepRenderer.cs (616줄): RenderSteps + SwapSteps + EditStep + 버튼 빌더 9개
- PlanViewerWindow.cs (931줄 → 324줄): Win32/생성자/공개 API 잔류

### App.xaml.cs 분할 (776줄 → 452줄)
- App.Settings.cs (252줄): SetupTrayIcon, OpenSettings, ToggleDockBar, RefreshDockBar, OpenAiChat
- App.Helpers.cs (92줄): LoadAppIcon, IsAutoStartEnabled, SetAutoStart, OnExit

### LlmService.ToolUse.cs 분할 (719줄 → 115줄)
- LlmService.ClaudeTools.cs (180줄): SendClaudeWithToolsAsync, BuildClaudeToolBody
- LlmService.GeminiTools.cs (175줄): SendGeminiWithToolsAsync, BuildGeminiToolBody
- LlmService.OpenAiTools.cs (215줄): SendOpenAiWithToolsAsync, BuildOpenAiToolBody

### SettingsWindow.UI.cs 분할 (802줄 → 310줄)
- SettingsWindow.Storage.cs (167줄): RefreshStorageInfo, BtnStorageCleanup_Click 등
- SettingsWindow.HotkeyUI.cs (127줄): RefreshHotkeyBadges, EnsureHotkeyInCombo, GetKeyName 등
- SettingsWindow.DevMode.cs (90줄): DevModeCheckBox_Checked, UpdateDevModeContentVisibility

## 빌드 결과: 경고 0, 오류 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 20:51:26 +09:00