using System.Windows; using System.Windows.Media; using AxCopilot.SDK; using AxCopilot.Themes; using AxCopilot.Views; namespace AxCopilot.Handlers; /// /// 간편 사용 설명서 핸들러. "help" 프리픽스로 사용합니다. /// 예: help → 전체 명령어 카드 목록 /// help 계산 → "계산" 관련 명령어 필터 /// help clip → 클립보드 관련 명령어 필터 /// Enter 시 해당 예시를 클립보드에 복사합니다. /// public class HelpHandler : IActionHandler { private readonly AxCopilot.Services.SettingsService? _settings; public HelpHandler(AxCopilot.Services.SettingsService? settings = null) { _settings = settings; } public string? Prefix => "help"; public PluginMetadata Metadata => new( "Help", "AX Commander 사용 설명서", "1.0", "AX"); /// 설정에서 변경된 프리픽스와 핫키를 실시간 반영한 항목 목록을 반환합니다. private HelpEntry[] GetEntries() { var capPrefix = _settings?.Settings.ScreenCapture.Prefix ?? "cap"; if (string.IsNullOrWhiteSpace(capPrefix)) capPrefix = "cap"; var hotkey = _settings?.Settings.Hotkey ?? "Alt+Space"; var entries = (HelpEntry[])_baseEntries.Clone(); for (int i = 0; i < entries.Length; i++) { // cap 프리픽스 동적 반영 if (entries[i].Title == "스크린샷 캡처 (예약어 변경 가능)") { entries[i] = entries[i] with { Command = capPrefix, Example = $"{capPrefix} screen / {capPrefix} window / {capPrefix} region / {capPrefix} scroll / (설정 → 캡처 탭)" }; } // 글로벌 핫키 동적 반영 if (entries[i].Title == "AX Commander 열기 / 닫기") { entries[i] = entries[i] with { Command = hotkey, Example = "설정 → 핫키에서 변경 가능" }; } } return entries; } // ─── 명령어 카드 데이터 ──────────────────────────────────────────────────── // (카테고리, 예약어/명령, 제목, 설명, 예시, 심볼, 색) private static readonly HelpEntry[] _baseEntries = [ // ── 검색 ──────────────────────────────────────────────────────────────── new("검색", "", "앱 · 파일 · 북마크 퍼지 검색", "앱 이름, 파일명, 한국어 초성, Chrome·Edge 북마크를 통합 검색", "chrome / 보고서 / ㅅㄷ (설정) / 북마크 제목", Symbols.Search, "#0078D4"), // ── 계산 & 변환 ────────────────────────────────────────────────────────── new("계산", "=", "계산기", "수식 계산 · 단위 변환 · 실시간 환율", "= sqrt(144) / = 100 USD to KRW / = 15km to miles", Symbols.Calculator, "#4B5EFC"), // ── 웹 검색 ────────────────────────────────────────────────────────────── new("검색", "?", "웹 검색 (10개 엔진)", "?n 네이버 · ?g 구글 · ?y 유튜브 · ?gh 깃허브 · ?d DuckDuckGo · ?w 위키피디아 · ?nw 나무위키 · ?nm 네이버지도 · ?ni 네이버이미지 · ?gi 구글이미지", "? 오늘 날씨 / ?n 뉴스 / ?g python / ?nw 검색어 / ?y 음악 / ?gh axios", Symbols.Globe, "#006EAF"), // ── 클립보드 ───────────────────────────────────────────────────────────── new("클립보드", "#", "클립보드 히스토리", "복사 이력 검색 & 재사용 · Shift+↑↓로 여러 항목 병합", "# / # 회의록 / (Shift+↑↓ 선택 후 Shift+Enter 병합)", Symbols.History, "#B7791F"), new("클립보드", "$", "클립보드 텍스트 변환 (12종)", "현재 클립보드 내용을 즉시 변환", "$json / $b64e / $upper / $url / $md5 / $trim", Symbols.Clipboard, "#8764B8"), // ── 텍스트 스니펫 ──────────────────────────────────────────────────────── new("텍스트", ";", "텍스트 스니펫", "저장된 템플릿 불러오기 · 변수 치환 지원", ";addr / ;sig / ;greet", Symbols.Snippet, "#0F6CBD"), // ── 단축키 ─────────────────────────────────────────────────────────────── new("단축키", "@", "URL 단축키", "저장해둔 URL을 키워드로 바로 열기", "@gh / @notion / @jira", Symbols.Globe, "#0078D4"), new("단축키", "cd", "폴더 단축키", "저장해둔 폴더를 키워드로 바로 열기", "cd dl / cd work / cd desktop", Symbols.Folder, "#107C10"), new("단축키", ">", "터미널 명령 실행", "PowerShell 명령을 AX Commander에서 직접 실행", "> git status / > ipconfig / > cls", Symbols.Terminal, "#323130"), // ── 워크스페이스 ────────────────────────────────────────────────────────── new("창관리", "~", "워크스페이스 저장·복원", "현재 창 배치를 스냅샷으로 저장하고 언제든 복원", "~save 업무 / ~restore 업무 / ~list", Symbols.Workspace, "#C50F1F"), new("창관리", "snap", "창 분할 레이아웃", "창을 화면의 특정 영역에 즉시 스냅", "snap left / snap right / snap tl / snap full", Symbols.SnapLayout, "#B45309"), new("창관리", "cap", "스크린샷 캡처 (예약어 변경 가능)", "영역 선택 · 활성 창 · 스크롤 · 전체 화면. Shift+Enter로 지연 캡처(3/5/10초 타이머). 결과는 클립보드에 복사. 글로벌 단축키(PrintScreen 등)로 바로 캡처 가능. 설정 → 캡처 탭에서 예약어·단축키·스크롤 속도 변경", "cap region / cap window / cap scroll / cap screen / Shift+Enter → 지연 캡처", Symbols.CaptureIcon, "#BE185D"), // ── 시스템 명령 ─────────────────────────────────────────────────────────── new("시스템", "/", "시스템 명령", "잠금·절전·재시작·종료·타이머·알람", "/lock / /sleep / /shutdown / /timer 5m / /alarm 14:30", Symbols.Power, "#4A4A4A"), new("시스템", "info · *", "시스템 정보", "IP · 배터리 · 볼륨 · 가동시간 · CPU · 디스크. `*` 입력으로도 동일하게 사용 가능", "info / info ip / info battery / * / * ip", Symbols.Computer, "#5B4E7E"), new("알림", "", "잠금 해제 사용시간 알림", "PC 잠금 해제 시 오늘 누적 사용 시간과 격려 문구·명언 팝업 표시. 설정 → 알림 탭에서 활성화", "설정 → 알림 탭: 활성화 토글 / 표시 위치(4방향) / 표시 간격(30분~4시간) / 자동 닫힘(5초~3분)", Symbols.ReminderBell, "#EA8F00"), new("시스템", "kill", "프로세스 종료", "프로세스 이름으로 검색 후 강제 종료", "kill chrome / kill node / kill teams", Symbols.Error, "#CC2222"), new("시스템", "media", "미디어 제어", "재생·일시정지·이전·다음·볼륨 조절", "media play / media next / media vol+ / media mute", Symbols.MediaPlay, "#1A6B3C"), // ── 개발자 도구 ─────────────────────────────────────────────────────────── new("개발", "json", "JSON 포맷 · 검증", "클립보드의 JSON을 정렬·압축·유효성 검사", "json → format / minify / validate", Symbols.JsonValid, "#D97706"), new("개발", "encode", "인코딩 · 해싱", "Base64 · URL · HTML · UTF-8 · MD5 · SHA256", "encode base64 / encode url / encode sha256", Symbols.EncodeIcon, "#6366F1"), new("개발", "color", "색상 변환", "HEX ↔ RGB ↔ HSL ↔ HSV 변환 및 색상명 지원", "color #FF5733 / color 255,87,51 / color red", Symbols.ColorPicker, "#EC4899"), new("개발", "port", "포트 · 프로세스 조회", "포트 번호로 점유 프로세스 확인", "port 3000 / port 8080 / port 443", Symbols.PortIcon, "#006699"), new("개발", "env", "환경변수 조회", "시스템 환경변수 검색 및 클립보드 복사", "env / env PATH / env JAVA", Symbols.EnvVar, "#0D9488"), // ── 앱 관리 ─────────────────────────────────────────────────────────────── new("앱", "emoji", "이모지 피커", "300개+ 이모지 검색 · Enter로 클립보드 복사", "emoji / emoji 하트 / emoji wave / emoji 불꽃", Symbols.Emoji, "#F59E0B"), new("앱", "recent", "최근 파일", "Windows 최근 파일 목록 검색 & 바로 열기", "recent / recent 보고서 / recent xlsx", Symbols.RecentFiles, "#059669"), new("앱", "note", "빠른 메모", "간단한 메모를 저장하고 불러오기", "note 내일 회의 10시 / note", Symbols.Note, "#7C3AED"), new("앱", "uninstall","앱 제거", "설치된 앱 검색 후 제거", "uninstall / uninstall kakao / uninstall zoom", Symbols.Uninstall, "#DC2626"), // ── 유틸리티 ──────────────────────────────────────────────────────────── new("유틸", "pick", "스포이드 색상 추출", "화면 아무 곳을 클릭하여 HEX 색상 코드 추출 · 돋보기로 실시간 미리보기 · 결과 반투명 창 5초 표시", "pick → 스포이드 모드 진입 → 클릭으로 색상 추출", Symbols.ColorPicker, "#EC4899"), new("유틸", "date", "날짜 계산 · D-day · 타임스탬프", "날짜 가감(+30d), D-day 계산, Unix ↔ 날짜 변환, 요일·ISO 주차 조회", "date / date +30d / date 2026-12-25 / date 1711584000 / date unix", Symbols.DateIcon, "#0EA5E9"), new("시스템", "svc", "서비스 관리", "Windows 서비스 검색·시작·중지·재시작 + AX 클립보드 서비스 강제 재시작", "svc / svc spooler / svc restart clipboard", Symbols.ServiceIcon, "#6366F1"), new("유틸", "pipe", "클립보드 파이프라인", "변환을 > 로 체이닝: 대문자→공백제거→Base64 등 19종 필터 한 번에 적용", "pipe upper > trim > b64e / pipe sort > unique > number", Symbols.PipeIcon, "#8B5CF6"), new("유틸", "journal", "업무 일지 자동 생성", "오늘 사용한 앱·명령어·활성 시간을 마크다운 요약으로 자동 생성. 스탠드업/일일 보고에 바로 사용", "journal / journal 2026-03-25", Symbols.JournalIcon, "#0EA5E9"), new("유틸", "routine", "루틴 자동화", "등록된 루틴(앱·폴더·URL 조합)을 한 번에 순서대로 실행. 출근/퇴근/회의 전 세팅", "routine / routine morning / routine endofday", Symbols.RoutineIcon, "#F59E0B"), new("유틸", "batch", "텍스트 일괄 처리", "클립보드 각 줄에 동시 적용: 접두사·접미사·줄번호·정렬·중복제거·따옴표·치환·CSV 변환", "batch number / batch prefix >> / batch sort / batch replace A B", Symbols.BatchIcon, "#10B981"), new("유틸", "diff", "텍스트/파일 비교", "클립보드 최근 2개 텍스트 또는 파일 2개를 줄 단위 비교. 추가·삭제·동일 줄 하이라이트", "diff / diff C:\\a.txt C:\\b.txt", Symbols.DiffIcon, "#EF4444"), new("유틸", "win", "윈도우 포커스 스위처", "열린 창을 타이틀·프로세스명으로 검색하여 Alt+Tab 없이 즉시 전환", "win / win chrome / win 보고서", Symbols.WindowIcon, "#6366F1"), new("시스템", "^", "Windows 실행 명령", "Win+R 실행 창과 동일하게 명령어 실행. notepad, calc, cmd, control, mstsc 등 모든 Windows 실행 명령 지원", "^ notepad / ^ cmd / ^ calc / ^ control / ^ mspaint", Symbols.LaunchIcon, "#E08850"), new("유틸", "stats", "텍스트 통계 분석", "클립보드 텍스트 글자·단어·줄 수, 키워드 빈도, 읽기 시간 추정", "stats / stats 키워드 (클립보드 텍스트 분석)", Symbols.TextStats, "#6366F1"), new("유틸", "fav", "즐겨찾기 (파일·폴더)", "자주 쓰는 경로를 등록하고 빠르게 열기", "fav / fav add 보고서 C:\\work\\report.xlsx / fav del 보고서", Symbols.Favorite, "#F59E0B"), new("유틸", "rename", "파일 일괄 이름변경", "폴더 내 파일을 패턴·변수로 일괄 이름변경. {n}순번 {date}날짜 {orig}원본명", "rename C:\\work\\*.xlsx 보고서_{n}", Symbols.RenameIcon, "#8B5CF6"), new("유틸", "monitor", "시스템 리소스 모니터", "CPU·메모리·디스크·프로세스 실시간 현황 조회", "monitor / monitor cpu / monitor mem / monitor disk", Symbols.MonitorIcon, "#10B981"), new("유틸", "scaffold", "프로젝트 스캐폴딩", "내장/사용자 템플릿으로 프로젝트 폴더 구조 일괄 생성", "scaffold / scaffold webapi / scaffold C:\\new-project webapi", Symbols.ScaffoldIcon,"#0EA5E9"), // ── 단축키 ─────────────────────────────────────────────────────────────── new("키보드", "Alt+Space", "AX Commander 열기 / 닫기", "어디서든 AX Commander를 토글", "설정 → 핫키에서 변경 가능", Symbols.Info, "#6B7280"), new("키보드", "Enter", "실행", "선택된 항목 실행", "", Symbols.Info, "#6B7280"), new("키보드", "Shift+Enter", "Large Type / 병합 실행 / 지연 캡처", "텍스트를 전체화면으로 표시 · 클립보드 항목 병합 · 캡처 모드에서는 지연 캡처(3초/5초/10초) 타이머 선택", "(#모드) Shift+↑↓ 선택 후 Shift+Enter 병합 / (cap모드) Shift+Enter → 타이머 선택", Symbols.Info, "#6B7280"), new("키보드", "Tab", "자동완성", "선택 항목으로 입력 자동완성", "", Symbols.Info, "#6B7280"), new("키보드", "→ (커서 끝)", "파일 액션 메뉴", "앱·파일 선택 후 → 키: 경로복사 · 탐색기 · 관리자 · 터미널", "", Symbols.Info, "#6B7280"), new("키보드", "Ctrl+,", "설정 열기", "AX Copilot 설정 창", "", Symbols.Info, "#6B7280"), ]; // ─── GetItemsAsync ───────────────────────────────────────────────────────── public Task> GetItemsAsync(string query, CancellationToken ct) { var q = query.Trim(); var allEntries = GetEntries(); // 쿼리 없이 "help"만 입력한 경우: 전체 기능 창 여는 항목 하나만 표시 if (string.IsNullOrEmpty(q)) { var cmdCount = allEntries.Count(e => e.Category != "키보드"); var keyCount = allEntries.Count(e => e.Category == "키보드"); return Task.FromResult>( [ new LauncherItem( "AX Commander — 전체 기능 목록 보기", $"총 {cmdCount}개 명령어 · {keyCount}개 단축키 · Enter → 기능 설명 창 열기", null, "__HELP_OVERVIEW__", Symbol: "\uE946") ]); } // "help 검색어" 형태: 일치하는 항목 리스트 표시 var filtered = allEntries.Where(e => e.Category.Contains(q, StringComparison.OrdinalIgnoreCase) || e.Command.Contains(q, StringComparison.OrdinalIgnoreCase) || e.Title.Contains(q, StringComparison.OrdinalIgnoreCase) || e.Description.Contains(q, StringComparison.OrdinalIgnoreCase)); var items = filtered .Select(e => new LauncherItem( FormatTitle(e), FormatSubtitle(e), null, e.Example, Symbol: e.Symbol)) .ToList(); if (items.Count == 0) { items.Add(new LauncherItem( $"'{q}'에 해당하는 명령어가 없습니다", "help만 입력하면 전체 기능 창을 열 수 있어요", null, null, Symbol: Symbols.Info)); } return Task.FromResult>(items); } // ─── ExecuteAsync ────────────────────────────────────────────────────────── public Task ExecuteAsync(LauncherItem item, CancellationToken ct) { if (item.Data is not string s) return Task.CompletedTask; if (s == "__HELP_OVERVIEW__") { // 전체 기능 창 열기 Application.Current.Dispatcher.Invoke(() => { var currentEntries = GetEntries(); var models = currentEntries.Select(e => new HelpItemModel { Category = e.Category, Command = string.IsNullOrEmpty(e.Command) ? "(퍼지 검색)" : e.Command, Title = e.Title, Description = e.Description, Example = e.Example, Symbol = e.Symbol, ColorBrush = ParseColor(e.ColorHex) }); var globalHotkey = _settings?.Settings.Hotkey ?? "Alt+Space"; new HelpDetailWindow(models, currentEntries.Count(e => e.Category != "키보드"), globalHotkey).Show(); }); return Task.CompletedTask; } // 일반 항목: 예시를 클립보드에 복사 if (!string.IsNullOrWhiteSpace(s)) { try { Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(s)); } catch { /* 무시 */ } } return Task.CompletedTask; } private static SolidColorBrush ParseColor(string hex) { try { var color = (System.Windows.Media.Color) System.Windows.Media.ColorConverter.ConvertFromString(hex); return new SolidColorBrush(color); } catch { return new SolidColorBrush(System.Windows.Media.Colors.Gray); } } // ─── 헬퍼 ───────────────────────────────────────────────────────────────── private static string FormatTitle(HelpEntry e) { var prefix = string.IsNullOrEmpty(e.Command) ? $"[{e.Category}]" : $"[{e.Category}] {e.Command}"; return $"{prefix} — {e.Title}"; } private static string FormatSubtitle(HelpEntry e) { var parts = new List { e.Description }; if (!string.IsNullOrEmpty(e.Example)) parts.Add($"예) {e.Example}"); return string.Join(" · ", parts); } // ─── 데이터 모델 ─────────────────────────────────────────────────────────── private record HelpEntry( string Category, string Command, string Title, string Description, string Example, string Symbol, string ColorHex); }