New Features: - Provider duplication and manual sorting via drag-and-drop - Custom endpoint management for aggregator providers - Usage query with auto-refresh interval and test script API - Config editor improvements (JSON format button, real-time TOML validation) - Auto-sync on directory change for WSL environment support - Load live config when editing active provider to protect manual modifications - New provider presets: DMXAPI, Azure Codex, AnyRouter, AiHubMix, MiniMax - Partner promotion mechanism (Zhipu GLM Z.ai) Architecture Improvements: - Backend: 5-phase refactoring (error handling → command split → services → concurrency) - Frontend: 4-stage refactoring (tests → hooks → components → cleanup) - Testing: 100% hooks unit test coverage, integration tests for critical flows Documentation: - Complete README rewrite with detailed architecture overview - Separate Chinese (README_ZH.md) and English (README.md) versions - Comprehensive v3.6.0 changelog with categorized changes - New bilingual screenshots and partner banners Bug Fixes: - Fixed configuration sync issues (apiKeyUrl priority, MCP sync, import sync) - Fixed usage query interval timing and refresh button animation - Fixed UI issues (edit mode alignment, language switch state) - Fixed endpoint speed test and provider duplicate insertion position - Force exit on config error to prevent silent fallback Technical Details: - Updated to Tauri 2.8.x, TailwindCSS 4.x, TanStack Query v5.90.x - Removed legacy v1 migration logic for better startup performance - Standardized command parameters (unified to camelCase `app`) - Result pattern for graceful error handling
18 KiB
18 KiB
Changelog
All notable changes to CC Switch will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[3.6.0] - 2025-11-07
✨ New Features
- Provider Duplicate - Quick duplicate existing provider configurations for easy variant creation
- Edit Mode Toggle - Show/hide drag handles to optimize editing experience
- Custom Endpoint Management - Support multi-endpoint configuration for aggregator providers
- Usage Query Enhancements
- Auto-refresh interval: Support periodic automatic usage query
- Test Script API: Validate JavaScript scripts before execution
- Template system expansion: Custom blank template, support for access token and user ID parameters
- Configuration Editor Improvements
- Add JSON format button
- Real-time TOML syntax validation for Codex configuration
- Auto-sync on Directory Change - When switching Claude/Codex config directories (e.g., WSL environment), automatically sync current provider to new directory without manual operation
- Load Live Config When Editing Active Provider - When editing the currently active provider, prioritize displaying the actual effective configuration to protect user manual modifications
- New Provider Presets - DMXAPI, Azure Codex, AnyRouter, AiHubMix, MiniMax
- Partner Promotion Mechanism - Support ecosystem partner promotion (e.g., Zhipu GLM Z.ai)
🔧 Improvements
- Configuration Directory Switching
- Introduced unified post-change sync utility (
postChangeSync.ts) - Auto-sync current providers to new directory when changing Claude/Codex config directories
- Perfect support for WSL environment switching
- Auto-sync after config import to ensure immediate effectiveness
- Use Result pattern for graceful error handling without blocking main flow
- Distinguish "fully successful" and "partially successful" states for precise user feedback
- Introduced unified post-change sync utility (
- UI/UX Enhancements
- Provider cards: Unique icons and color identification
- Unified border design system across all components
- Drag interaction optimization: Push effect animation, improved handle icons
- Enhanced current provider visual feedback
- Dialog size standardization and layout consistency
- Form experience: Optimized model placeholders, simplified provider hints, category-specific hints
- Complete Internationalization Coverage
- Error messages internationalization
- Tray menu internationalization
- All UI components internationalization
- Usage Display Moved Inline - Usage display moved next to enable button
🐛 Bug Fixes
- Configuration Sync
- Fixed
apiKeyUrlpriority issue - Fixed MCP sync-to-other-side functionality failure
- Fixed sync issues after config import
- Prevent silent fallback and data loss on config error
- Fixed
- Usage Query
- Fixed auto-query interval timing issue
- Ensure refresh button shows loading animation on click
- UI Issues
- Fixed name collision error (
get_init_errorcommand) - Fixed language setting rollback after successful save
- Fixed language switch state reset (dependency cycle)
- Fixed edit mode button alignment
- Fixed name collision error (
- Configuration Management
- Fixed Codex API Key auto-sync
- Fixed endpoint speed test functionality
- Fixed provider duplicate insertion position (next to original provider)
- Fixed custom endpoint preservation in edit mode
- Startup Issues
- Force exit on config error (no silent fallback)
- Eliminate code duplication causing initialization errors
🏗️ Technical Improvements (For Developers)
Backend Refactoring (Rust) - Completed 5-phase refactoring:
- Phase 1: Unified error handling (
AppError+ i18n error messages) - Phase 2: Command layer split by domain (
commands/{provider,mcp,config,settings,plugin,misc}.rs) - Phase 3: Integration tests and transaction mechanism (config snapshot + failure rollback)
- Phase 4: Extracted Service layer (
services/{provider,mcp,config,speedtest}.rs) - Phase 5: Concurrency optimization (
RwLockinstead ofMutex, scoped guard to avoid deadlock)
Frontend Refactoring (React + TypeScript) - Completed 4-stage refactoring:
- Stage 1: Test infrastructure (vitest + MSW + @testing-library/react)
- Stage 2: Extracted custom hooks (
useProviderActions,useMcpActions,useSettings,useImportExport, etc.) - Stage 3: Component splitting and business logic extraction
- Stage 4: Code cleanup and formatting unification
Testing System:
- Hooks unit tests 100% coverage
- Integration tests covering key processes (App, SettingsDialog, MCP Panel)
- MSW mocking backend API to ensure test independence
Code Quality:
- Unified parameter format: All Tauri commands migrated to camelCase (Tauri 2 specification)
AppTyperenamed toAppId: Semantically clearer- Unified parsing with
FromStrtrait: Centralizedappparameter parsing - Eliminate code duplication: DRY violations cleanup
- Remove unused code:
missing_paramhelper function, deprecatedtauri-api.ts, redundantKimiModelSelectorcomponent
Internal Optimizations:
- Removed Legacy Migration Logic: v3.6 removed v1 config auto-migration and copy file scanning logic
- ✅ Impact: Improved startup performance, cleaner code
- ✅ Compatibility: v2 format configs fully compatible, no action required
- ⚠️ Note: Users upgrading from v3.1.0 or earlier should first upgrade to v3.2.x or v3.5.x for one-time migration, then upgrade to v3.6
- Command Parameter Standardization: Backend unified to use
appparameter (values:claudeorcodex)- ✅ Impact: More standardized code, friendlier error prompts
- ✅ Compatibility: Frontend fully adapted, users don't need to care about this change
📦 Dependencies
- Updated to Tauri 2.8.x
- Updated to TailwindCSS 4.x
- Updated to TanStack Query v5.90.x
- Maintained React 18.2.x and TypeScript 5.3.x
[3.5.0] - 2025-01-15
⚠ Breaking Changes
- Tauri 命令仅接受参数
app(取值:claude/codex);移除对app_type/appType的兼容。 - 前端类型命名统一为
AppId(移除AppType导出),变量命名统一为appId。
✨ New Features
- MCP (Model Context Protocol) Management - Complete MCP server configuration management system
- Add, edit, delete, and toggle MCP servers in
~/.claude.json - Support for stdio and http server types with command validation
- Built-in templates for popular MCP servers (mcp-fetch, etc.)
- Real-time enable/disable toggle for MCP servers
- Atomic file writing to prevent configuration corruption
- Add, edit, delete, and toggle MCP servers in
- Configuration Import/Export - Backup and restore your provider configurations
- Export all configurations to JSON file with one click
- Import configurations with validation and automatic backup
- Automatic backup rotation (keeps 10 most recent backups)
- Progress modal with detailed status feedback
- Endpoint Speed Testing - Test API endpoint response times
- Measure latency to different provider endpoints
- Visual indicators for connection quality
- Help users choose the fastest provider
🔧 Improvements
- Complete internationalization (i18n) coverage for all UI components
- Enhanced error handling and user feedback throughout the application
- Improved configuration file management with better validation
- Added new provider presets: Longcat, kat-coder
- Updated GLM provider configurations with latest models
- Refined UI/UX with better spacing, icons, and visual feedback
- Enhanced tray menu functionality and responsiveness
- Standardized release artifact naming - All platform releases now use consistent version-tagged filenames:
- macOS:
CC-Switch-v{version}-macOS.tar.gz/.zip - Windows:
CC-Switch-v{version}-Windows.msi/-Portable.zip - Linux:
CC-Switch-v{version}-Linux.AppImage/.deb
- macOS:
🐛 Bug Fixes
- Fixed layout shifts during provider switching
- Improved config file path handling across different platforms
- Better error messages for configuration validation failures
- Fixed various edge cases in configuration import/export
📦 Technical Details
- Enhanced
import_export.rsmodule with backup management - New
claude_mcp.rsmodule for MCP configuration handling - Improved state management and lock handling in Rust backend
- Better TypeScript type safety across the codebase
[3.4.0] - 2025-10-01
✨ Features
- Enable internationalization via i18next with a Chinese default and English fallback, plus an in-app language switcher
- Add Claude plugin sync while retiring the legacy VS Code integration controls (Codex no longer requires settings.json edits)
- Extend provider presets with optional API key URLs and updated models, including DeepSeek-V3.1-Terminus and Qwen3-Max
- Support portable mode launches and enforce a single running instance to avoid conflicts
🔧 Improvements
- Allow minimizing the window to the system tray and add macOS Dock visibility management for tray workflows
- Refresh the Settings modal with a scrollable layout, save icon, and cleaner language section
- Smooth provider toggle states with consistent button widths/icons and prevent layout shifts when switching between Claude and Codex
- Adjust the Windows MSI installer to target per-user LocalAppData and improve component tracking reliability
🐛 Fixes
- Remove the unnecessary OpenAI auth requirement from third-party provider configurations
- Fix layout shifts while switching app types with Claude plugin sync enabled
- Align Enable/In Use button states to avoid visual jank across app views
[3.3.0] - 2025-09-22
✨ Features
- Add “Apply to VS Code / Remove from VS Code” actions on provider cards, writing settings for Code/Insiders/VSCodium variants (Removed in 3.4.x)
- Enable VS Code auto-sync by default with window broadcast and tray hooks so Codex switches sync silently (Removed in 3.4.x)
- Extend the Codex provider wizard with display name, dedicated API key URL, and clearer guidance
- Introduce shared common config snippets with JSON/TOML reuse, validation, and consistent error surfaces
🔧 Improvements
- Keep the tray menu responsive when the window is hidden and standardize button styling and copy
- Disable modal backdrop blur on Linux (WebKitGTK/Wayland) to avoid freezes; restore the window when clicking the macOS Dock icon
- Support overriding config directories on WSL, refine placeholders/descriptions, and fix VS Code button wrapping on Windows
- Add a
created_attimestamp to provider records for future sorting and analytics
🐛 Fixes
- Correct regex escapes and common snippet trimming in the Codex wizard to prevent validation issues
- Harden the VS Code sync flow with more reliable TOML/JSON parsing while reducing layout jank
- Bundle
@codemirror/lintto reinstate live linting in config editors
[3.2.0] - 2025-09-13
✨ New Features
- System tray provider switching with dynamic menu for Claude/Codex
- Frontend receives
provider-switchedevents and refreshes active app - Built-in update flow via Tauri Updater plugin with dismissible UpdateBadge
🔧 Improvements
- Single source of truth for provider configs; no duplicate copy files
- One-time migration imports existing copies into
config.jsonand archives originals - Duplicate provider de-duplication by name + API key at startup
- Atomic writes for Codex
auth.json+config.tomlwith rollback on failure - Logging standardized (Rust): use
log::{info,warn,error}instead of stdout prints - Tailwind v4 integration and refined dark mode handling
🐛 Fixes
- Remove/minimize debug console logs in production builds
- Fix CSS minifier warnings for scrollbar pseudo-elements
- Prettier formatting across codebase for consistent style
📦 Dependencies
- Tauri: 2.8.x (core, updater, process, opener, log plugins)
- React: 18.2.x · TypeScript: 5.3.x · Vite: 5.x
🔄 Notes
connect-srcCSP remains permissive for compatibility; can be tightened later as needed
[3.1.1] - 2025-09-03
🐛 Bug Fixes
- Fixed the default codex config.toml to match the latest modifications
- Improved provider configuration UX with custom option
📝 Documentation
- Updated README with latest information
[3.1.0] - 2025-09-01
✨ New Features
- Added Codex application support - Now supports both Claude Code and Codex configuration management
- Manage auth.json and config.toml for Codex
- Support for backup and restore operations
- Preset providers for Codex (Official, PackyCode)
- API Key auto-write to auth.json when using presets
- New UI components
- App switcher with segmented control design
- Dual editor form for Codex configuration
- Pills-style app switcher with consistent button widths
- Enhanced configuration management
- Multi-app config v2 structure (claude/codex)
- Automatic v1→v2 migration with backup
- OPENAI_API_KEY validation for non-official presets
- TOML syntax validation for config.toml
🔧 Technical Improvements
- Unified Tauri command API with app_type parameter
- Backward compatibility for app/appType parameters
- Added get_config_status/open_config_folder/open_external commands
- Improved error handling for empty config.toml
🐛 Bug Fixes
- Fixed config path reporting and folder opening for Codex
- Corrected default import behavior when main config is missing
- Fixed non_snake_case warnings in commands.rs
[3.0.0] - 2025-08-27
🚀 Major Changes
- Complete migration from Electron to Tauri 2.0 - The application has been completely rewritten using Tauri, resulting in:
- 90% reduction in bundle size (from ~150MB to ~15MB)
- Significantly improved startup performance
- Native system integration without Chromium overhead
- Enhanced security with Rust backend
✨ New Features
- Native window controls with transparent title bar on macOS
- Improved file system operations using Rust for better performance
- Enhanced security model with explicit permission declarations
- Better platform detection using Tauri's native APIs
🔧 Technical Improvements
- Migrated from Electron IPC to Tauri command system
- Replaced Node.js file operations with Rust implementations
- Implemented proper CSP (Content Security Policy) for enhanced security
- Added TypeScript strict mode for better type safety
- Integrated Rust cargo fmt and clippy for code quality
🐛 Bug Fixes
- Fixed bundle identifier conflict on macOS (changed from .app to .desktop)
- Resolved platform detection issues
- Improved error handling in configuration management
📦 Dependencies
- Tauri: 2.8.2
- React: 18.2.0
- TypeScript: 5.3.0
- Vite: 5.0.0
🔄 Migration Notes
For users upgrading from v2.x (Electron version):
- Configuration files remain compatible - no action required
- The app will automatically migrate your existing provider configurations
- Window position and size preferences have been reset to defaults
Backup on v1→v2 Migration (cc-switch internal config)
- When the app detects an old v1 config structure at
~/.cc-switch/config.json, it now creates a timestamped backup before writing the new v2 structure. - Backup location:
~/.cc-switch/config.v1.backup.<timestamp>.json - This only concerns cc-switch's own metadata file; your actual provider files under
~/.claude/and~/.codex/are untouched.
🛠️ Development
- Added
pnpm typecheckcommand for TypeScript validation - Added
pnpm formatandpnpm format:checkfor code formatting - Rust code now uses cargo fmt for consistent formatting
[2.0.0] - Previous Electron Release
Features
- Multi-provider configuration management
- Quick provider switching
- Import/export configurations
- Preset provider templates
[1.0.0] - Initial Release
Features
- Basic provider management
- Claude Code integration
- Configuration file handling
[Unreleased]
⚠️ Breaking Changes
-
Runtime auto-migration from v1 to v2 config format has been removed
MultiAppConfig::load()no longer automatically migrates v1 configs- When a v1 config is detected, the app now returns a clear error with migration instructions
- Migration path: Install v3.2.x to perform one-time auto-migration, OR manually edit
~/.cc-switch/config.jsonto v2 format - Rationale: Separates concerns (load() should be read-only), fail-fast principle, simplifies maintenance
- Related:
app_config.rs(v1 detection improved with structural analysis),app_config_load.rs(comprehensive test coverage added)
-
Legacy v1 copy file migration logic has been removed
- Removed entire
migration.rsmodule (435 lines) that handled one-time migration from v3.1.0 to v3.2.0 - No longer scans/merges legacy copy files (
settings-*.json,auth-*.json,config-*.toml) - No longer archives copy files or performs automatic deduplication
- Migration path: Users upgrading from v3.1.0 must first upgrade to v3.2.x to automatically migrate their configurations
- Benefits: Improved startup performance (no file scanning), reduced code complexity, cleaner codebase
- Removed entire
-
Tauri commands now only accept
appparameter- Removed legacy
app_type/appTypecompatibility paths - Explicit error with available values when unknown
appis provided
- Removed legacy
🔧 Improvements
- Unified
AppTypeparsing: centralized toFromStrimplementation, command layer no longer implements separateparse_app(), reducing code duplication and drift - Localized and user-friendly error messages: returns bilingual (Chinese/English) hints for unsupported
appvalues with a list of available options - Simplified startup logic: Only ensures config structure exists, no migration overhead
🧪 Tests
- Added unit tests covering
AppType::from_str: case sensitivity, whitespace trimming, unknown value error messages - Added comprehensive config loading tests:
load_v1_config_returns_error_and_does_not_writeload_v1_with_extra_version_still_treated_as_v1load_invalid_json_returns_parse_error_and_does_not_writeload_valid_v2_config_succeeds