Files
AX-Copilot/docs/LAUNCHER_ROADMAP.md
lacvet 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

207 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AX Commander (런처) 고도화 계획
## 현재 상태 (v1.5.0)
### 핵심 기능 (44개 핸들러)
- 퍼지 검색 + 한글 초성 검색 (FuzzyEngine)
- 44개 프리픽스 명령 (계산기, 이모지, 웹검색, 스니펫, 클립보드, 프로세스 등)
- 10가지 테마 + 커스텀 테마
- 플러그인 시스템 (DLL + JSON 스킬)
- AX Agent AI 대화 통합
- 글로벌 핫키 (Alt+Space), 무지개 글로우 효과
- 파일/앱 인덱싱, 북마크 검색, 사용 빈도 랭킹
- 워크스페이스 프로파일 (창 레이아웃 저장/복원)
- 클립보드 히스토리, 스니펫 확장
- 스크린 캡처, 컬러 피커, JSON 도구
### 경쟁 서비스 비교 (2026년 3월 기준)
| 기능 | AX Commander | Raycast | Alfred 5 | Flow Launcher | PowerToys |
|------|-------------|---------|----------|---------------|-----------|
| AI 대화 | O (AX Agent) | O (멀티모델) | 워크플로우 | X | X |
| MCP 프로토콜 | O | X | X | X | X |
| 에이전트 코딩 | O (Code 탭) | O | X | X | X |
| 플러그인 | DLL+JSON | 1500+ 스토어 | 워크플로우 갤러리 | 200+ | 모듈 |
| 클립보드 히스토리 | O | O (리치) | 파워팩 | 플러그인 | X |
| 윈도우 관리 | O (22 레이아웃) | 70+ 레이아웃 | X | X | FancyZones |
| 파일 탐색기 통합 | X | X | X | X | X |
| Everything 연동 | O (es 프리픽스) | X | X | O | X |
| 선택 텍스트 AI | O (텍스트 액션 팝업) | O (AI Commands) | X | X | X |
| 영구 독 UI | O (독 바) | X | X | X | O (Command Palette Dock) |
| 클라우드 동기화 | X | Pro | Dropbox | X | X |
| 다국어 | 5개국어 | 영어 | 영어 | 영어 | 다국어 |
---
## Phase L1 — 차세대 런처 고도화 (v1.5.0)
| # | 기능 | 구현 내용 |
|---|------|----------|
| L1-1 | 선택 텍스트 AI 명령 | TextActionPopup (커서 위치 팝업), 번역/요약/교정/설명/다시쓰기. 설정 기반 명령 선택, 1개 시 팝업 없이 바로 실행 |
| L1-2 | Everything 연동 | EverythingHandler (`es` 프리픽스), Everything64.dll P/Invoke, 미설치 시 graceful fallback |
| L1-3 | 윈도우 타일링 확장 | SnapHandler 11→22개 레이아웃 (3등분, 2/3, 3분할 조합) |
| L1-4 | 플러그인 자동 설치 | PluginHost.InstallFromZip() + UninstallPlugin(). 로컬 zip 기반 (URL 제외: 사내 보안) |
| L1-5 | 영구 독 바 | DockBarWindow (화면 하단 고정). 설정 기반 아이템, CPU/RAM, 시계, 글로우, 투명도, 위치 기억 |
| L1-6 | 대화상자 통합 | FileDialogWatcher (SetWinEventHook + #32770 감지). 열기/저장 시 런처 자동 열기 |
| L1-7 | 클립보드 핀/카테고리 | IsPinned/Category 필드, 자동 분류(URL/코드/경로), Ctrl+P 핀 토글, #pin/#url/#코드 필터 |
| L1-8 | 클라우드 설정 동기화 | 보류 (사내 환경) |
| L1-9 | 커스텀 테마 마켓 | 보류 (사내 환경) |
| 추가 | 독 바 설정 탭 | 설정창에 독 바 전용 탭 (표시 항목, 투명도, 글로우, 위치 초기화) |
| 추가 | 설정창 UI 개편 | 테마+색상편집 하위탭 합침, 일반+알림 하위탭 합침, v1.5.0 신기능 설정값 추가 |
| 추가 | 아이콘 교체 | 다이아몬드 픽셀 ICO (7 sizes). 앱/인스톨러/바로가기/AboutWindow/LauncherWindow/SVG 전체 통일 |
---
## Phase L1 추가 완료 (v1.5.0)
| # | 기능 | 상태 |
|---|------|------|
| 추가 | **Windows 탐색기 셸 확장** | ✓ ShellExtensionService — HKCU 레지스트리 등록/해제, 명령줄 파싱 |
| 추가 | **저장 공간 관리 UI** | ✓ StorageAnalyzer — 사용량 분석, 드라이브 여유, 7/14/30일 정리 |
| 추가 | **설정 도움말 아이콘** | ✓ AI 관련 설정 17개에 `?` 아이콘 + 커스텀 다크 툴팁 |
| 추가 | **독 바 실시간 설정** | ✓ 설정 변경 즉시 반영, 자동 표시, 위치 기억 |
---
## Phase L2 — 클립보드 고도화 + UX 개선 (v1.5.3)
> **방향**: 클립보드 히스토리의 실용성 극대화 (이미지 원본 품질, 자동 복사 워크플로우), 런처 UX 개선.
> Raycast의 리치 클립보드, Alfred의 Snippet 확장을 참고하되 사내 로컬 환경에 최적화.
| # | 기능 | 설명 | 우선순위 |
|---|------|------|----------|
| L2-1 | **클립보드 이미지 원본 해상도 보존** | 원본 PNG를 `clipboard_images/` 캐시 폴더에 저장, 썸네일(80px)은 표시용으로만 사용. 캐시 정리 정책 (30일/500MB). Enter 복원 시 원본 해상도로 클립보드 복사 | ✅ 완료 |
| L2-2 | **Shift+Enter 실행 시 자동 클립보드 복사** | Shift+Enter로 외부 뷰어 열기 전에 해당 항목을 시스템 클립보드에 자동 복사. 텍스트/이미지(원본 해상도) 모두 지원 | ✅ 완료 |
| ✅ L2-3 | **클립보드 이미지 미리보기 창** | `#` 이미지 항목에서 Shift+Enter → `ClipboardImagePreviewWindow`. 원본 해상도 표시, Ctrl+휠/+/0/F 줌, PNG·JPEG·BMP 저장, Ctrl+C 복사 | 중간 |
| ✅ L2-4 | **클립보드 검색 강화** | 이미지 OCR 텍스트 추출 → 텍스트 기반 이미지 검색. Windows OCR API (로컬) 활용. `OcrText` 필드, `ExtractOcrTextAsync()`, TFM `net8.0-windows10.0.17763.0` | 중간 |
| ✅ L2-5 | **클립보드 항목 병합** | Ctrl+Click 마우스 다중 선택 추가 (Shift+↑/↓ 키보드 선택은 기존 구현). `ResultList_PreviewMouseLeftButtonUp` 분기 | 낮음 |
### Phase L2 추가 완료 (v1.5.3)
| # | 기능 | 상태 |
|---|------|------|
| 추가 | **독 바 탭 위치 이동** | ✓ 설정 탭 순서에서 독 바를 3번째(테마 뒤)로 이동 — 사용 빈도 기반 접근성 향상 |
| 추가 | **설정 기타 탭 접기/열기** | ✓ 등록된 도구, MCP 커넥터, 슬래시 스킬 각각 접기/펼치기 섹션 (화살표 토글) |
| 추가 | **About 정보 변경** | ✓ ".NET 8" → "Commander + Agent" (기술 스택 비노출 원칙) |
| 추가 | **가이드 내장 뷰어** | ✓ GuideViewerWindow — 암호화된 가이드를 앱 내 WebBrowser로 복호화 렌더링. 개발자 모드 연동 |
---
## Phase L3 — 차세대 런처 (v2.0) — 진행 중 / 일부 완료
> **방향**: 경쟁 런처(Raycast 1500+ 확장, PowerToys Run)의 에코시스템 수준을 참고하되,
> 사내 보안/오프라인 환경에서 동작하는 자체 완결형 기능으로 구현.
> AX Agent **Phase 18 (v2.0)** 과 교차 개발 — 런처와 에이전트의 기능 경계가 겹치는 항목은 통합 구현.
| # | 기능 | 설명 | 우선순위 | 교차 |
|---|------|------|----------|------|
| ✅ L3-1 | **플러그인 갤러리 + 레지스트리** | 로컬 NAS/Git 레지스트리 기반 탐색/설치/업데이트 인앱 갤러리 | 높음 | → Agent 18-2 |
| ✅ L3-2 | **웹 검색 AI 요약** | ? 검색 결과를 AI가 요약하여 런처에 표시 | 중간 | → Agent 18-6 |
| ✅ L3-3 | **AI 스니펫** | `;email {수신자} {주제}` → LLM이 이메일 초안 자동 생성. 기존 스니펫에 AI 확장 | 중간 | → Agent 18-3 |
| ✅ L3-4 | **파라미터 퀵링크** | `jira {티켓번호}` → URL 템플릿 변수 치환 (사내 JIRA/Confluence 등) | 중간 | → Agent 18-4 |
| ✅ L3-5 | **파일 태그 시스템** | 파일에 사용자 태그 부여, `tag` 프리픽스로 태그 기반 검색. `file_tags.json` 로컬 저장 | 중간 | — |
| L3-6 | **오프라인 AI (로컬 SLM)** | ONNX Runtime + phi-3, 서버 없이 번역/요약 | 낮음 | → Agent 18-5 |
| ✅ L3-7 | **다중 디스플레이** | 마우스 커서 위치 모니터에 런처 표시, 독 바 per-monitor 위치 저장·유효성 검증 | 낮음 | — |
| ✅ L3-8 | **알림 센터 통합** | `notif` 프리픽스로 알림 이력 조회·검색·초기화. NotificationCenterService 이력 연동, 클립보드 복사 | 낮음 | — |
| ✅ L3-9 | **런처 미니 위젯** | 하단 위젯 바 4종: 시스템 모니터(CPU/RAM/디스크), 뽀모도로 타이머(`pomo` 프리픽스), 빠른 메모 건수, 서버 상태(Ollama/LLM/MCP). PerformanceMonitorService·PomodoroService·ServerStatusService 싱글턴 | 낮음 | — |
---
## Phase L4 — 검색/탐색 UX 혁신 + 생산성 확장 (v1.7.x) ✅ 완료
> **방향**: Raycast/Alfred 기능 갭 해소 + 기존 L1-7 미완 기능 이행. 런처 단독 완결형 생산성 강화.
| # | 기능 | 설명 | 상태 |
|---|------|------|------|
| ✅ L4-1 | **파일 탐색기 인라인 패널** | 경로 입력(`C:\`, `D:\`, `~\`) 감지 → 폴더 목록 표시. →/← 키로 폴더 진입/상위 이동. Enter로 탐색기/기본 앱 실행 | 완료 |
| ✅ L4-2 | **QuickLook F3 강화** | PDF(PdfPig 텍스트 추출), 코드 구문강조(14개 언어 배경색+줄번호), Word/Excel(OpenXml) 미리보기 | 완료 |
| ✅ L4-3 | **클립보드 핀 & 카테고리** | Ctrl+P 핀 고정, `#pin/#url/#코드/#경로` 필터, 자동 분류. L1-7 기구현 확인 | 완료 |
| ✅ L4-4 | **검색 히스토리** | ↑/↓ 키로 이전 검색어 탐색. 50개 FIFO `search_history.json` 로컬 저장 | 완료 |
| ✅ L4-5 | **고급 검색 필터 문법** | `ext:.pdf size:>1mb modified:week in:documents type:file` 인라인 필터. SearchFilterParser + FuzzyEngine.SearchWithFilter() | 완료 |
| ✅ L4-6 | **계산기 단위 변환 확장** | `=20km` 자동 제안, `=today+30d` 날짜 계산. UnitConverter.AutoSuggest() + DateShortcut | 완료 |
---
## Phase L5 — 전용 핫키 · OCR · 배치 작업 · 자동화 (v1.7.4~)
> **방향**: 파워유저의 반복 작업 제거. Raycast의 핫키 할당, Windows OCR 통합, 멀티파일 배치 이름변경,
> QuickLook 인라인 편집, 워크플로우 스냅 6가지로 런처를 "행동 허브"로 확장.
| # | 기능 | 설명 | 우선순위 |
|---|------|------|----------|
| L5-1 | **항목별 전용 핫키** ✅ | 앱·URL·폴더에 `Ctrl+Alt+숫자` 등 글로벌 단축키 직접 할당. `hotkey` 프리픽스로 관리. `HotkeyAssignment` 모델 + `InputListener` 확장 + 설정창 "전용 핫키" 탭 | 높음 |
| L5-2 | **OCR 화면 텍스트 추출** ✅ | `ocr` 프리픽스 + F4 글로벌 단축키. RegionSelectWindow 재사용, Windows.Media.Ocr 로컬 엔진. 결과 → 클립보드 복사 + 런처 입력창 자동 채움 | 높음 |
| L5-3 | **QuickLook 인라인 편집** ✅ | F3 미리보기 → Ctrl+E 편집 모드 토글. 텍스트/코드 전체 읽기(300줄 제한 없음). Ctrl+S 저장, ● 수정 마커, Esc 취소 확인, 저장 후 미리보기 새로고침 | 중간 |
| L5-4 | **앱 세션 스냅** ✅ | `session` 프리픽스. `AppSession/SessionApp` 모델 추가 + `AppSettings.AppSessions` 저장. `SessionHandler`: 목록·실행·new/edit/del 서브커맨드. `SessionEditorWindow`: 세션 이름·설명·앱 행(경로+라벨+스냅 팝업 14종+삭제) 인라인 편집. 실행 시 Process.Start → 창 핸들 대기(6초) → ApplySnapToWindow(P/Invoke SetWindowPos+ShowWindow) | 중간 |
| L5-5 | **배치 파일 이름 변경** ✅ | `batchren` 프리픽스로 BatchRenameWindow 오픈. 변수 패턴(`{name}`, `{n:3}`, `{date:format}`, `{ext}`) + 정규식 모드(`/old/new/`). 드래그 앤 드롭·폴더/파일 추가, DataGrid 실시간 미리보기, 충돌 감지(배경 붉은 강조), 확장자 유지 토글, 시작 번호 지정, 적용 후 엔트리 갱신 | 중간 |
| L5-6 | **자동화 스케줄러** ✅ | `sched` 프리픽스. `ScheduleEntry` 모델(Id·Name·Enabled·TriggerType·TriggerTime·WeekDays·TriggerDate·ActionType·ActionTarget·ActionArgs·LastRun) + `AppSettings.Schedules` 저장. `SchedulerService`: 30초 간격 타이머, ±1분 트리거 윈도우, `LastRun.Date == today` 중복 방지, once 실행 후 자동 비활성화. `ScheduleHandler`: 목록(다음 실행 시각 표시)·new·edit·del·Enter 토글. `ScheduleEditorWindow`: 트리거 유형 4종(매일/주중/매주/한번)·요일 다중 선택·날짜 입력, 액션 2종(앱 실행/알림). `ComputeNextRun` + `TriggerLabel` 유틸 공유 | 낮음 |
### Phase L5 구현 순서 (권장)
```
L5-1 (핫키) → L5-2 (OCR) → L5-3 (편집) → L5-5 (배치 이름변경) → L5-4 (세션 스냅) → L5-6 (스케줄러)
```
### L5-1 항목별 전용 핫키 — 구현 설계
```csharp
// HotkeyAssignment: 단축키 → 실행 대상 매핑 모델
public record HotkeyAssignment(string HotkeyStr, string TargetPath, string Label);
// GlobalHotkeyService 확장
// - RegisterCustomHotkeys(IEnumerable<HotkeyAssignment>) 추가
// - 기존 Alt+Space 핫키와 독립 관리 (별도 id 공간)
// HotkeyHandler (prefix="hotkey"): 등록/삭제/목록 조회
// 런처 -> "hotkey set ctrl+alt+1 C:\Apps\Chrome.exe 크롬"
// 런처 -> "hotkey list" → 등록된 핫키 목록
// 런처 -> "hotkey del ctrl+alt+1"
```
### L5-2 OCR 화면 텍스트 추출 — 구현 설계
```csharp
// Windows.Media.Ocr.OcrEngine (이미 L2-4 ClipboardOcr에서 사용 중)
// OcrHandler (prefix="ocr"):
// 1. 런처 숨김
// 2. 반투명 오버레이 창(전체화면) 표시 → 마우스 드래그로 영역 선택
// 3. PrintScreen + crop → BitmapImage → OcrEngine.RecognizeAsync()
// 4. 결과 텍스트 클립보드 복사 + 런처 재표시 (결과 항목으로 표시)
// ScreenRegionSelector: 기존 ScreenCaptureHandler의 SelectionOverlay 재사용 가능
```
### L5-3 QuickLook 인라인 편집 — 구현 설계
```csharp
// QuickLookWindow.xaml에 편집 모드 토글 버튼 추가 (타이틀바 우상단 ✏ 아이콘)
// TextScrollViewer → TextBox (편집 모드에서만 활성)
// Ctrl+S → File.WriteAllText() + 저장 완료 토스트
// 수정 감지: TextBox.TextChanged → 타이틀에 "●" 마커
// Esc → 저장 안 함 확인(CustomMessageBox) 후 미리보기 모드 복귀
// 편집 가능 확장자: .txt, .md, .log, .cs, .py, .js, .ts, .json, .xml, .yaml 등
```
### L5-5 배치 파일 이름 변경 — 구현 설계
```csharp
// BatchRenameWindow: 선택 파일 목록 + 패턴 입력 + 미리보기 DataGrid
// 패턴 유형:
// {name} → 원본 이름
// {n:3} → 3자리 순번 (001, 002, ...)
// {date} → 오늘 날짜 (yyyyMMdd)
// {ext} → 확장자
// 정규식 치환: /old/new/
// LauncherWindow: 다중 선택(Shift+↑/↓) 후 F2 → BatchRenameWindow 열기
```
---
## 기술 부채 (v1.5.0 해결)
| 항목 | 상태 |
|------|------|
| SnapHandler 기본 기능만 | ✓ 22개 레이아웃으로 확장 (3등분, 2/3, 3분할 조합 추가) |
| Everything 미연동 | ✓ EverythingHandler 구현 (`es` 프리픽스, P/Invoke, graceful fallback) |
| 플러그인 설치 수동 | ✓ PluginHost.InstallFromZip() 로컬 zip 자동 추출·등록 (URL 제외: 사내 보안) |
| 이미지 클립보드 미지원 | ✓ PNG→Base64 DPAPI 암호화 저장/복원, 앱 재시작 후 이미지 히스토리 유지 |