Commit Graph

752 Commits

  • feat(providers): add DMXAPI as official partner
    Mark DMXAPI as partner in both Claude and Codex presets with promotion
    message for their Claude Code exclusive model 66% OFF offer.
  • feat(icons): add provider icons for OpenRouter, LongCat, ModelScope, AiHubMix
    - Add SVG icons for OpenRouter, LongCat, ModelScope, and AiHubMix
    - Register icons in index.ts and metadata.ts with search keywords
    - Link icons to corresponding provider presets in claudeProviderPresets.ts
  • fix(ui): reduce header spacing and fix layout shift on view switch
    - Change right-side button container from min-h-[40px] to h-[32px]
      for more compact header layout
    - Remove conditional padding (pt-6/pt-4) from main content area
      to eliminate layout jump during view transitions
  • fix(ui): prevent header layout shift when switching views
    Add min-height to right-side button container and ml-auto to add buttons
    in MCP/Prompts views to maintain consistent header height and button
    position across all views.
  • fix(ui): improve text visibility in dark mode
    Replace hardcoded gray color classes with semantic color classes
    to fix poor text contrast in dark mode:
    
    - MCP panel: server names, descriptions, tags, app labels
    - Prompt panel: prompt names, descriptions, empty states
    - Usage footer: timestamps, refresh buttons
    - Update badge: close button icon
    - API key input: disabled state text
    - Env warning banner: source info text
    
    Changes:
    - `text-gray-400 dark:text-gray-500` → `text-muted-foreground`
      (fixes reversed dark mode logic)
    - `text-gray-500 dark:text-gray-400` → `text-muted-foreground`
    - `bg-gray-100 dark:bg-gray-800` → `bg-muted`
  • fix(import): refresh all providers immediately after SQL import
    - Remove setTimeout delay that could be cancelled on component unmount
    - Invalidate all providers cache (not just current app) since import affects all apps
    - Call onImportSuccess before sync to ensure UI refresh even if sync fails
    - Update i18n: "Data refreshed" (past tense, reflecting immediate action)
  • fix(backup): restrict SQL import to CC Switch exported backups only
    - Add validation to reject SQL files without CC Switch export header
    - Remove redundant sanitize_import_sql (sqlite_* objects already excluded at export time)
    - Fix backup filename collision by appending counter suffix
    - Update i18n hints to clarify import restriction
  • fix(skill): use directory basename for skill installation path (#358)
    Extract last segment from skill directory path to prevent nested directory
    issues during install/uninstall operations. For example, "skills/codex" now
    correctly installs to "codex" instead of creating nested "skills/codex" path.
  • fix(ui): prevent provider card hover scale from being clipped
    Move 1px of horizontal padding from outer container to inner scroll
    container, providing buffer space for the hover scale-[1.01] effect
    without being cut off by overflow-hidden.
  • fix(ui): add independent scroll containers to fix scroll wheel on Linux
    Providers page was using DndContext which may interfere with scroll wheel
    events on Linux/Ubuntu WebKitGTK. Added independent scroll containers
    with `overflow-y-auto` to all main pages, matching the pattern already
    used by the MCP panel which works correctly.
    
    Changes:
    - App.tsx: Wrap ProviderList in independent scroll container
    - SkillsPage: Use consistent h-[calc(100vh-8rem)] layout
    - SettingsPage: Add overflow-hidden and overflow-x-hidden for consistency
  • fix(config): update Codex default model and correct MiniMax URL
    - Update Codex preset model from gpt-5-codex to gpt-5.1-codex
    - Fix MiniMax English preset URL from minimaxi.io to minimax.io
  • style: apply code formatting fixes
    - Fix Prettier formatting in claudeProviderPresets.ts
    - Fix cargo fmt trailing blank line in provider/mod.rs
  • fix(config): correct MiniMax apiKeyUrl to minimaxi.com
    Update apiKeyUrl domain to match official website URL.
    Also update screenshots for all locales (en, ja, zh).
  • docs: update screenshots and add Japanese locale images
    - Update README_JA.md to reference Japanese screenshots
    - Add Japanese screenshots (main-ja.png, add-ja.png)
    - Update English and Chinese screenshots with latest UI
    - Remove outdated README_i18n.md documentation
  • fix(skills): use theme-aware glass-card class for light mode compatibility
    Replace hardcoded dark mode styles (bg-gray-900/40, border-white/10) with
    the unified glass-card class that adapts to both light and dark themes.
  • refactor(url): remove automatic trailing slash stripping from base URL inputs
    - Remove `.replace(/\/+$/, "")` from all base URL handlers in useBaseUrlState.ts
    - Remove trailing slash stripping in useCodexConfigState.ts
    - Remove trailing slash normalization in providerConfigUtils.ts setCodexBaseUrl()
    - Update i18n hints (en/ja/zh) to instruct users to avoid trailing slashes
    
    This gives users explicit control over URL format rather than silently modifying input.
  • fix(ui): persist active provider card highlight when not hovered
    The selected provider's visual highlight (background, border, glow)
    was being overridden by .glass-card base styles due to CSS specificity.
    Add dedicated .glass-card-active class to ensure active state persists.
  • style(css): consolidate global selector rules and remove duplicates
    - Merge three separate `*` selector blocks into one for better maintainability
    - Remove duplicate "Glassmorphism Utilities" comment
  • fix(tailwind): add missing shadcn/ui color mappings for opaque dialog backgrounds
    The dialog backgrounds were transparent because Tailwind 3 requires explicit
    color mappings in the config to use CSS variables. Added standard shadcn/ui
    color mappings (background, foreground, card, primary, etc.) and removed
    unnecessary overlayClassName overrides from dialog components.
  • style(mcp): align wizard modal with confirm dialog styling
    - Use zIndex="alert" and semi-transparent overlay for consistency
    - Apply border-b-0/border-t-0 bg-transparent to header/footer
    - Replace emerald accent with blue to match app theme
    - Use Input component instead of raw input elements
    - Simplify button variants (outline for cancel)
  • chore: remove dead code from MCP and provider modules
    - Remove unused `read_mcp_json` from gemini_mcp.rs
    - Remove unused `normalize_server_keys` from mcp/claude.rs
    - Remove unused `validate_mcp_entry` from mcp/validation.rs
    - Remove unused `write_codex_live`, `write_claude_live`, `app_not_found` from services/provider/mod.rs
    - Clean up unused imports
  • refactor(mcp): modularize MCP and tray menu logic
    Split mcp.rs (1135 lines) into focused modules:
    - validation.rs: server config validation
    - claude.rs: Claude MCP sync/import
    - codex.rs: Codex MCP sync (TOML handling)
    - gemini.rs: Gemini MCP sync/import
    
    Extract tray menu logic from lib.rs to tray.rs for better separation of concerns.
  • fix(auto-launch): use AutoLaunchBuilder for cross-platform compatibility
    The auto-launch crate has different API signatures on each platform:
    - Windows/Linux: AutoLaunch::new() takes 3 arguments
    - macOS: AutoLaunch::new() takes 4 arguments (includes hidden param)
    
    The previous code used #[cfg(not(target_os = "windows"))] which incorrectly
    applied macOS's 4-argument signature to Linux, causing build failures.
    
    Switch to AutoLaunchBuilder which handles platform differences internally.
  • feat(preset): add MiniMax international version and split promotions
    - Add MiniMax en preset with international API endpoint (minimaxi.io)
    - Split MiniMax partner promotion into CN and EN versions
    - Remove unnecessary icon config from Aliyun and Alibaba Lingma presets
  • docs: add v3.8.0 release documentation and Japanese README
    - Add CHANGELOG entry for v3.8.0
    - Update README.md and README_ZH.md with v3.8.0 features
    - Add Japanese README (README_JA.md)
    - Add release notes in English, Chinese, and Japanese
  • refactor(skill): remove skillsPath configuration (#310)
    Remove the skillsPath field from SkillRepo and Skill structs since
    recursive scanning now automatically discovers skills in all directories.
    Simplify the UI by removing the path input field.
  • fix(test): update component tests to match current implementation
    - Add JsonEditor mock to McpFormModal tests (component uses CodeMirror
      instead of Textarea)
    - Fix assertion for missing command error message
    - Update ImportExportSection tests for new button behavior and file
      display format
  • fix: pre-release fixes for code formatting, i18n, and test suite
    - Run cargo fmt to fix Rust code formatting (lib.rs)
    - Add missing i18n keys: migration.success, agents.title (zh/en/ja)
    - Replace hardcoded strings "Agents" and "MCP" with t() calls in App.tsx
    - Fix test mocks and assertions:
      - Add providersApi.updateTrayMenu to useSettings.test.tsx mock
      - Update SettingsPage mock path in App.test.tsx
      - Fix toast message assertion in integration/SettingsDialog.test.tsx
      - Add autoSaveSettings to SettingsDialog component test mock
      - Fix loading state test to check spinner instead of title
      - Update import button name matching for selected file state
      - Fix save button test to switch to advanced tab first
      - Remove obsolete cancel button test (button no longer exists)
    
    Test results improved from 99 passed / 17 failed to 104 passed / 11 failed
  • feat(i18n): add Japanese language support
    - Add complete Japanese translation file (ja.json)
    - Update frontend types and hooks to support "ja" language option
    - Add Japanese tray menu texts in Rust backend
    - Add Japanese option to language settings component
    - Update Zod schema to include Japanese language validation
    - Add test case for Japanese language preference
    - Update i18n documentation to reflect three-language support
  • refactor(startup): improve first-launch import logic with per-table detection
    - Replace global `is_empty_for_first_import()` with independent checks:
      - `is_mcp_table_empty()` for MCP server imports
      - `is_prompts_table_empty()` for prompt imports
      - Skills and providers already have built-in idempotency checks
    
    - Fix misleading logs in provider import:
      - Change `import_default_config` return type from `Result<()>` to `Result<bool>`
      - Return `true` when actually imported, `false` when skipped
      - Only log success message when import actually occurred
    
    - Add idempotency protection to `import_from_file_on_first_launch`
    
    This allows each data type to be independently recovered if deleted,
    rather than requiring all tables to be empty for any import to trigger.
  • feat(skill): implement recursive scanning for skill repositories (#309)
    Add recursive directory scanning to discover SKILL.md files in nested
    directories. When a SKILL.md is found, treat sibling directories as
    functional folders rather than separate skills.
  • fix(usage): correct selectedTemplate initialization logic
    Previously, selectedTemplate was initialized to null when no NEW_API
    credentials were detected, which caused the credentials config section
    to be hidden even for new configurations or GENERAL template users.
    
    Now properly detects:
    - NEW_API template (has accessToken or userId)
    - GENERAL template (has apiKey or baseUrl)
    - Default to GENERAL for new configurations (matches default code template)
  • refactor(usage): simplify usage script modal UI
    - Remove redundant "Request Configuration" section (URL, method, headers, body editors)
    - Move timeout and auto query interval fields to preset template section
    - Simplify "Enable usage query" toggle styling
    - Remove redundant hints and variables description
    - Add i18n support for Base URL label
    - Include "0 to disable" hint directly in auto interval label
  • fix(auto-launch): use platform-specific API for AutoLaunch::new
    Windows version of auto-launch crate takes 3 arguments while
    Linux/macOS takes 4 (includes hidden parameter). Use conditional
    compilation to handle the difference.
  • feat(preset): add icon configuration to provider presets
    - Add icon/iconColor fields to CodexProviderPreset and GeminiProviderPreset interfaces
    - Configure icons for Claude presets (DeepSeek, Zhipu, Qwen, Kimi, MiniMax, DouBao, etc.)
    - Configure icons for Codex presets (OpenAI, Azure, PackyCode)
    - Configure icons for Gemini presets (Google, PackyCode)
    - Fix handlePresetChange to pass icon fields when resetting form
    
    This ensures preset icons are displayed in the icon picker when selecting a provider preset.
  • fix(css): downgrade Tailwind CSS from v4 to v3.4 for better browser compatibility
    Tailwind CSS v4 requires modern CSS features (@layer, @property, color-mix)
    that are not supported in older WebView2 versions, causing styles to fail
    on some Windows 11 systems.
    
    Changes:
    - Replace @tailwindcss/vite with postcss + autoprefixer
    - Downgrade tailwindcss from 4.1.13 to 3.4.17
    - Convert CSS imports from v4 syntax to v3 @tailwind directives
    - Add darkMode: "selector" to tailwind.config.js
    - Create postcss.config.js for PostCSS pipeline
    
    This improves compatibility with older browsers and WebView2 runtimes
    while maintaining the same visual appearance.
  • fix(linux): resolve WebKitGTK DMA-BUF rendering issue and preserve user .desktop customizations
    - Set WEBKIT_DISABLE_DMABUF_RENDERER=1 at startup to fix blank screen on Debian 13.2 and Nvidia GPUs
    - Only register deep-link handler on first run to avoid overwriting user customizations
    - Use correct Tauri path API (app.path().data_dir()) instead of dirs::data_dir() to match plugin's actual .desktop file location
  • feat(migration): add error dialog for config.json loading failure
    - Show system dialog when config.json fails to load during migration
    - User can retry loading or exit the program
    - Exit before database creation ensures clean retry on next launch
    - Support Chinese/English localization based on system locale
  • fix(provider): validate current provider ID existence before use
    Add get_effective_current_provider() to validate local settings ID
    against database, with automatic cleanup and fallback to DB is_current.
    
    This fixes edge cases in multi-device cloud sync scenarios where local
    settings may contain stale provider IDs:
    
    - current(): now returns validated effective provider ID
    - update(): correctly syncs live config when local ID differs from DB
    - delete(): checks both local settings and DB to prevent deletion
    - switch(): backfill logic now targets valid provider
    - sync_current_to_live(): uses validated ID with auto-fallback
    - tray menu: displays correct checkmark on startup
    
    Also fixes test issues:
    - Add missing test setup calls (mutex, reset_test_fs, ensure_test_home)
    - Correct Gemini security settings path to ~/.gemini/settings.json
  • refactor(provider): use local settings for current provider selection
    Complete the device-level settings separation for cloud sync support.
    
    Backend changes:
    - Modify switch() to update both local settings and database is_current
    - Modify current() to read from local settings first, fallback to database
    - Rename sync_current_from_db() to sync_current_to_live()
    - Update tray menu to read current provider from local settings
    
    Frontend changes:
    - Update Settings interface: remove legacy fields (customEndpoints*, security)
    - Add currentProviderClaude/Codex/Gemini fields
    - Update settings schema accordingly
    
    Test fixes:
    - Update Gemini security tests to check ~/.gemini/settings.json
      instead of ~/.cc-switch/settings.json (security field was never
      stored in CC Switch settings)
    
    This ensures each device maintains its own current provider selection
    independently when database is synced across devices.
  • refactor(settings): move device-level settings to local file storage
    Separate device-level settings from database to support cloud sync scenarios
    where multiple devices share the same database but need independent settings.
    
    Changes:
    - Remove database storage logic (bind_db, save_to_db, load_from_db)
    - Remove legacy custom_endpoints_claude/codex fields (actual data in provider.meta)
    - Add current_provider_claude/codex/gemini fields for device-level provider selection
    - Add get_current_provider() and set_current_provider() helper functions
    - Settings now stored only in ~/.cc-switch/settings.json
    
    This ensures that when database is synced across devices, each device
    maintains its own current provider selection independently.
  • refactor(gemini): improve config handling and code consistency
    - Fix envObjToString to preserve custom environment variables
    - Add bidirectional MCP format conversion (httpUrl <-> url)
    - Merge provider config with existing settings.json instead of overwriting
    - Remove redundant is_packycode_gemini function
    - Simplify is_google_official_gemini using detect_gemini_auth_type
    - Add handleGeminiModelChange for consistent field handling
  • fix(gemini): correctly write custom provider env to .env file
    write_live_snapshot was incorrectly passing the already-extracted env
    sub-field to json_to_env, which expects the full settings_config object.
    This caused json_to_env to look for env.env (nested), returning an empty
    HashMap and writing an empty .env file.
    
    Fix by delegating to write_gemini_live which correctly handles env file
    writing and security flag configuration in one place.
  • fix(gemini): write security auth config only to Gemini settings file
    - Remove redundant security.auth.selectedType from CC Switch settings
    - Fix Generic provider type not writing security flag on switch
    - All non-Google Official providers now correctly write "gemini-api-key"
    - Delete unused ensure_packycode_security_flag function
    - Clean up SecuritySettings and SecurityAuthSettings types from AppSettings