cc-switch는 7개의 AI 코딩 CLI 도구가 각자 다른 포맷(JSON·TOML·.env)으로 들고 있는 설정·API 키·MCP·스킬·프롬프트를 하나의 데스크탑 앱에서 통합 관리한다. 50+개의 공급자(provider) 프리셋이 내장돼 있어서 AWS Bedrock·NVIDIA NIM·커뮤니티 릴레이까지 클릭 한 번에 갈아끼울 수 있다.
핵심은 단순한 "GUI 설정 편집기"가 아니라는 점이다. 로컬 프록시 모드로 포맷 변환·자동 페일오버·서킷 브레이커를 제공하고, 시스템 트레이에서 메인 창을 열지 않고도 즉시 공급자 전환이 가능하며, SQLite 원자적 쓰기로 설정 파일이 깨지지 않는다.
여러 SIM 카드를 한 폰에서 굴리는 듀얼 SIM 매니저를 떠올려 보자. SK텔레콤·KT·해외 로밍 SIM을 매번 폰을 분해해 끼우는 대신, 듀얼 SIM 슬롯이 있으면 화면에서 토글 한 번에 갈아끼울 수 있다.
cc-switch는 그 듀얼 SIM의 AI 코딩 CLI 버전이다. Claude Code의 ANTHROPIC_API_KEY, Codex의 ~/.codex/config.toml, Gemini CLI의 GOOGLE_API_KEY, OpenCode의 .env — 매번 손으로 편집하는 대신 GUI에서 "Anthropic 공식 → AWS Bedrock → PackyCode 릴레이"를 클릭 한 번에 전환한다.
2025~2026년에 AI 코딩 CLI 도구가 한꺼번에 쏟아졌다. Anthropic의 Claude Code, OpenAI의 Codex CLI, Google의 Gemini CLI, 오픈소스 OpenCode·OpenClaw·Hermes Agent — 각자 강점이 다르다. Claude는 긴 컨텍스트에서 강하고, Codex는 빠르고, Gemini는 무료 할당량이 크다. 개발자들은 여러 개를 동시에 깔고 상황에 따라 골라 쓴다.
문제는 각 도구가 자기 설정 포맷을 고집한다는 점. Claude Code는 환경 변수, Codex는 TOML, Gemini는 JSON, OpenCode는 .env — 공급자를 갈아끼울 때마다 7개 파일을 손으로 편집해야 한다. cc-switch는 이 "멀티 코딩 CLI 시대의 SIM 매니저"로 정확히 시장 빈틈을 찔렀다.
Anthropic 공식, OpenAI 공식, AWS Bedrock, Google Vertex, NVIDIA NIM, 그리고 PackyCode·AIGoCode·DMXAPI·Crazyrouter 같은 중국·글로벌 릴레이 서비스까지 50+개의 공급자가 기본 내장돼 있다. 사용자가 키만 붙여넣으면 끝이다. 직접 endpoint URL을 입력하거나 인증 헤더를 만들 필요가 없다.
| 경쟁 옵션 | 방식 | 한계 |
|---|---|---|
| 수동 편집 | vim ~/.codex/config.toml | 7개 도구 × N개 공급자 = 손목 부상 |
| dotfiles 매니저 | chezmoi, stow | 버전 관리는 되지만 즉시 전환 불가 |
| direnv + per-folder .envrc | 폴더 진입 시 자동 적용 | MCP·스킬 동기화 안 됨 |
| cc-switch | GUI + 트레이 + SQLite | 7개 도구 통합 + 프록시 + 동기화 |
Claude Code·Claude Desktop·Codex·Gemini CLI·OpenCode·OpenClaw·Hermes Agent는 모두 MCP 서버를 따로 등록한다. Slack MCP를 7번 등록해야 지원 도구(7개) 전체에서 다 쓸 수 있다. cc-switch는 한 패널에서 MCP 서버를 추가하면 자동으로 지원 도구(7개)의 설정 파일에 양방향 동기화한다. 라이브 파일에서 직접 편집한 변경도 다시 빨아들인다.
스킬도 마찬가지. GitHub 레포 URL 하나 붙여넣으면 심볼릭 링크 또는 파일 복사 모드로 지원 도구(7개)의 skills 디렉터리에 동시 설치된다. 프롬프트는 CLAUDE.md / AGENTS.md / GEMINI.md를 마크다운 에디터에서 편집하고 활성화 시 라이브 파일에 동기화된다. "backfill protection" — 라이브 파일에서 외부 도구가 수정한 내용도 다시 cc-switch DB로 빨아들여서 손실을 막는다.
이게 진짜 차별점이다. cc-switch는 로컬에서 HTTP 프록시 서버를 띄울 수 있다. CLI 도구가 cc-switch 프록시에 요청을 보내면, cc-switch가 진짜 공급자에게 중계한다.
지출·요청 수·토큰 사용량을 트렌드 차트로 보여주고 모델별 커스텀 가격을 입력해서 정확한 청구 추정이 가능하다. 세션 매니저는 지원 도구(7개)의 대화 히스토리를 통합 검색·복원할 수 있다. Claude Code에서 어제 한 작업을 Codex에서 이어서 할 수 있다는 뜻이다.
설정 디렉터리를 클라우드 동기화 폴더에 두면 여러 PC에서 같은 공급자·MCP·스킬·프롬프트를 공유한다. WebDAV 서버도 지원해서 셀프호스팅 NAS(Synology·QNAP)에 동기화할 수 있다.
Electron 대안인 Tauri 2.8로 만들어서 설치 용량이 ~10MB 수준, 메모리 사용량도 Electron의 1/3~1/5. macOS는 Apple 코드사이닝·공증 완료여서 다운로드 후 바로 실행된다 — "확인되지 않은 개발자" 경고 우회 절차가 필요 없다. Homebrew Cask(brew install --cask cc-switch)와 AUR(paru -S cc-switch-bin)도 지원.
cc-switch는 "minimal intrusion" 설계 원칙을 따른다. 앱을 삭제해도 마지막에 활성화된 설정은 라이브 파일에 그대로 남아서 Claude Code·Codex는 정상 동작한다. 그래서 현재 활성 공급자는 삭제할 수 없다 — 모든 공급자가 사라지면 CLI가 못 쓰게 되니까. 이 원칙 덕분에 사용자가 안심하고 도입할 수 있다.
| 라이브러리 | 버전 | 역할 |
|---|---|---|
tauri | 2.8+ | 크로스 플랫폼 데스크탑 프레임워크. Electron 대안, 시스템 웹뷰 사용 |
rust | 1.95 (toolchain) / MSRV 1.85 | 백엔드 언어. 메모리 안전 + 빠른 네이티브 성능 |
tokio | — | 비동기 런타임. HTTP 프록시·DB I/O·시스템 트레이 이벤트 처리 |
serde | — | JSON·TOML 직렬화/역직렬화. 7개 CLI의 다양한 설정 포맷 처리 |
thiserror | — | 커스텀 에러 타입 정의. ? 연산자로 에러 전파 단순화 |
tauri-plugin-updater | — | 자동 업데이트 — 새 버전 다운로드 + 백그라운드 설치 |
tauri-plugin-process | — | 외부 프로세스 실행 — CLI 도구 버전 확인 등 |
tauri-plugin-dialog | — | 네이티브 파일 선택 다이얼로그 |
tauri-plugin-store | — | 키-밸류 영구 저장소 (device-level UI 설정용) |
tauri-plugin-log | — | 구조화된 로그 출력 + 파일 회전 |
SQLite (rusqlite 0.31, bundled/backup/hooks) | — | SSOT 데이터베이스. ~/.cc-switch/cc-switch.db |
| 라이브러리 | 버전 | 역할 |
|---|---|---|
react | 18 | UI 렌더링 — concurrent features 활용 |
typescript | — | 타입 안전 — Tauri IPC 명령 시그니처를 타입으로 보장 |
vite | — | 번들러 · HMR(Hot Module Reload) · 빠른 개발 서버 |
tailwindcss | 3.4 | 유틸리티 우선 CSS — 빠른 스타일링 |
@tanstack/react-query | v5 | 서버 상태 캐시 · 동기화 — Tauri IPC 응답을 자동 캐시 |
react-i18next | — | 다국어(zh / zh-TW / en / ja) — 키-밸류 번역 + 폴백 |
react-hook-form | — | 폼 상태 관리 — 재렌더링 최소화로 큰 폼도 빠름 |
zod | — | 스키마 검증 — 공급자 설정 입력값 런타임 검증 + TS 타입 추론 |
shadcn/ui | — | Radix UI + TailwindCSS 기반 컴포넌트 모음. 복사-붙여넣기형, 의존성 0 |
@dnd-kit | — | 드래그앤드롭 정렬 — 공급자 순서 변경에 사용 |
| 도구 | 역할 |
|---|---|
vitest | Vite 친화 테스트 러너. Jest 대안, 더 빠름 |
MSW (Mock Service Worker) | Tauri IPC API 모킹 — 백엔드 없이 프론트엔드 단독 테스트 가능 |
@testing-library/react | 컴포넌트 테스트 — 사용자 관점 인터랙션 검증 |
cargo test | Rust 백엔드 단위 테스트 — --features test-hooks로 테스트 전용 hook 활성 |
| 도구 | 역할 |
|---|---|
pnpm | Node 패키지 매니저 — npm/yarn보다 디스크 효율 좋음 (심볼릭 링크 기반) |
tauri-cli | 2.8+ — tauri build가 OS별 인스톨러까지 만들어줌 |
| Windows | .msi 인스톨러 + Portable.zip |
| macOS | .dmg + Homebrew Cask (brew install --cask cc-switch) — Apple 공증 완료 |
| Linux | .deb + .rpm + .AppImage + AUR (paru -S cc-switch-bin) |
| Flatpak | 공식 릴리스에는 없음 — .deb에서 자체 빌드 가능 (가이드 제공) |
| 대상 | 역할 |
|---|---|
| Claude Code | Anthropic 공식 CLI. 환경 변수 + ~/.claude/ 설정 |
| Codex CLI | OpenAI 공식. ~/.codex/config.toml + Plus·Team 다중 계정 |
| Gemini CLI | Google 공식. ~/.gemini/ + GEMINI.md 프롬프트 |
| OpenCode | 오픈소스 코딩 에이전트 (anomalyco/opencode) |
| OpenClaw | 또 다른 오픈소스 코딩 도구. workspace 에디터(AGENTS.md / SOUL.md) 별도 제공 |
| Hermes Agent | NousResearch의 에이전트 |
| 50+ 공급자 프리셋 | Anthropic·OpenAI·AWS Bedrock·NVIDIA NIM·Google Vertex·PackyCode·AIGoCode·DMXAPI·Crazyrouter·MiniMax·SiliconFlow·BytePlus·… 등 |
| 클라우드 스토리지 | Dropbox · OneDrive · iCloud · WebDAV (Synology·QNAP NAS 대응) |
모든 동기화 가능한 데이터는 ~/.cc-switch/cc-switch.db (SQLite) 단일 파일에 저장된다. 라이브 설정 파일(~/.claude/ 등)은 출력 캐시일 뿐이고 권위 있는 데이터는 DB 안에 있다. 그래서 클라우드 동기화도 DB 파일 하나만 동기화하면 끝이다.
"동기화돼야 하는 데이터"와 "이 기기에만 적용되는 UI 설정"을 분리했다. 동기화 데이터(공급자·MCP·스킬·프롬프트)는 SQLite로, 이 기기 UI 환경설정(테마·창 크기·언어)은 ~/.cc-switch/settings.json으로. 클라우드 동기화 시 settings.json은 빠지므로 PC마다 다른 UI 환경을 유지할 수 있다.
공급자를 활성화하면 cc-switch가 라이브 파일에 쓴다. 사용자가 외부 에디터로 라이브 파일을 수정하면, cc-switch가 다음에 그 공급자를 열 때 자동으로 변경을 backfill(역흡수)해서 DB에 저장한다. 즉 라이브 파일과 DB가 한쪽이 권위적이지 않고 서로 동기화된다.
"temp 파일 + rename" 패턴. 새 설정을 ~/.claude/config.json.tmp에 먼저 쓰고, 완전히 다 쓴 후에 rename(config.json.tmp, config.json)으로 교체한다. POSIX에서 rename은 원자적 연산이라 중간에 프로세스가 죽어도 파일이 반쪽짜리로 깨지지 않는다. AppData·.codex·.gemini 모두 이 패턴 적용.
SQLite 연결 객체를 Mutex로 감싸서 동시 접근을 직렬화한다. 시스템 트레이 클릭 + GUI 동시 조작 같은 동시 이벤트에서도 race condition이 발생하지 않는다. Rust 컴파일러가 데이터 경쟁을 컴파일 타임에 잡아주는 것과 결합돼 매우 견고하다.
Commands(API) → Services(비즈니스) → DAO(데이터 접근) → Database로 명확히 4계층 분리. 프론트엔드가 Tauri IPC로 부르는 것은 Commands 레이어뿐, 그 아래는 모두 내부 모듈. 테스트도 각 레이어 단독으로 작성 가능하다.
| 서비스 | 책임 |
|---|---|
ProviderService | 공급자 CRUD · 전환 · backfill · 정렬 |
McpService | MCP 서버 관리 · import/export · 라이브 파일 동기화 |
ProxyService | 로컬 프록시 모드 · 핫스위치 · 포맷 변환 · 페일오버 |
SessionManager | 지원 도구(7개) 대화 히스토리 통합 검색·복원 |
ConfigService | 설정 import/export · 자동 백업 회전 (최근 10개 유지) |
SpeedtestService | API 엔드포인트 지연 시간 측정 — 공급자 선택 시 빠른 곳 추천 |
같은 메커니즘으로 MCP 서버·프롬프트·스킬도 URL로 공유 가능. "클릭 한 번에 설정 공유"의 핵심.
cc-switch/
├── src/ # 프론트엔드 (React + TypeScript)
│ ├── components/
│ │ ├── providers/ # 공급자 관리 UI
│ │ ├── mcp/ # MCP 패널
│ │ ├── prompts/ # 프롬프트 관리 (CLAUDE.md / AGENTS.md)
│ │ ├── skills/ # 스킬 관리 (GitHub 레포 설치)
│ │ ├── sessions/ # 세션 매니저 (대화 히스토리)
│ │ ├── proxy/ # 로컬 프록시 모드 패널
│ │ ├── openclaw/ # OpenClaw 전용 워크스페이스 에디터
│ │ ├── settings/ # 설정 (터미널·백업·About)
│ │ ├── deeplink/ # Deep Link 임포트 다이얼로그
│ │ ├── env/ # 환경 변수 관리
│ │ ├── universal/ # 크로스 앱 통합 설정
│ │ ├── usage/ # 사용량 통계 대시보드
│ │ └── ui/ # shadcn/ui 컴포넌트 라이브러리
│ ├── hooks/ # 커스텀 훅 (비즈니스 로직 분리)
│ ├── lib/
│ │ ├── api/ # Tauri API 래퍼 (타입 안전 IPC)
│ │ └── query/ # TanStack Query 설정
│ ├── i18n/locales/ # 다국어 번역 (zh / zh-TW / en / ja)
│ ├── config/ # 프리셋 (50+ 공급자 · MCP 템플릿)
│ └── types/ # TypeScript 타입 정의
├── src-tauri/ # 백엔드 (Rust)
│ └── src/
│ ├── commands/ # Tauri 명령 레이어 (도메인별 분리)
│ ├── services/ # 비즈니스 로직 (ProviderService 등)
│ ├── database/ # SQLite DAO 레이어
│ ├── proxy/ # 프록시 모듈 (핫스위치 + 페일오버)
│ ├── session_manager/ # 세션 관리 (대화 히스토리)
│ ├── deeplink/ # Deep Link 핸들러
│ └── mcp/ # MCP 동기화 모듈
├── tests/ # 프론트엔드 테스트 (vitest + MSW)
├── docs/ # 사용자 매뉴얼 (다국어)
├── flatpak/ # Flatpak 빌드 가이드 (커뮤니티용)
└── assets/ # 스크린샷 · 스폰서 자산
| 경로 | 역할 |
|---|---|
src/lib/api/*.ts | Tauri IPC 래퍼. 백엔드 명령을 타입 안전한 함수로 노출 — invoke('add_provider', {...})를 addProvider({...})로 |
src/hooks/useProvider.ts | TanStack Query를 활용한 공급자 상태 관리 — 자동 캐시·재검증 |
src/config/providers.ts | 50+ 공급자 프리셋 정의 (Anthropic, OpenAI, Bedrock, …) |
src-tauri/src/commands/providers.rs | 공급자 관련 Tauri 명령 (add_provider, switch_provider 등) |
src-tauri/src/services/provider_service.rs | 공급자 CRUD 비즈니스 로직 — DB·라이브 파일 동시 갱신 |
src-tauri/src/database/dao.rs | SQLite 쿼리 (Mutex 보호 연결) |
src-tauri/src/proxy/server.rs | 로컬 HTTP 프록시 서버 (tokio + hyper) |
src-tauri/tauri.conf.json | Tauri 설정 — 윈도우 크기·아이콘·번들·업데이트 채널 |
pnpm-lock.yaml | pnpm 의존성 잠금 — CI 재현성 보장 |
| 경로 | 내용 |
|---|---|
~/.cc-switch/cc-switch.db | SSOT SQLite — 공급자·MCP·프롬프트·스킬 메타데이터 |
~/.cc-switch/settings.json | 기기별 UI 환경설정 (테마·언어 등 — 동기화 제외) |
~/.cc-switch/backups/ | 자동 백업 (회전식, 최근 10개 유지) |
~/.cc-switch/skills/ | 설치된 스킬 — 지원 도구(7개)에 symlink로 노출 |
~/.cc-switch/skill-backups/ | 스킬 제거 전 자동 백업 (최근 20개) |
cc-switch는 Tauri 2를 진지하게 다루는 좋은 레퍼런스다. Electron이 Chromium을 통째로 번들하는 반면, Tauri는 시스템 웹뷰(macOS WebKit, Windows WebView2, Linux WebKitGTK)를 쓴다. 결과: 설치 용량 10MB vs 150MB, 메모리 1/3.
배울 것: Tauri IPC 패턴 — #[tauri::command] 데코레이터로 Rust 함수를 프론트에 노출하고, 프론트에서 invoke()로 호출하는 흐름. 플러그인 시스템 — updater · process · dialog · store · log 같은 공식 플러그인을 조합. 시스템 트레이 — SystemTray::new()로 트레이 아이콘에 메뉴 매다는 법.
실습 아이디어: "내 노트 매니저 데스크탑 앱" — 마크다운 노트를 Tauri 2 + React로 만들어 보기. 트레이 아이콘에서 빠른 메모 추가.
일반 React 앱에서는 fetch + useState 조합으로 데이터 받아오는데, 그러면 캐시·재검증·로딩·에러 상태를 다 수동으로 짜야 한다. TanStack Query v5는 그걸 1줄로 해결한다:
const { data, isLoading } = useQuery({
queryKey: ['providers'],
queryFn: () => invoke('list_providers'),
});
cc-switch는 Tauri IPC 응답을 캐시 키로 자동 관리한다. 공급자 추가 → queryClient.invalidateQueries(['providers']) 한 줄이면 화면 전체가 자동 새로고침.
배울 것: 쿼리 키 설계, mutation + optimistic update, staleTime / gcTime 튜닝, 서버 상태와 클라이언트 상태의 분리.
shadcn/ui는 라이브러리가 아니다. CLI로 컴포넌트 코드를 자기 프로젝트에 복사해 넣는 방식이다(npx shadcn add button). 결과: 외부 의존성 0, 마음대로 수정 가능, 트리 쉐이킹 최적.
배울 것: Radix UI 프리미티브 위에 Tailwind로 스타일링하는 패턴. 헤드리스 컴포넌트(접근성·키보드 내비게이션 기본 제공) + 디자인 토큰 분리.
설정 파일은 깨지면 안 된다. cc-switch는 "temp + rename"으로 깨짐을 막는다. Rust 코드 패턴:
let tmp = path.with_extension("tmp");
std::fs::write(&tmp, content)?; // 1. 임시 파일에 쓰기
std::fs::rename(&tmp, path)?; // 2. 원자적 교체
// 중간에 죽어도 원본은 그대로!
배울 것: 파일 시스템 원자성 개념 (POSIX rename = 원자적, write = 비원자적). SQLite WAL 모드. Mutex로 동시성 보호.
cc-switch 안에서 tokio + hyper로 작은 프록시를 띄운다. 들어온 요청의 헤더·본문을 변환해서 진짜 LLM 공급자에게 보낸다. 응답 스트리밍도 그대로 통과시켜야 한다(SSE 기반 LLM 응답).
배울 것: HTTP 프록시 기본기 (Host 헤더, X-Forwarded-For), 스트리밍 응답 패스스루, 서킷 브레이커 패턴 (실패 N회 → open 상태로 빠르게 거절 → half-open으로 복구 시도), OpenAI/Anthropic API 포맷 차이 이해.
ccswitch:// 같은 커스텀 스킴은 어떻게 OS에 등록될까? Tauri는 tauri.conf.json의 deepLinkProtocols로 등록하고, 핸들러를 Rust에서 받는다. macOS는 Info.plist의 CFBundleURLTypes, Windows는 레지스트리, Linux는 .desktop 파일 — Tauri가 다 처리해 준다.
zh/zh-TW/en/ja 4개 언어를 어떻게 깔끔하게 관리할까. src/i18n/locales/{lang}/translation.json에 키-밸류로 저장하고, useTranslation() 훅으로 가져온다.
const { t } = useTranslation();
return <button>{t('provider.add')}</button>;
배울 것: 네임스페이스 분리, 변수 보간, 복수형 처리, 날짜·숫자 포맷.
MCP는 2024년 말 Anthropic이 표준화한 "LLM과 외부 도구의 어댑터 규약"이다. JSON-RPC 기반, stdio 또는 SSE 트랜스포트. cc-switch는 MCP 서버를 등록·실행·상태 모니터링·라이브 파일 동기화까지 한다.
배울 것: MCP 서버 작성법 (Python/TypeScript SDK), 도구 정의(tools), 리소스(resources), 프롬프트(prompts) 3대 프리미티브 — 자기만의 MCP 서버를 만들어보면 LLM에 자기 데이터를 연결하는 능력이 생긴다.
| 플랫폼 | 최소 요구사항 | 비고 |
|---|---|---|
| Windows | Windows 10 이상 | .msi 인스톨러 또는 Portable.zip |
| macOS | macOS 12 (Monterey) 이상 | .dmg + Apple 공증, Homebrew Cask |
| Linux (Debian/Ubuntu) | Ubuntu 22.04+ / Debian 11+ | .deb 패키지 |
| Linux (Fedora/RHEL) | Fedora 34+ / openSUSE | .rpm 패키지 |
| Linux (Arch) | 최신 Arch / Manjaro | paru -S cc-switch-bin AUR |
| Linux (범용) | libwebkit2gtk-4.1 보유 배포판 | .AppImage |
Tauri 기반이라 매우 가볍다. 대략 추정:
~/.cc-switch/cc-switch.db = 100KB~수 MB (공급자 수에 비례)| 도구 | 버전 |
|---|---|
| Node.js | 18+ |
| pnpm | 8+ |
| Rust | 1.95+ (toolchain) / MSRV 1.85 |
| Tauri CLI | 2.8+ |
| OS | WebView 의존성 있는 OS — Linux는 webkit2gtk-4.1 추가 패키지 필요 |
1. 자기 OS에 맞게 설치 (Homebrew/AUR/MSI).
2. Claude Code에 Anthropic 공식 키와 임의의 릴레이 키 두 개를 등록한다.
3. 시스템 트레이 메뉴에서 한 번씩 전환하고 claude 명령으로 동작 확인.
4. ~/.cc-switch/cc-switch.db를 SQLite Browser로 열어서 어떻게 저장됐는지 본다.
목표: SSOT가 어떻게 라이브 파일과 동기화되는지 눈으로 확인.
1. 메인 PC에서 cc-switch의 설정 디렉터리를 Dropbox 폴더로 옮긴다(--config-dir 옵션 또는 심볼릭 링크).
2. 다른 PC에 cc-switch 설치 후 같은 디렉터리를 가리키게 한다.
3. 메인 PC에서 새 공급자 추가 → 다른 PC에서 자동으로 보이는지 확인.
4. 충돌이 발생하면 어떻게 되는지 실험.
1. git clone → pnpm install → pnpm dev로 개발 모드 실행.
2. src/config/providers.ts를 열어서 기존 프리셋이 어떻게 정의됐는지 본다.
3. 한국 서비스(예: 네이버 클로바 X)나 사내 LLM 게이트웨이를 위한 새 프리셋을 추가한다.
4. pnpm typecheck + pnpm test:unit으로 검증.
5. GUI에서 새 프리셋이 보이고 선택 가능한지 확인.
목표: 오픈소스 컨트리뷰션 워크플로 체험 — PR을 보내볼 수도 있다.
cc-switch의 핵심 아이디어를 200줄 안에 재현해 보자. PyQt6 또는 Textual로 작은 GUI를 만들고:
- ~/.cc-switch-mini/providers.json에 공급자 N개 저장
- 선택하면 ~/.claude/settings.json의 ANTHROPIC_API_KEY + ANTHROPIC_BASE_URL 갱신 (atomic write로!)
- 트레이 아이콘에서도 전환 가능하게 (pystray)
- 변경 후 claude --help 실행해서 정상 동작 확인
목표: cc-switch의 본질이 "JSON 한 파일 교체"임을 체득하고, atomic write의 중요성을 직접 느껴본다.
cc-switch는 zh/zh-TW/en/ja 4개 언어만 지원한다. 한국어(ko) 추가를 PR로 보내자:
1. src/i18n/locales/ko/translation.json 생성 → 모든 키 번역.
2. src/lib/i18n.ts에 ko 언어 등록.
3. 설정 화면 언어 선택에 "한국어" 추가.
4. 동시에, 아직 통합 안 된 새 CLI 도구(예: aider나 continue) 어댑터를 backend에 추가. src-tauri/src/services/ 아래 ProviderService 패턴을 따라 새 서비스 작성. 라이브 파일 경로·포맷을 분석해서 동기화 로직 구현.
5. 테스트 작성, PR 제출.
목표: 실전 오픈소스 기여 + Tauri 백엔드 깊이 이해 + 한국 사용자에게 직접 도움 되는 기능 제공.
src-tauri/src/commands/ 한 파일을 정독Send + Sync, Arc<Mutex<T>> 패턴src-tauri/src/proxy/ 모듈 분석 — tokio·hyper로 HTTP 서버 어떻게 띄우는지src/hooks/에서 query/mutation 패턴 분석rusqlite 또는 sqlx 비교src-tauri/src/database/ 분석src-tauri/src/mcp/ 동기화 로직 분석#[tauri::command]로 Rust 함수를 노출하고, 프론트에서 invoke('name', args)로 호출. 직렬화는 JSON.rename으로 교체. POSIX rename은 같은 파일 시스템 안에서 원자적이라 중간에 죽어도 깨지지 않는다.ccswitch://provider/import?data=... 같은 형태. 모바일에서 익숙하지만 데스크탑에서도 작동한다.brew install --cask cc-switch로 .dmg 다운로드·드래그·실행을 한 줄에 끝낸다.paru나 yay 같은 헬퍼로 설치. cc-switch는 cc-switch-bin 패키지로 등록돼 있다.