namespace AxCopilot.Views; internal static class SlashCommandCatalog { internal static readonly IReadOnlyDictionary Commands = new Dictionary(StringComparer.OrdinalIgnoreCase) { // 공통 ["/clear"] = ("Clear", "__CLEAR__", "all"), ["/new"] = ("New", "__NEW__", "all"), ["/reset"] = ("Reset", "__RESET__", "all"), ["/status"] = ("Status", "__STATUS__", "all"), ["/model"] = ("Model", "__MODEL__", "all"), ["/permissions"] = ("Permissions", "__PERMISSIONS__", "all"), ["/allowed-tools"] = ("Allowed Tools", "__ALLOWED_TOOLS__", "all"), ["/theme"] = ("Theme", "__THEME__", "all"), ["/color"] = ("Color", "현재 테마/색상 구성을 점검하고 가독성 중심 개선안을 제시하세요.", "all"), ["/config"] = ("Config", "현재 설정 상태를 점검하고, 목적에 맞는 권장 설정 변경안을 제시하세요.", "all"), ["/settings"] = ("Settings", "__SETTINGS__", "all"), ["/session"] = ("Session", "현재 세션의 핵심 맥락과 이어서 할 일을 5개 이내로 정리하세요.", "all"), ["/usage"] = ("Usage", "현재 사용 흐름을 개선할 수 있는 사용 팁을 간결히 제시하세요.", "all"), ["/upgrade"] = ("Upgrade", "현재 작업/구성 기준으로 안전한 업그레이드 체크리스트를 제시하세요.", "all"), ["/copy"] = ("Copy", "사용자가 바로 복사해 쓸 수 있는 최종 결과 형태로 간결하게 답변하세요.", "all"), ["/rename"] = ("Rename", "__RENAME__", "all"), ["/feedback"] = ("Feedback", "__FEEDBACK__", "all"), ["/skills"] = ("Skills", "__SKILLS__", "all"), ["/sandbox-toggle"] = ("Sandbox Toggle", "__SANDBOX_TOGGLE__", "all"), ["/statusline"] = ("Statusline", "__STATUSLINE__", "all"), ["/heapdump"] = ("Heap Dump", "__HEAPDUMP__", "all"), ["/passes"] = ("Passes", "__PASSES__", "all"), ["/chrome"] = ("Chrome", "__CHROME__", "all"), ["/stickers"] = ("Stickers", "__STICKERS__", "all"), ["/thinkback"] = ("Thinkback", "__THINKBACK__", "all"), ["/thinkback-play"] = ("Thinkback Play", "__THINKBACK_PLAY__", "all"), ["/exit"] = ("Exit", "현재 대화를 마무리하기 위한 요약과 다음 재개 지점을 3줄 이내로 제시하세요.", "all"), ["/login"] = ("Login", "인증/연결 점검 절차를 단계별로 안내하세요.", "all"), ["/logout"] = ("Logout", "안전한 로그아웃 및 세션 정리 체크리스트를 안내하세요.", "all"), ["/desktop"] = ("Desktop", "데스크톱 실행/연결 환경 점검 체크리스트를 제시하세요.", "all"), ["/mobile"] = ("Mobile", "모바일 연동/사용 시 주의사항과 권장 구성을 제시하세요.", "all"), ["/ide"] = ("IDE", "IDE 연동 상태를 점검하고 생산성 향상 팁을 제시하세요.", "all"), ["/terminal-setup"] = ("Terminal Setup", "터미널 환경 초기 설정 체크리스트를 제시하세요.", "all"), ["/add-dir"] = ("Add Dir", "작업 디렉터리 추가 시 권장 구조와 주의사항을 제시하세요.", "all"), ["/advisor"] = ("Advisor", "현재 요청에 대한 실행 전략을 조언자 관점으로 간결히 제시하세요.", "all"), ["/mcp"] = ("MCP", "__MCP__", "all"), ["/agents"] = ("Agents", "현재 작업에 적합한 에이전트 분담 전략을 제시하세요.", "all"), ["/plugin"] = ("Plugin", "플러그인 사용/구성 상태를 점검하고 권장 구성을 제시하세요.", "all"), ["/reload-plugins"] = ("Reload Plugins", "플러그인 재로드 전후 점검 체크리스트를 제시하세요.", "all"), ["/output-style"] = ("Output Style", "현재 작업 목적에 맞는 출력 스타일 가이드를 제시하세요.", "all"), ["/remote-env"] = ("Remote Env", "원격 환경 연결 시 필수 점검 항목을 제시하세요.", "all"), ["/install-github-app"] = ("Install GitHub App", "GitHub 앱 연동 절차와 점검 항목을 제시하세요.", "all"), ["/install-slack-app"] = ("Install Slack App", "Slack 앱 연동 절차와 점검 항목을 제시하세요.", "all"), ["/btw"] = ("BTW", "현재 맥락에서 추가로 유용한 보조 팁을 짧게 제시하세요.", "all"), ["/keybindings"] = ("Keybindings", "주요 단축키/입력 효율화 팁을 현재 작업 기준으로 정리하세요.", "all"), ["/privacy-settings"] = ("Privacy", "보안/개인정보 관점의 권장 설정을 점검표 형태로 제시하세요.", "all"), ["/rate-limit-options"] = ("Rate Limit", "요청 한도 이슈를 줄이기 위한 설정/사용 전략을 제시하세요.", "all"), ["/release-notes"] = ("Release Notes", "최근 변경사항을 릴리즈 노트 형식으로 정리하세요.", "all"), ["/rewind"] = ("Rewind", "직전 변경 이전 상태로 되돌릴 때의 안전 절차를 제시하세요.", "all"), ["/tag"] = ("Tag", "현재 작업 결과를 태깅/분류하는 기준을 제안하세요.", "all"), ["/vim"] = ("Vim", "Vim 스타일 작업 효율 팁을 현재 작업에 맞춰 제시하세요.", "all"), ["/plan"] = ("Plan", "요청을 바로 실행하지 말고 먼저 3~7단계 실행 계획을 간결히 제시한 뒤, 사용자 승인 후 실행하세요.", "all"), ["/memory"] = ("Memory", "대화 맥락에서 지속적으로 참고할 핵심 사실을 정리하고, 필요한 경우 memory 도구 저장/갱신 관점으로 답변하세요.", "all"), ["/context"] = ("Context", "현재 작업 컨텍스트(목표, 제약, 현재 상태, 다음 액션)를 구조화해 요약하세요.", "all"), ["/stats"] = ("Stats", "__STATS__", "all"), ["/cost"] = ("Cost", "__COST__", "all"), ["/export"] = ("Export", "__EXPORT__", "all"), ["/compact"] = ("Compact", "__COMPACT__", "all"), ["/summary"] = ("Summary", "사용자가 제공한 내용을 핵심 포인트 위주로 간결하게 요약해 주세요. 불릿 포인트 형식을 사용하세요.", "all"), ["/translate"] = ("Translate", "사용자가 제공한 텍스트를 영어로 번역해 주세요. 원문의 톤과 뉘앙스를 유지하세요.", "all"), ["/explain"] = ("Explain", "사용자가 제공한 내용을 쉽고 자세하게 설명해 주세요. 필요하면 예시를 포함하세요.", "all"), ["/fix"] = ("Fix", "사용자가 제공한 텍스트의 맞춤법, 문법, 자연스러운 표현을 교정해 주세요. 수정 사항을 명확히 표시하세요.", "all"), // Cowork/Code 전용 ["/review"] = ("Code Review", "작업 폴더의 git diff를 분석하여 코드 리뷰를 수행해 주세요. code_review 도구를 사용하세요.", "dev"), ["/commit"] = ("Commit", "__COMMIT__", "dev"), ["/ultrareview"] = ("Ultra Review", "작업 폴더의 변경을 P0/P1 우선순위 기준으로 강도 높게 리뷰하고, 재현 조건/수정 방향/테스트 누락까지 제시하세요.", "dev"), ["/security-review"] = ("Security Review", "작업 폴더 코드를 보안 중심으로 점검하고 취약점/개선안을 제시하세요.", "dev"), ["/pr"] = ("PR Summary", "작업 폴더의 변경사항을 PR 설명 형식으로 요약해 주세요. code_review(action: pr_summary) 도구를 사용하세요.", "dev"), ["/pr-comments"] = ("PR Comments", "변경사항을 검토하고 PR 코멘트 형태로 개선 의견을 작성하세요.", "dev"), ["/test"] = ("Test", "작업 폴더의 코드에 대한 단위 테스트를 생성해 주세요. test_loop 도구를 사용하세요.", "dev"), ["/verify"] = ("Verify", "__VERIFY__", "dev"), ["/structure"] = ("Structure", "작업 폴더의 프로젝트 구조를 분석하고 설명해 주세요. folder_map 도구를 사용하세요.", "dev"), ["/build"] = ("Build", "작업 폴더의 프로젝트를 빌드해 주세요. build_run 도구를 사용하세요.", "dev"), ["/search"] = ("Search", "작업 폴더에서 관련 코드를 검색해 주세요. search_codebase 도구를 사용하세요.", "dev"), ["/diff"] = ("Diff", "현재 작업 폴더의 변경(diff)을 분석해 핵심 변경점과 리스크를 요약하세요.", "dev"), ["/doctor"] = ("Doctor", "현재 프로젝트/환경의 잠재 이슈를 점검하고 우선순위별 개선안을 제시하세요.", "dev"), ["/hooks"] = ("Hooks", "현재 훅/자동화 관련 설정을 점검하고 안전한 운영 가이드를 제시하세요.", "dev"), ["/tasks"] = ("Tasks", "현재 작업을 태스크 단위로 분해해 우선순위와 다음 실행 항목을 제시하세요.", "dev"), ["/branch"] = ("Branch", "현재 변경 기준으로 적절한 브랜치/커밋 전략을 제안하세요.", "dev"), ["/files"] = ("Files", "현재 작업에서 핵심 파일과 변경 후보를 우선순위로 정리하세요.", "dev"), ["/resume"] = ("Resume", "이전 작업 맥락을 복원한다고 가정하고 현재 상태/남은 작업을 이어서 정리하세요.", "dev"), ["/init"] = ("Init", "프로젝트 온보딩 관점에서 초기 점검 체크리스트를 제시하세요.", "dev"), ["/init-verifiers"] = ("Init Verifiers", "검증 자동화(빌드/테스트/리뷰) 초기 구성을 위한 체크리스트를 제시하세요.", "dev"), ["/effort"] = ("Effort", "현재 요청의 난이도와 권장 추론 강도를 제안하세요.", "dev"), ["/fast"] = ("Fast", "속도 우선 모드로 진행할 때의 최소 안전 절차를 제시하세요.", "dev"), // 특수 ["/help"] = ("Help", "__HELP__", "all"), }; internal static List<(string Cmd, string Label, bool IsSkill)> MatchBuiltinCommands(string input, bool isDevTab) { if (string.IsNullOrWhiteSpace(input)) return []; return Commands .Where(kv => kv.Key.StartsWith(input, StringComparison.OrdinalIgnoreCase)) .Where(kv => kv.Value.Tab == "all" || (isDevTab && kv.Value.Tab == "dev")) .Select(kv => (Cmd: kv.Key, Label: kv.Value.Label, IsSkill: false)) .ToList(); } internal static bool TryGetEntry(string commandToken, out (string Label, string SystemPrompt, string Tab) entry) => Commands.TryGetValue(commandToken, out entry); }