Commit Graph

33 Commits

  • feat(proxy): implement local HTTP proxy server with multi-provider failover
    Add a complete HTTP proxy server implementation built on Axum framework,
    enabling local API request forwarding with automatic provider failover
    and load balancing capabilities.
    
    Backend Implementation (Rust):
    - Add proxy server module with 7 core components:
      * server.rs: Axum HTTP server lifecycle management (start/stop/status)
      * router.rs: API routing configuration for Claude/OpenAI/Gemini endpoints
      * handlers.rs: Request/response handling and transformation
      * forwarder.rs: Upstream forwarding logic with retry mechanism (652 lines)
      * error.rs: Comprehensive error handling and HTTP status mapping
      * types.rs: Shared types (ProxyConfig, ProxyStatus, ProxyServerInfo)
      * health.rs: Provider health check infrastructure
    
    Service Layer:
    - Add ProxyService (services/proxy.rs, 157 lines):
      * Manage proxy server lifecycle
      * Handle configuration updates
      * Track runtime status and metrics
    
    Database Layer:
    - Add proxy configuration DAO (dao/proxy.rs, 242 lines):
      * Persist proxy settings (listen address, port, timeout)
      * Store provider priority and availability flags
    - Update schema with proxy_config table (schema.rs):
      * Support runtime configuration persistence
    
    Tauri Commands:
    - Add 6 command endpoints (commands/proxy.rs):
      * start_proxy_server: Launch proxy server
      * stop_proxy_server: Gracefully shutdown server
      * get_proxy_status: Query runtime status
      * get_proxy_config: Retrieve current configuration
      * update_proxy_config: Modify settings without restart
      * is_proxy_running: Check server state
    
    Frontend Implementation (React + TypeScript):
    - Add ProxyPanel component (222 lines):
      * Real-time server status display
      * Start/stop controls
      * Provider availability monitoring
    - Add ProxySettingsDialog component (420 lines):
      * Configuration editor (address, port, timeout)
      * Provider priority management
      * Settings validation
    - Add React hooks:
      * useProxyConfig: Manage proxy configuration state
      * useProxyStatus: Poll and display server status
    - Add TypeScript types (types/proxy.ts):
      * Define ProxyConfig, ProxyStatus interfaces
    
    Provider Integration:
    - Extend Provider model with availability field (providers.rs):
      * Track provider health for failover logic
    - Update ProviderCard UI to display proxy status
    - Integrate proxy controls in Settings page
    
    Dependencies:
    - Add Axum 0.7 (async web framework)
    - Add Tower 0.4 (middleware and service abstractions)
    - Add Tower-HTTP (CORS layer)
    - Add Tokio sync primitives (oneshot, RwLock)
    
    Technical Details:
    - Graceful shutdown via oneshot channel
    - Shared state with Arc<RwLock<T>> for thread-safe config updates
    - CORS enabled for cross-origin frontend access
    - Request/response streaming support
    - Automatic retry with exponential backoff (forwarder)
    - API key extraction from multiple config formats (Claude/Codex/Gemini)
    
    File Statistics:
    - 41 files changed
    - 3491 insertions(+), 41 deletions(-)
    - Core modules: 1393 lines (server + forwarder + handlers)
    - Frontend UI: 642 lines (ProxyPanel + ProxySettingsDialog)
    - Database/DAO: 326 lines
    
    This implementation provides the foundation for advanced features like:
    - Multi-provider load balancing
    - Automatic failover on provider errors
    - Request logging and analytics
    - Usage tracking and cost monitoring
  • 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/UI (#273)
    * feat(components): add reusable full-screen panel components
    
    Add new full-screen panel components to support the UI refactoring:
    
    - FullScreenPanel: Reusable full-screen layout component with header,
      content area, and optional footer. Provides consistent layout for
      settings, prompts, and other full-screen views.
    
    - PromptFormPanel: Dedicated panel for creating and editing prompts
      with markdown preview support. Features real-time validation and
      integrated save/cancel actions.
    
    - AgentsPanel: Panel component for managing agent configurations.
      Provides a consistent interface for agent CRUD operations.
    
    - RepoManagerPanel: Full-featured repository manager panel for Skills.
      Supports repository listing, addition, deletion, and configuration
      management with integrated validation.
    
    These components establish the foundation for the upcoming settings
    page migration from dialog-based to full-screen layout.
    
    * refactor(settings): migrate from dialog to full-screen page layout
    
    Complete migration of settings from modal dialog to dedicated full-screen
    page, improving UX and providing more space for configuration options.
    
    Changes:
    - Remove SettingsDialog component (legacy modal-based interface)
    - Add SettingsPage component with full-screen layout using FullScreenPanel
    - Refactor App.tsx routing to support dedicated settings page
      * Add settings route handler
      * Update navigation logic from dialog-based to page-based
      * Integrate with existing app switcher and provider management
    - Update ImportExportSection to work with new page layout
      * Improve spacing and layout for better readability
      * Enhanced error handling and user feedback
      * Better integration with page-level actions
    - Enhance useSettings hook to support page-based workflow
      * Add navigation state management
      * Improve settings persistence logic
      * Better error boundary handling
    
    Benefits:
    - More intuitive navigation with dedicated settings page
    - Better use of screen space for complex configurations
    - Improved accessibility with clearer visual hierarchy
    - Consistent with modern desktop application patterns
    - Easier to extend with new settings sections
    
    This change is part of the larger UI refactoring initiative to modernize
    the application interface and improve user experience.
    
    * refactor(forms): simplify and modernize form components
    
    Comprehensive refactoring of form components to reduce complexity,
    improve maintainability, and enhance user experience.
    
    Provider Forms:
    - CodexCommonConfigModal & CodexConfigSections
      * Simplified state management with reduced boilerplate
      * Improved field validation and error handling
      * Better layout with consistent spacing
      * Enhanced model selection with visual indicators
    - GeminiCommonConfigModal & GeminiConfigSections
      * Streamlined authentication flow (OAuth vs API Key)
      * Cleaner form layout with better grouping
      * Improved validation feedback
      * Better integration with parent components
    - CommonConfigEditor
      * Reduced from 178 to 68 lines (-62% complexity)
      * Extracted reusable form patterns
      * Improved JSON editing with syntax validation
      * Better error messages and recovery options
    - EndpointSpeedTest
      * Complete rewrite for better UX
      * Real-time testing progress indicators
      * Enhanced error handling with retry logic
      * Visual feedback for test results (color-coded latency)
    
    MCP & Prompts:
    - McpFormModal
      * Simplified from 581 to ~360 lines
      * Better stdio/http server type handling
      * Improved form validation
      * Enhanced multi-app selection (Claude/Codex/Gemini)
    - PromptPanel
      * Cleaner integration with PromptFormPanel
      * Improved list/grid view switching
      * Better state management for editing workflows
      * Enhanced delete confirmation with safety checks
    
    Code Quality Improvements:
    - Reduced total lines by ~251 lines (-24% code reduction)
    - Eliminated duplicate validation logic
    - Improved TypeScript type safety
    - Better component composition and separation of concerns
    - Enhanced accessibility with proper ARIA labels
    
    These changes make forms more intuitive, responsive, and easier to
    maintain while reducing bundle size and improving runtime performance.
    
    * style(ui): modernize component layouts and visual design
    
    Update UI components with improved layouts, visual hierarchy, and
    modern design patterns for better user experience.
    
    Navigation & Brand Components:
    - AppSwitcher
      * Enhanced visual design with better spacing
      * Improved active state indicators
      * Smoother transitions and hover effects
      * Better mobile responsiveness
    - BrandIcons
      * Optimized icon rendering performance
      * Added support for more provider icons
      * Improved SVG handling and fallbacks
      * Better scaling across different screen sizes
    
    Editor Components:
    - JsonEditor
      * Enhanced syntax highlighting
      * Better error visualization
      * Improved code formatting options
      * Added line numbers and code folding support
    - UsageScriptModal
      * Complete layout overhaul (1239 lines refactored)
      * Better script editor integration
      * Improved template selection UI
      * Enhanced preview and testing panels
      * Better error feedback and validation
    
    Provider Components:
    - ProviderCard
      * Redesigned card layout with modern aesthetics
      * Better information density and readability
      * Improved action buttons placement
      * Enhanced status indicators (active/inactive)
    - ProviderList
      * Better grid/list view layouts
      * Improved drag-and-drop visual feedback
      * Enhanced sorting indicators
    - ProviderActions
      * Streamlined action menu
      * Better icon consistency
      * Improved tooltips and accessibility
    
    Usage & Footer:
    - UsageFooter
      * Redesigned footer layout
      * Better quota visualization
      * Improved refresh controls
      * Enhanced error states
    
    Design System Updates:
    - dialog.tsx (shadcn/ui component)
      * Updated to latest design tokens
      * Better overlay animations
      * Improved focus management
    - index.css
      * Added 65 lines of global utility classes
      * New animation keyframes
      * Enhanced color variables for dark mode
      * Improved typography scale
    - tailwind.config.js
      * Extended theme with new design tokens
      * Added custom animations and transitions
      * New spacing and sizing utilities
      * Enhanced color palette
    
    Visual Improvements:
    - Consistent border radius across components
    - Unified shadow system for depth perception
    - Better color contrast for accessibility (WCAG AA)
    - Smoother animations and transitions
    - Improved dark mode support
    
    These changes create a more polished, modern interface while
    maintaining consistency with the application's design language.
    
    * chore: update dialogs, i18n and improve component integration
    
    Various functional updates and improvements across provider dialogs,
    MCP panel, skills page, and internationalization.
    
    Provider Dialogs:
    - AddProviderDialog
      * Simplified form state management
      * Improved preset selection workflow
      * Better validation error messages
      * Enhanced template variable handling
    - EditProviderDialog
      * Streamlined edit flow with better state synchronization
      * Improved handling of live config backfilling
      * Better error recovery for failed updates
      * Enhanced integration with parent components
    
    MCP & Skills:
    - UnifiedMcpPanel
      * Reduced complexity from 140+ to ~95 lines
      * Improved multi-app server management
      * Better server type detection (stdio/http)
      * Enhanced server status indicators
      * Cleaner integration with MCP form modal
    - SkillsPage
      * Simplified navigation and state management
      * Better integration with RepoManagerPanel
      * Improved error handling for repository operations
      * Enhanced loading states
    - SkillCard
      * Minor layout adjustments
      * Better action button placement
    
    Environment & Configuration:
    - EnvWarningBanner
      * Improved conflict detection messages
      * Better visual hierarchy for warnings
      * Enhanced dismissal behavior
    - tauri.conf.json
      * Updated build configuration
      * Added new window management options
    
    Internationalization:
    - en.json & zh.json
      * Added 17 new translation keys for new features
      * Updated existing keys for better clarity
      * Added translations for new settings page
      * Improved consistency across UI text
    
    Code Cleanup:
    - mutations.ts
      * Removed 14 lines of unused mutation definitions
      * Cleaned up deprecated query invalidation logic
      * Better type safety for mutation parameters
    
    Overall Impact:
    - Reduced total lines by 51 (-10% in affected files)
    - Improved component integration and data flow
    - Better error handling and user feedback
    - Enhanced i18n coverage for new features
    
    These changes improve the overall polish and integration of various
    components while removing technical debt and unused code.
    
    * feat(backend): add auto-launch functionality
    
    Implement system auto-launch feature to allow CC-Switch to start
    automatically on system boot, improving user convenience.
    
    Backend Implementation:
    - auto_launch.rs: New module for auto-launch management
      * Cross-platform support using auto-launch crate
      * Enable/disable auto-launch with system integration
      * Proper error handling for permission issues
      * Platform-specific implementations (macOS/Windows/Linux)
    
    Command Layer:
    - Add get_auto_launch command to check current status
    - Add set_auto_launch command to toggle auto-start
    - Integrate commands with settings API
    
    Settings Integration:
    - Extend Settings struct with auto_launch field
    - Persist auto-launch preference in settings store
    - Automatic state synchronization on app startup
    
    Dependencies:
    - Add auto-launch ^0.5.0 to Cargo.toml
    - Update Cargo.lock with new dependency tree
    
    Technical Details:
    - Uses platform-specific auto-launch mechanisms:
      * macOS: Login Items via LaunchServices
      * Windows: Registry Run key
      * Linux: XDG autostart desktop files
    - Handles edge cases like permission denials gracefully
    - Maintains settings consistency across app restarts
    
    This feature enables users to have CC-Switch readily available
    after system boot without manual intervention, particularly useful
    for users who frequently switch between API providers.
    
    * refactor(settings): enhance settings page with auto-launch integration
    
    Complete refactoring of settings page architecture to integrate auto-launch
    feature and improve overall settings management workflow.
    
    SettingsPage Component:
    - Integrate auto-launch toggle with WindowSettings section
    - Improve layout and spacing for better visual hierarchy
    - Enhanced error handling for settings operations
    - Better loading states during settings updates
    - Improved accessibility with proper ARIA labels
    
    WindowSettings Component:
    - Add auto-launch switch with real-time status
    - Integrate with backend auto-launch commands
    - Proper error feedback for permission issues
    - Visual indicators for current auto-launch state
    - Tooltip guidance for auto-launch functionality
    
    useSettings Hook (Major Refactoring):
    - Complete rewrite reducing complexity by ~30%
    - Better separation of concerns with dedicated handlers
    - Improved state management using React Query
    - Enhanced auto-launch state synchronization
      * Fetch auto-launch status on mount
      * Real-time updates on toggle
      * Proper error recovery
    - Optimized re-renders with better memoization
    - Cleaner API for component integration
    - Better TypeScript type safety
    
    Settings API:
    - Add getAutoLaunch() method
    - Add setAutoLaunch(enabled: boolean) method
    - Type-safe Tauri command invocations
    - Proper error propagation to UI layer
    
    Architecture Improvements:
    - Reduced hook complexity from 197 to ~140 effective lines
    - Eliminated redundant state management logic
    - Better error boundaries and fallback handling
    - Improved testability with clearer separation
    
    User Experience Enhancements:
    - Instant visual feedback on auto-launch toggle
    - Clear error messages for permission issues
    - Loading indicators during async operations
    - Consistent behavior across all platforms
    
    This refactoring provides a solid foundation for future settings
    additions while maintaining code quality and user experience.
    
    * refactor(ui): optimize FullScreenPanel, Dialog and App routing
    
    Comprehensive refactoring of core UI components to improve code quality,
    maintainability, and user experience.
    
    FullScreenPanel Component:
    - Enhanced props interface with better TypeScript types
    - Improved layout flexibility with customizable padding
    - Better header/footer composition patterns
    - Enhanced scroll behavior for long content
    - Added support for custom actions in header
    - Improved responsive design for different screen sizes
    - Better integration with parent components
    - Cleaner prop drilling with context where appropriate
    
    Dialog Component (shadcn/ui):
    - Updated to latest component patterns
    - Improved animation timing and easing
    - Better focus trap management
    - Enhanced overlay styling with backdrop blur
    - Improved accessibility (ARIA labels, keyboard navigation)
    - Better close button positioning and styling
    - Enhanced mobile responsiveness
    - Cleaner composition with DialogHeader/Footer
    
    App Component Routing:
    - Refactored routing logic for better clarity
    - Improved state management for navigation
    - Better integration with settings page
    - Enhanced error boundary handling
    - Cleaner separation of layout concerns
    - Improved provider context propagation
    - Better handling of deep links
    - Optimized re-renders with React.memo where appropriate
    
    Code Quality Improvements:
    - Reduced prop drilling with better component composition
    - Improved TypeScript type safety
    - Better separation of concerns
    - Enhanced code readability with clearer naming
    - Eliminated redundant logic
    
    Performance Optimizations:
    - Reduced unnecessary re-renders
    - Better memoization of callbacks
    - Optimized component tree structure
    - Improved event handler efficiency
    
    User Experience:
    - Smoother transitions and animations
    - Better visual feedback for interactions
    - Improved loading states
    - More consistent behavior across features
    
    These changes create a more maintainable and performant foundation
    for the application's UI layer while improving the overall user
    experience with smoother interactions and better visual polish.
    
    * refactor(features): modernize Skills, Prompts and Agents components
    
    Major refactoring of feature components to improve code quality,
    user experience, and maintainability.
    
    SkillsPage Component (299 lines refactored):
    - Complete rewrite of layout and state management
    - Better integration with RepoManagerPanel
    - Improved navigation between list and detail views
    - Enhanced error handling with user-friendly messages
    - Better loading states with skeleton screens
    - Optimized re-renders with proper memoization
    - Cleaner separation between list and form views
    - Improved skill card interactions
    - Better responsive design for different screen sizes
    
    RepoManagerPanel Component (370 lines refactored):
    - Streamlined repository management workflow
    - Enhanced form validation with real-time feedback
    - Improved repository list with better visual hierarchy
    - Better handling of git operations (clone, pull, delete)
    - Enhanced error recovery for network issues
    - Cleaner state management reducing complexity
    - Improved TypeScript type safety
    - Better integration with Skills backend API
    - Enhanced loading indicators for async operations
    
    PromptPanel Component (249 lines refactored):
    - Modernized layout with FullScreenPanel integration
    - Better separation between list and edit modes
    - Improved prompt card design with better readability
    - Enhanced search and filter functionality
    - Cleaner state management for editing workflow
    - Better integration with PromptFormPanel
    - Improved delete confirmation with safety checks
    - Enhanced keyboard navigation support
    
    PromptFormPanel Component (238 lines refactored):
    - Streamlined form layout and validation
    - Better markdown editor integration
    - Real-time preview with syntax highlighting
    - Improved validation error display
    - Enhanced save/cancel workflow
    - Better handling of large prompt content
    - Cleaner form state management
    - Improved accessibility features
    
    AgentsPanel Component (33 lines modified):
    - Minor layout adjustments for consistency
    - Better integration with FullScreenPanel
    - Improved placeholder states
    - Enhanced error boundaries
    
    Type Definitions (types.ts):
    - Added 10 new type definitions
    - Better type safety for Skills/Prompts/Agents
    - Enhanced interfaces for repository management
    - Improved typing for form validations
    
    Architecture Improvements:
    - Reduced component coupling
    - Better prop interfaces with explicit types
    - Improved error boundaries
    - Enhanced code reusability
    - Better testing surface
    
    User Experience Enhancements:
    - Smoother transitions between views
    - Better visual feedback for actions
    - Improved error messages
    - Enhanced loading states
    - More intuitive navigation flows
    - Better responsive layouts
    
    Code Quality:
    - Net reduction of 29 lines while adding features
    - Improved code organization
    - Better naming conventions
    - Enhanced documentation
    - Cleaner control flow
    
    These changes significantly improve the maintainability and user
    experience of core feature components while establishing consistent
    patterns for future development.
    
    * style(ui): refine component layouts and improve visual consistency
    
    Comprehensive UI polish across multiple components to enhance visual
    design, improve user experience, and maintain consistency.
    
    UsageScriptModal Component (1302 lines refactored):
    - Complete layout overhaul for better usability
    - Improved script editor with syntax highlighting
    - Better template selection interface
    - Enhanced test/preview panels with clearer separation
    - Improved error feedback and validation messages
    - Better modal sizing and responsiveness
    - Cleaner tab navigation between sections
    - Enhanced code formatting and readability
    - Improved loading states for async operations
    - Better integration with parent components
    
    MCP Components:
    - McpFormModal (42 lines):
      * Streamlined form layout
      * Better server type selection (stdio/http)
      * Improved field grouping and labels
      * Enhanced validation feedback
    - UnifiedMcpPanel (14 lines):
      * Minor layout adjustments
      * Better list item spacing
      * Improved server status indicators
      * Enhanced action button placement
    
    Provider Components:
    - ProviderCard (11 lines):
      * Refined card layout and spacing
      * Better visual hierarchy
      * Improved badge placement
      * Enhanced hover effects
    - ProviderList (5 lines):
      * Minor grid layout adjustments
      * Better drag-and-drop visual feedback
    - GeminiConfigSections (4 lines):
      * Field label alignment
      * Improved spacing consistency
    
    Editor & Footer Components:
    - JsonEditor (13 lines):
      * Better editor height management
      * Improved error display
      * Enhanced syntax highlighting
    - UsageFooter (10 lines):
      * Refined footer layout
      * Better quota display
      * Improved refresh button placement
    
    Settings & Environment:
    - ImportExportSection (24 lines):
      * Better button layout
      * Improved action grouping
      * Enhanced visual feedback
    - EnvWarningBanner (4 lines):
      * Refined alert styling
      * Better dismiss button placement
    
    Global Styles (index.css):
    - Added 11 lines of utility classes
    - Improved transition timing
    - Better focus indicators
    - Enhanced scrollbar styling
    - Refined spacing utilities
    
    Design Improvements:
    - Consistent spacing using design tokens
    - Unified color palette application
    - Better typography hierarchy
    - Improved shadow system for depth
    - Enhanced interactive states (hover, active, focus)
    - Better border radius consistency
    - Refined animation timings
    
    Accessibility:
    - Improved focus indicators
    - Better keyboard navigation
    - Enhanced screen reader support
    - Improved color contrast ratios
    
    Code Quality:
    - Net increase of 68 lines due to UsageScriptModal improvements
    - Better component organization
    - Cleaner style application
    - Reduced style duplication
    
    These visual refinements create a more polished and professional
    interface while maintaining excellent usability and accessibility
    standards across all components.
    
    * chore(i18n): add auto-launch translation keys
    
    Add translation keys for new auto-launch feature to support
    multi-language interface.
    
    Translation Keys Added:
    - autoLaunch: Label for auto-launch toggle
    - autoLaunchDescription: Explanation of auto-launch functionality
    - autoLaunchEnabled: Status message when enabled
    
    Languages Updated:
    - Chinese (zh.json): 简体中文翻译
    - English (en.json): English translations
    
    The translations maintain consistency with existing terminology
    and provide clear, user-friendly descriptions of the auto-launch
    feature across both supported languages.
    
    * test: update test suites to match component refactoring
    
    Comprehensive test updates to align with recent component refactoring
    and new auto-launch functionality.
    
    Component Tests:
    - AddProviderDialog.test.tsx (10 lines):
      * Updated test cases for new dialog behavior
      * Enhanced mock data for preset selection
      * Improved assertions for validation
    
    - ImportExportSection.test.tsx (16 lines):
      * Updated for new settings page integration
      * Enhanced test coverage for error scenarios
      * Better mock state management
    
    - McpFormModal.test.tsx (60 lines):
      * Extensive updates for form refactoring
      * New test cases for multi-app selection
      * Enhanced validation testing
      * Better coverage of stdio/http server types
    
    - ProviderList.test.tsx (11 lines):
      * Updated for new card layout
      * Enhanced drag-and-drop testing
    
    - SettingsDialog.test.tsx (96 lines):
      * Major updates for SettingsPage migration
      * New test cases for auto-launch functionality
      * Enhanced integration test coverage
      * Better async operation testing
    
    Hook Tests:
    - useDirectorySettings.test.tsx (32 lines):
      * Updated for refactored hook logic
      * Enhanced test coverage for edge cases
    
    - useDragSort.test.tsx (36 lines):
      * Simplified test cases
      * Better mock implementation
      * Improved assertions
    
    - useImportExport tests (16 lines total):
      * Updated for new error handling
      * Enhanced test coverage
    
    - useMcpValidation.test.tsx (23 lines):
      * Updated validation test cases
      * Better coverage of error scenarios
    
    - useProviderActions.test.tsx (48 lines):
      * Extensive updates for hook refactoring
      * New test cases for provider operations
      * Enhanced mock data
    
    - useSettings.test.tsx (12 lines):
      * New test cases for auto-launch
      * Enhanced settings state testing
      * Better async operation coverage
    
    Integration Tests:
    - App.test.tsx (41 lines):
      * Updated for new routing logic
      * Enhanced navigation testing
      * Better component integration coverage
    
    - SettingsDialog.test.tsx (88 lines):
      * Complete rewrite for SettingsPage
      * New integration test scenarios
      * Enhanced user workflow testing
    
    Mock Infrastructure:
    - handlers.ts (117 lines):
      * Major updates for MSW handlers
      * New handlers for auto-launch commands
      * Enhanced error simulation
      * Better request/response mocking
    
    - state.ts (37 lines):
      * Updated mock state structure
      * New state for auto-launch
      * Enhanced state reset functionality
    
    - tauriMocks.ts (10 lines):
      * Updated mock implementations
      * Better type safety
    
    - server.ts & testQueryClient.ts:
      * Minor cleanup (2 lines removed)
    
    Test Infrastructure Improvements:
    - Better test isolation
    - Enhanced mock data consistency
    - Improved async operation testing
    - Better error scenario coverage
    - Enhanced integration test patterns
    
    Coverage Improvements:
    - Net increase of 195 lines of test code
    - Better coverage of edge cases
    - Enhanced error path testing
    - Improved integration test scenarios
    - Better mock infrastructure
    
    All tests now pass with the refactored components while maintaining
    comprehensive coverage of functionality and edge cases.
    
    * style(ui): improve window dragging and provider card styles
    
    * fix(skills): resolve third-party skills installation failure
    
    - Add skills_path field to Skill struct
    - Use skills_path to construct correct source path during installation
    - Fix installation for repos with custom skill subdirectories
    
    * feat(icon): add icon type system and intelligent inference logic
    
    Introduce a new icon system for provider customization:
    
    - Add IconMetadata and IconPreset interfaces in src/types/icon.ts
      - Define structure for icon name, display name, category, keywords
      - Support default color configuration per icon
    
    - Implement smart icon inference in src/config/iconInference.ts
      - Create iconMappings for 25+ AI providers and cloud platforms
      - Include Claude, DeepSeek, Qwen, Kimi, Google, AWS, Azure, etc.
      - inferIconForPreset(): match provider name to icon config
      - addIconsToPresets(): batch apply icons to preset arrays
      - Support fuzzy matching for flexible name recognition
    
    This foundation enables automatic icon assignment when users add
    providers, improving visual identification in the provider list.
    
    * feat(ui): add icon picker, color picker and provider icon components
    
    Implement comprehensive icon selection system for provider customization:
    
    ## New Components
    
    ### ProviderIcon (src/components/ProviderIcon.tsx)
    - Render SVG icons by name with automatic fallback
    - Display provider initials when icon not found
    - Support custom sizing via size prop
    - Use dangerouslySetInnerHTML for inline SVG rendering
    
    ### IconPicker (src/components/IconPicker.tsx)
    - Grid-based icon selection with visual preview
    - Real-time search filtering by name and keywords
    - Integration with icon metadata for display names
    - Responsive grid layout (6-10 columns based on screen)
    
    ### ColorPicker (src/components/ColorPicker.tsx)
    - 12 preset colors for quick selection
    - Native color input for custom color picking
    - Hex input field for precise color entry
    - Visual feedback for selected color state
    
    ## Icon Assets (src/icons/extracted/)
    - 38 high-quality SVG icons for AI providers and platforms
    - Includes: OpenAI, Claude, DeepSeek, Qwen, Kimi, Gemini, etc.
    - Cloud platforms: AWS, Azure, Google Cloud, Cloudflare
    - Auto-generated index.ts with getIcon/hasIcon helpers
    - Metadata system with searchable keywords per icon
    
    ## Build Scripts
    - scripts/extract-icons.js: Extract icons from simple-icons
    - scripts/generate-icon-index.js: Generate TypeScript index file
    
    * feat(provider): integrate icon system into provider UI components
    
    Add icon customization support to provider management interface:
    
    ## Type System Updates
    
    ### Provider Interface (src/types.ts)
    - Add optional `icon` field for icon name (e.g., "openai", "anthropic")
    - Add optional `iconColor` field for hex color (e.g., "#00A67E")
    
    ### Form Schema (src/lib/schemas/provider.ts)
    - Extend providerSchema with icon and iconColor optional fields
    - Maintain backward compatibility with existing providers
    
    ## UI Components
    
    ### ProviderCard (src/components/providers/ProviderCard.tsx)
    - Display ProviderIcon alongside provider name
    - Add icon container with hover animation effect
    - Adjust layout spacing for icon placement
    - Update translate offsets for action buttons
    
    ### BasicFormFields (src/components/providers/forms/BasicFormFields.tsx)
    - Add icon preview section showing current selection
    - Implement fullscreen icon picker dialog
    - Auto-apply default color from icon metadata on selection
    - Display provider name and icon status in preview
    
    ### AddProviderDialog & EditProviderDialog
    - Pass icon fields through form submission
    - Preserve icon data during provider updates
    
    This enables users to visually distinguish providers in the list
    with custom icons, improving UX for multi-provider setups.
    
    * feat(backend): add icon fields to Provider model and default mappings
    
    Extend Rust backend to support provider icon customization:
    
    ## Provider Model (src-tauri/src/provider.rs)
    - Add `icon: Option<String>` field for icon name
    - Add `icon_color: Option<String>` field for hex color
    - Use serde rename `iconColor` for frontend compatibility
    - Apply skip_serializing_if for clean JSON output
    - Update Provider::new() to initialize icon fields as None
    
    ## Provider Defaults (src-tauri/src/provider_defaults.rs) [NEW]
    - Define ProviderIcon struct with name and color fields
    - Create DEFAULT_PROVIDER_ICONS static HashMap with 23 providers:
      - AI providers: OpenAI, Anthropic, Claude, Google, Gemini,
        DeepSeek, Kimi, Moonshot, Zhipu, MiniMax, Baidu, Alibaba,
        Tencent, Meta, Microsoft, Cohere, Perplexity, Mistral, HuggingFace
      - Cloud platforms: AWS, Azure, Huawei, Cloudflare
    - Implement infer_provider_icon() with exact and fuzzy matching
    - Add unit tests for matching logic (exact, fuzzy, case-insensitive)
    
    ## Deep Link Support (src-tauri/src/deeplink.rs)
    - Initialize icon fields when creating Provider from deep link import
    
    ## Module Registration (src-tauri/src/lib.rs)
    - Register provider_defaults module
    
    ## Dependencies (Cargo.toml)
    - Add once_cell for lazy static initialization
    
    This backend support enables icon persistence and future features
    like auto-icon inference during provider creation.
    
    * chore(i18n): add translations for icon picker and provider icon
    
    Add Chinese and English translations for icon customization feature:
    
    ## Icon Picker (iconPicker)
    - search: "Search Icons" / "搜索图标"
    - searchPlaceholder: "Enter icon name..." / "输入图标名称..."
    - noResults: "No matching icons found" / "未找到匹配的图标"
    - category.aiProvider: "AI Providers" / "AI 服务商"
    - category.cloud: "Cloud Platforms" / "云平台"
    - category.tool: "Dev Tools" / "开发工具"
    - category.other: "Other" / "其他"
    
    ## Provider Icon (providerIcon)
    - label: "Icon" / "图标"
    - colorLabel: "Icon Color" / "图标颜色"
    - selectIcon: "Select Icon" / "选择图标"
    - preview: "Preview" / "预览"
    
    These translations support the new icon picker UI components
    and provider form icon selection interface.
    
    * style(ui): refine header layout and AppSwitcher color scheme
    
    Improve application header and component styling:
    
    ## App.tsx Header Layout
    - Wrap title and settings button in flex container with gap
    - Add vertical divider between title and settings icon
    - Apply responsive padding (pl-1 sm:pl-2)
    - Reformat JSX for better readability (prettier)
    - Fix string template formatting in className
    
    ## AppSwitcher Color Update
    - Change Claude tab gradient from orange/amber to teal/emerald/green
    - Update shadow color to match new teal theme
    - Change hover color from orange-500 to teal-500
    - Align visual style with emerald/teal brand colors
    
    ## Dialog Component Cleanup
    - Remove default close button (X icon) from DialogContent
    - Allow parent components to control close button placement
    - Remove unused lucide-react X import
    
    ## index.css Header Border
    - Add top border (2px solid) to glass-header
    - Apply to both light and dark mode variants
    - Improve visual separation of header area
    
    These changes enhance visual consistency and modernize the UI
    appearance with a cohesive teal color scheme.
    
    * chore(deps): add icon library and update preset configurations
    
    Add dependencies and utility scripts for icon system:
    
    ## Dependencies (package.json)
    - Add @lobehub/icons-static-svg@1.73.0
      - High-quality SVG icon library for AI providers
      - Source for extracted icons in src/icons/extracted/
    - Update pnpm-lock.yaml accordingly
    
    ## Provider Preset Updates (src/config/claudeProviderPresets.ts)
    - Add optional `icon` and `iconColor` fields to ProviderPreset interface
    - Apply to Anthropic Official preset as example:
      - icon: "anthropic"
      - iconColor: "#D4915D"
    - Future presets can include default icon configurations
    
    ## Utility Script (scripts/filter-icons.js) [NEW]
    - Helper script for filtering and managing icon assets
    - Supports icon discovery and validation workflow
    - Complements extract-icons.js and generate-icon-index.js
    
    This completes the icon system infrastructure, providing all
    necessary tools and dependencies for icon customization.
    
    * refactor(ui): simplify AppSwitcher styles and migrate to local SVG icons
    
    - Replace complex gradient animations with clean, minimal tab design
    - Migrate from @lobehub/icons CDN to local SVG assets for better reliability
    - Fix clippy warning in error.rs (use inline format args)
    - Improve code formatting in skill service and commands
    - Reduce CSS complexity in AppSwitcher component (removed blur effects and gradients)
    - Update BrandIcons to use imported local SVG files instead of dynamic image loading
    
    This improves performance, reduces external dependencies, and provides a cleaner UI experience.
    
    * style(ui): hide scrollbars across all browsers and optimize form layout
    
    - Hide scrollbars globally with cross-browser support:
      * WebKit browsers (Chrome, Safari, Edge): ::-webkit-scrollbar { display: none }
      * Firefox: scrollbar-width: none
      * IE 10+: -ms-overflow-style: none
    - Remove custom scrollbar styling (width, colors, hover states)
    - Reorganize BasicFormFields layout:
      * Move icon picker to top center as a clickable preview (80x80)
      * Change name and notes fields to horizontal grid layout (md:grid-cols-2)
      * Remove icon preview section from bottom
      * Improve visual hierarchy and space efficiency
    
    This provides a cleaner, more modern UI with hidden scrollbars while maintaining full scroll functionality.
    
    * refactor(layout): standardize max-width to 60rem and optimize padding structure
    
    - Unify container max-width across components:
      * Replace max-w-4xl with max-w-[60rem] in App.tsx provider list
      * Replace max-w-5xl with max-w-[60rem] in PromptPanel
      * Move padding from header element to inner container for consistent spacing
    - Optimize padding hierarchy:
      * Remove px-6 from header element, add to inner header container
      * Remove px-6 from main element, keep it only in provider list container
      * Consolidate PromptPanel padding: move px-6 from nested divs to outer container
      * Remove redundant pl-1 sm:pl-2 from logo/title area
    - Benefits:
      * Consistent 60rem max-width provides better readability on wide screens
      * Simplified padding structure reduces CSS complexity
      * Cleaner responsive behavior with unified spacing rules
    
    This creates a more maintainable and visually consistent layout system.
    
    * refactor(ui): unify layout system with 60rem max-width and consistent spacing
    
    - Standardize container max-width across all panels:
      * Replace max-w-4xl and max-w-5xl with unified max-w-[60rem]
      * Apply to SettingsPage, UnifiedMcpPanel, SkillsPage, and FullScreenPanel
      * Ensures consistent reading width and visual balance on wide screens
    
    - Optimize padding hierarchy and structure:
      * Move px-6 from parent elements to content containers
      * FullScreenPanel: Add max-w-[60rem] wrapper to header, content, and footer
      * Add border separators (border-t/border-b) to header and footer sections
      * Consolidate nested padding in MCP, Skills, and Prompts panels
      * Remove redundant padding layers for cleaner CSS
    
    - Simplify component styling:
      * MCP list items: Replace card-based layout with modern group-based design
      * Remove unnecessary wrapper divs and flatten DOM structure
      * Update card hover effects with smooth transitions
      * Simplify icon selection dialog (remove description text in BasicFormFields)
    
    - Benefits:
      * Consistent 60rem max-width provides optimal readability
      * Unified spacing rules reduce maintenance complexity
      * Cleaner component hierarchy improves performance
      * Better responsive behavior across different screen sizes
      * More cohesive visual design language throughout the app
    
    This creates a maintainable, scalable design system foundation.
    
    * feat(deeplink): add Claude model fields support and enhance import dialog
    
    - Add Claude-specific model field support in deeplink import:
      * Support model (ANTHROPIC_MODEL) - general default model
      * Support haikuModel (ANTHROPIC_DEFAULT_HAIKU_MODEL)
      * Support sonnetModel (ANTHROPIC_DEFAULT_SONNET_MODEL)
      * Support opusModel (ANTHROPIC_DEFAULT_OPUS_MODEL)
      * Backend: Update DeepLinkImportRequest struct to include optional model fields
      * Frontend: Add TypeScript type definitions for new model parameters
    
    - Enhance deeplink demo page (deplink.html):
      * Add 5 new Claude configuration examples showcasing different model setups
      * Add parameter documentation with required/optional tags
      * Include basic config (no models), single model, complete 4-model, partial models, and third-party provider examples
      * Improve visual design with param-list component and color-coded badges
      * Add detailed descriptions for each configuration scenario
    
    - Redesign DeepLinkImportDialog layout:
      * Switch from 3-column to compact 2-column grid layout
      * Reduce dialog width from 500px to 650px for better content display
      * Add dedicated section for Claude model configurations with blue highlight box
      * Use uppercase labels and smaller text for more information density
      * Add truncation and tooltips for long URLs
      * Improve visual hierarchy with spacing and grouping
      * Increase z-index to 9999 to ensure dialog appears on top
    
    - Minor UI refinements:
      * Update App.tsx layout adjustments
      * Optimize McpFormModal styling
      * Refine ProviderCard and BasicFormFields components
    
    This enables users to import Claude providers with precise model configurations via deeplink.
    
    * feat(deeplink): add config file support for deeplink import
    
    Support importing provider configuration from embedded or remote config files.
    - Add base64 dependency for config content encoding
    - Support config, configFormat, and configUrl parameters
    - Make homepage/endpoint/apiKey optional when config is provided
    - Add config parsing and merging logic
    
    * feat(deeplink): enhance dialog with config file preview
    
    Add config file parsing and preview in deep link import dialog.
    - Support Base64 encoded config display
    - Add config file source indicator (embedded/remote)
    - Parse and display config fields by app type (Claude/Codex/Gemini)
    - Mask sensitive values in config preview
    - Improve dialog layout and content organization
    
    * refactor(ui): unify dialog styles and improve layout consistency
    
    Standardize dialog and panel components across the application.
    - Update dialog background to use semantic color tokens
    - Adjust FullScreenPanel max-width to 56rem for better alignment
    - Add drag region and prevent body scroll in full-screen panels
    - Optimize button sizes and spacing in panel headers
    - Apply consistent styling to all dialog-based components
    
    * i18n: add deeplink config preview translations
    
    Add missing translation keys for config file preview feature.
    - Add configSource, configEmbedded, configRemote labels
    - Add configDetails and configUrl display strings
    - Support both Chinese and English versions
    
    * feat(deeplink): enhance test page with v3.8 config file examples
    
    Improve deeplink test page with comprehensive config file import examples.
    - Add version badge for v3.8 features
    - Add copy-to-clipboard functionality for all deep links
    - Add Claude config file import examples (embedded/remote)
    - Add Codex config file import examples (auth.json + config.toml)
    - Add Gemini config file import examples (.env format)
    - Add config generator tool for easy testing
    - Update UI with better styling and layout
    
    * feat(settings): add autoSaveSettings for lightweight auto-save
    
    Add optimized auto-save function for General tab settings.
    - Add autoSaveSettings method for non-destructive auto-save
    - Only trigger system APIs when values actually change
    - Avoid unnecessary auto-launch and plugin config updates
    - Update tests to cover new functionality
    
    * refactor(settings): simplify settings page layout and auto-save
    
    Reorganize settings page structure and integrate autoSaveSettings.
    - Move save button inline within Advanced tab content
    - Remove sticky footer for cleaner layout
    - Use autoSaveSettings for General tab settings
    - Simplify dialog close behavior
    - Refactor ImportExportSection layout
    
    * style(providers): optimize card layout and action button sizes
    
    Improve provider card visual density and action buttons.
    - Reduce icon button sizes for compact layout
    - Adjust drag handle and icon sizes
    - Tighten spacing between action buttons
    - Update hover translate values for better alignment
    
    * refactor(mcp): improve form modal layout with adaptive height editor
    
    Restructure MCP form modal for better space utilization.
    - Split form into upper form fields and lower JSON editor sections
    - Add full-height mode support for JsonEditor component
    - Use flex layout for editor to fill available space
    - Update PromptFormPanel to use full-height editor
    - Fix locale text formatting
    
    * style: unify list item styles with semantic colors
    
    Apply consistent styling to list items across components.
    - Replace hardcoded colors with semantic tokens in MCP and Prompt list items
    - Add glass effect container to EndpointSpeedTest panel
    - Format code for better readability
    
    * style: format template literals for better readability
    
    Improve code formatting for conditional className expressions.
    - Break long template literals across multiple lines
    - Maintain consistent formatting in MCP form and endpoint test components
    
    * feat(deeplink): add config merge command for preview
    
    Expose config merging functionality to frontend for preview.
    - Add merge_deeplink_config Tauri command
    - Make parse_and_merge_config public for reuse
    - Enable frontend to display complete config before import
    
    * feat(deeplink): merge and display config in import dialog
    
    Enhance import dialog to fetch and display complete config.
    - Call mergeDeeplinkConfig API when config is present
    - Add UTF-8 base64 decoding support for config content
    - Add scrollable content area with custom scrollbar styling
    - Show complete configuration before user confirms import
    
    * i18n: add config merge error message
    
    Add translation for config file merge error handling.
    
    * style(deeplink): format test page HTML for better readability
    
    Improve HTML formatting in deeplink test page.
    - Format multiline attributes for better readability
    - Add consistent indentation to nested elements
    - Break long lines in buttons and links
    
    * refactor(usage): improve footer layout with two-row design
    
    Reorganize usage footer for better readability and space efficiency.
    - Split into two rows: update time + refresh button (row 1), usage stats (row 2)
    - Move refresh button to top row next to update time
    - Remove card background for cleaner look
    - Add fallback text when never updated
    - Improve spacing and alignment
    - Format template literals for consistency
  • feat: add model configuration support and fix Gemini deeplink bug (#251)
    * feat(providers): add notes field for provider management
    
    - Add notes field to Provider model (backend and frontend)
    - Display notes with higher priority than URL in provider card
    - Style notes as non-clickable text to differentiate from URLs
    - Add notes input field in provider form
    - Add i18n support (zh/en) for notes field
    
    * chore: format code and clean up unused props
    
    - Run cargo fmt on Rust backend code
    - Format TypeScript imports and code style
    - Remove unused appId prop from ProviderPresetSelector
    - Clean up unused variables in tests
    - Integrate notes field handling in provider dialogs
    
    * feat(deeplink): implement ccswitch:// protocol for provider import
    
    Add deep link support to enable one-click provider configuration import via ccswitch:// URLs.
    
    Backend:
    - Implement URL parsing and validation (src-tauri/src/deeplink.rs)
    - Add Tauri commands for parse and import (src-tauri/src/commands/deeplink.rs)
    - Register ccswitch:// protocol in macOS Info.plist
    - Add comprehensive unit tests (src-tauri/tests/deeplink_import.rs)
    
    Frontend:
    - Create confirmation dialog with security review UI (src/components/DeepLinkImportDialog.tsx)
    - Add API wrapper (src/lib/api/deeplink.ts)
    - Integrate event listeners in App.tsx
    
    Configuration:
    - Update Tauri config for deep link handling
    - Add i18n support for Chinese and English
    - Include test page for deep link validation (deeplink-test.html)
    
    Files: 15 changed, 1312 insertions(+)
    
    * chore(deeplink): integrate deep link handling into app lifecycle
    
    Wire up deep link infrastructure with app initialization and event handling.
    
    Backend Integration:
    - Register deep link module and commands in mod.rs
    - Add URL handling in app setup (src-tauri/src/lib.rs:handle_deeplink_url)
    - Handle deep links from single instance callback (Windows/Linux CLI)
    - Handle deep links from macOS system events
    - Add tauri-plugin-deep-link dependency (Cargo.toml)
    
    Frontend Integration:
    - Listen for deeplink-import/deeplink-error events in App.tsx
    - Update DeepLinkImportDialog component imports
    
    Configuration:
    - Enable deep link plugin in tauri.conf.json
    - Update Cargo.lock for new dependencies
    
    Localization:
    - Add Chinese translations for deep link UI (zh.json)
    - Add English translations for deep link UI (en.json)
    
    Files: 9 changed, 359 insertions(+), 18 deletions(-)
    
    * refactor(deeplink): enhance Codex provider template generation
    
    Align deep link import with UI preset generation logic by:
    - Adding complete config.toml template matching frontend defaults
    - Generating safe provider name from sanitized input
    - Including model_provider, reasoning_effort, and wire_api settings
    - Removing minimal template that only contained base_url
    - Cleaning up deprecated test file deeplink-test.html
    
    * style: fix clippy uninlined_format_args warnings
    
    Apply clippy --fix to use inline format arguments in:
    - src/mcp.rs (8 fixes)
    - src/services/env_manager.rs (10 fixes)
    
    * style: apply code formatting and cleanup
    
    - Format TypeScript files with Prettier (App.tsx, EnvWarningBanner.tsx, formatters.ts)
    - Organize Rust imports and module order alphabetically
    - Add newline at end of JSON files (en.json, zh.json)
    - Update Cargo.lock for dependency changes
    
    * feat: add model name configuration support for Codex and fix Gemini model handling
    
    - Add visual model name input field for Codex providers
      - Add model name extraction and update utilities in providerConfigUtils
      - Implement model name state management in useCodexConfigState hook
      - Add conditional model field rendering in CodexFormFields (non-official only)
      - Integrate model name sync with TOML config in ProviderForm
    
    - Fix Gemini deeplink model injection bug
      - Correct environment variable name from GOOGLE_GEMINI_MODEL to GEMINI_MODEL
      - Add test cases for Gemini model injection (with/without model)
      - All tests passing (9/9)
    
    - Fix Gemini model field binding in edit mode
      - Add geminiModel state to useGeminiConfigState hook
      - Extract model value during initialization and reset
      - Sync model field with geminiEnv state to prevent data loss on submit
      - Fix missing model value display when editing Gemini providers
    
    Changes:
      - 6 files changed, 245 insertions(+), 13 deletions(-)
  • feat(mcp): enhance form UX with default apps and JSON formatter
    - Enable all apps (Claude, Codex, Gemini) by default when adding MCP servers
    - Improve config label with clearer wording: "Full JSON configuration or use [Config Wizard]"
    - Add JSON format button to beautify configuration with 2-space indentation
    - Update tests to reflect new default behavior
    - Clean up redundant explicit prop passing
    
    This provides a more streamlined experience by enabling all apps out of the box
    and making it easier to format JSON configurations.
  • feat(mcp): add SSE (Server-Sent Events) transport type support
    Add comprehensive support for SSE transport type to MCP server configuration,
    enabling real-time streaming connections alongside existing stdio and http types.
    
    Backend Changes:
    - Add SSE type validation in mcp.rs validate_server_spec()
    - Extend Codex TOML import/export to handle SSE servers
    - Update claude_mcp.rs legacy API for backward compatibility
    - Unify http/sse handling in json_server_to_toml_table()
    
    Frontend Changes:
    - Extend McpServerSpec type definition to include "sse"
    - Add SSE radio button to configuration wizard UI
    - Update wizard form logic to handle SSE url and headers
    - Add SSE validation in McpFormModal submission
    
    Validation & Error Handling:
    - Add SSE support in useMcpValidation hook (TOML/JSON)
    - Extend tomlUtils normalizeServerConfig for SSE parsing
    - Update Zod schemas (common.ts, mcp.ts) with SSE enum
    - Add SSE error message mapping in errorUtils
    
    Internationalization:
    - Add "typeSse" translations (zh: "sse", en: "sse")
    
    Tests:
    - Add SSE validation test cases in useMcpValidation.test.tsx
    
    SSE Configuration Format:
    {
      "type": "sse",
      "url": "https://api.example.com/sse",
      "headers": { "Authorization": "Bearer token" }
    }
  • refactor(mcp): complete form refactoring for unified MCP management
    Complete the v3.7.0 MCP refactoring by updating the form layer to match
    the unified architecture already implemented in data/service/API layers.
    
    **Breaking Changes:**
    - Remove confusing `appId` parameter from McpFormModal
    - Replace with `defaultFormat` (json/toml) and `defaultEnabledApps` (array)
    
    **Form Enhancements:**
    - Add app enablement checkboxes (Claude/Codex/Gemini) directly in the form
    - Smart defaults: new servers default to Claude enabled, editing preserves state
    - Support "draft" mode: servers can be created without enabling any apps
    
    **Architecture Improvements:**
    - Eliminate semantic confusion: format selection separate from app targeting
    - One-step workflow: configure and enable apps in single form submission
    - Consistent with unified backend: `apps: { claude, codex, gemini }`
    
    **Testing:**
    - Update test mocks to use `useUpsertMcpServer` hook
    - Add test case for creating servers with no apps enabled
    - Fix parameter references from `appId` to `defaultFormat`
    
    **i18n:**
    - Add `mcp.form.enabledApps` translation (zh/en)
    - Add `mcp.form.noAppsWarning` translation (zh/en)
    
    This completes the MCP management refactoring, ensuring all layers
    (data, service, API, UI) follow the same unified architecture pattern.
  • refactor(mcp): complete v3.7.0 cleanup - remove legacy code and warnings
    This commit finalizes the v3.7.0 unified MCP architecture migration by
    removing all deprecated code paths and eliminating compiler warnings.
    
    Frontend Changes (~950 lines removed):
    - Remove deprecated components: McpPanel, McpListItem, McpToggle
    - Remove deprecated hook: useMcpActions
    - Remove unused API methods: importFrom*, syncEnabledTo*, syncAllServers
    - Simplify McpFormModal by removing dual-mode logic (unified/legacy)
    - Remove syncOtherSide checkbox and conflict detection
    - Clean up unused imports and state variables
    - Delete associated test files
    
    Backend Changes (~400 lines cleaned):
    - Remove unused Tauri commands: import_mcp_from_*, sync_enabled_mcp_to_*
    - Delete unused Gemini MCP functions: get_mcp_status, upsert/delete_mcp_server
    - Add #[allow(deprecated)] to compatibility layer commands
    - Add #[allow(dead_code)] to legacy helper functions for future migration
    - Simplify boolean expression in mcp.rs per Clippy suggestion
    
    API Deprecation:
    - Mark legacy APIs with @deprecated JSDoc (getConfig, upsertServerInConfig, etc.)
    - Preserve backward compatibility for v3.x, planned removal in v4.0
    
    Verification:
    -  Zero TypeScript errors (pnpm typecheck)
    -  Zero Clippy warnings (cargo clippy)
    -  All code formatted (prettier + cargo fmt)
    -  Builds successfully
    
    Total cleanup: ~1,350 lines of code removed/marked
    Breaking changes: None (all legacy APIs still functional)
  • feat(frontend): implement unified MCP panel for v3.7.0
    Complete Phase 3 (P0) frontend implementation for unified MCP management:
    
    **New Files:**
    - src/hooks/useMcp.ts: React Query hooks for unified MCP operations
    - src/components/mcp/UnifiedMcpPanel.tsx: Unified MCP management panel
    - src/components/ui/checkbox.tsx: Checkbox component from shadcn/ui
    
    **Features:**
    - Unified panel with three-column layout: server info + app checkboxes + actions
    - Multi-app control: Claude/Codex/Gemini checkboxes for each server
    - Real-time stats: Show enabled server counts per app
    - Full CRUD operations: Add, edit, delete, sync all servers
    
    **Integration:**
    - Replace old app-specific McpPanel with UnifiedMcpPanel in App.tsx
    - Update McpFormModal to support unified mode with apps field
    - Add i18n support: mcp.unifiedPanel namespace (zh/en)
    
    **Type Safety:**
    - Ensure McpServer.apps field always initialized
    - Fix all test files to include apps field
    - TypeScript type check passes 
    
    **Architecture:**
    - Single source of truth: mcp.servers manages all MCP configs
    - Per-server app control: apps.claude/codex/gemini boolean flags
    - Backward compatible: McpFormModal supports both unified and legacy modes
    
    Next: P1 tasks (import dialogs, sub-components, tests)
  • feat(gemini): add Gemini provider integration (#202)
    * feat(gemini): add Gemini provider integration
    
    - Add gemini_config.rs module for .env file parsing
    - Extend AppType enum to support Gemini
    - Implement GeminiConfigEditor and GeminiFormFields components
    - Add GeminiIcon with standardized 1024x1024 viewBox
    - Add Gemini provider presets configuration
    - Update i18n translations for Gemini support
    - Extend ProviderService and McpService for Gemini
    
    * fix(gemini): resolve TypeScript errors, add i18n support, and fix MCP logic
    
    **Critical Fixes:**
    - Fix TS2741 errors in tests/msw/state.ts by adding missing Gemini type definitions
    - Fix ProviderCard.extractApiUrl to support GOOGLE_GEMINI_BASE_URL display
    - Add missing apps.gemini i18n keys (zh/en) for proper app name display
    - Fix MCP service Gemini cross-app duplication logic to prevent self-copy
    
    **Technical Details:**
    - tests/msw/state.ts: Add gemini default providers, current ID, and MCP config
    - ProviderCard.tsx: Check both ANTHROPIC_BASE_URL and GOOGLE_GEMINI_BASE_URL
    - services/mcp.rs: Skip Gemini in sync_other_side logic with unreachable!() guards
    - Run pnpm format to auto-fix code style issues
    
    **Verification:**
    -  pnpm typecheck passes
    -  pnpm format completed
    
    * feat(gemini): enhance authentication and config parsing
    
    - Add strict and lenient .env parsing modes
    - Implement PackyCode partner authentication detection
    - Support Google OAuth official authentication
    - Auto-configure security.auth.selectedType for PackyCode
    - Add comprehensive test coverage for all auth types
    - Update i18n for OAuth hints and Gemini config
    
    ---------
    
    Co-authored-by: Jason <farion1231@gmail.com>
  • refactor: migrate all Tauri commands to camelCase parameters
    This commit addresses parameter naming inconsistencies caused by Tauri v2's
    requirement for camelCase parameter names in IPC commands.
    
    Backend changes (Rust):
    - Updated all command parameters from snake_case to camelCase
    - Commands affected:
      * provider.rs: providerId (×4), timeoutSecs
      * import_export.rs: filePath (×2), defaultName
      * config.rs: defaultPath
    - Added #[allow(non_snake_case)] attributes for camelCase parameters
    - Removed unused QueryUsageParams struct
    
    Frontend changes (TypeScript):
    - Removed redundant snake_case parameters from all invoke() calls
    - Updated API files:
      * usage.ts: removed debug logs, unified to providerId
      * vscode.ts: updated 8 functions (providerId, timeoutSecs, filePath, defaultName)
      * settings.ts: updated 4 functions (defaultPath, filePath, defaultName)
    - Ensured all parameters now use camelCase exclusively
    
    Test updates:
    - Updated MSW handlers to accept both old and new parameter formats during transition
    - Added i18n mock compatibility for tests
    
    Root cause:
    The issue stemmed from Tauri v2 strictly requiring camelCase for command
    parameters, while the codebase was using snake_case. This caused parameters
    like 'provider_id' to not be recognized by the backend, resulting in
    "missing providerId parameter" errors.
    
    BREAKING CHANGE: All Tauri command invocations now require camelCase parameters.
    Any external tools or scripts calling these commands must be updated accordingly.
    
    Fixes: Usage query always failing with "missing providerId" error
    Fixes: Custom endpoint management not receiving provider ID
    Fixes: Import/export dialogs not respecting default paths
  • refactor(hooks): introduce unified post-change sync utility
    - Add postChangeSync.ts utility with Result pattern for graceful error handling
    - Replace try-catch with syncCurrentProvidersLiveSafe in useImportExport
    - Add directory-change-triggered sync in useSettings to maintain SSOT
    - Introduce partial-success status to distinguish import success from sync failures
    - Add test coverage for sync behavior in different scenarios
    
    This refactoring ensures config.json changes are reliably synced to live
    files while providing better user feedback for edge cases.
  • refactor(types): rename AppType to AppId for semantic clarity
    Rename `AppType` to `AppId` across the entire frontend codebase to better
    reflect its purpose as an application identifier rather than a type category.
    This aligns frontend naming with backend command parameter conventions.
    
    Changes:
    - Rename type `AppType` to `AppId` in src/lib/api/types.ts
    - Remove `AppType` export from src/lib/api/index.ts
    - Update all component props from `appType` to `appId` (43 files)
    - Update all variable names from `appType` to `appId`
    - Synchronize documentation (CHANGELOG, refactoring plans)
    - Update test files and MSW mocks
    
    BREAKING CHANGE: `AppType` type is no longer exported. Use `AppId` instead.
    All component props have been renamed from `appType` to `appId`.
  • refactor(api): simplify app type parameter handling to single required parameter
    Replace the previous dual-parameter approach (app_type/app/appType) with a single required `app: String` parameter across all Tauri commands. This change:
    
    - Introduces unified `parse_app()` helper replacing complex `resolve_app_type()` logic
    - Updates all backend commands in config, mcp, and provider modules
    - Aligns frontend API calls to use consistent `app` parameter naming
    - Simplifies MSW test handlers by removing optional parameter handling
    
    This improves API clarity and reduces parameter ambiguity while maintaining backward compatibility through error handling.
  • test: add dual-parameter support and sync mocks for import/export tests
    Update test infrastructure to support the dual app type parameter pattern
    (app_type enum + app string) introduced in 590be4e:
    
    - Add toast.warning mock for partial-success status handling
    - Add syncCurrentProvidersLive mock to test post-import sync behavior
    - Update MSW handlers to accept both app_type and app parameters with
      fallback resolution (app ?? app_type) across 7 provider endpoints
    - Add sync_current_providers_live endpoint mock returning success
    
    This ensures test compatibility during the app_type → app parameter
    migration and enables testing of the new partial-success import flow.
  • fix(providers): preserve custom endpoints in meta during add/edit operations
    Fixed two critical data loss bugs where user-added custom endpoints were discarded:
    
    1. **AddProviderDialog**: Form submission ignored values.meta from ProviderForm and
       re-inferred URLs only from presets/config, causing loss of endpoints added via
       speed test modal. Now prioritizes form-collected meta and uses fallback inference
       only when custom_endpoints is missing.
    
    2. **ProviderForm**: Edit mode always returned initialData.meta, discarding any
       changes made in the speed test modal. Now uses mergeProviderMeta to properly
       merge customEndpointsMap with existing meta fields.
    
    Changes:
    - Extract mergeProviderMeta utility to handle meta field merging logic
    - Preserve other meta fields (e.g., usage_script) during endpoint updates
    - Unify new/edit code paths to use consistent meta handling
    - Add comprehensive unit tests for meta merging scenarios
    - Add integration tests for AddProviderDialog submission flow
    
    Impact:
    - Third-party and custom providers can now reliably manage multiple endpoints
    - Edit operations correctly reflect user modifications
    - No data loss for existing meta fields like usage_script
  • fix: resolve TypeScript type errors in test files
    - Add vitest/globals to tsconfig.json types array to provide type
      definitions for global test functions (describe, it, expect, vi)
    - Fix vi.fn type parameter in useDirectorySettings.test.tsx from
      <[], Promise<string>> to <() => Promise<string>>
    - Remove unused setMcpConfig import from MSW handlers
    - Add type assertions for mock.calls access in McpFormModal tests
      to resolve union type inference issues
    
    This ensures pnpm typecheck passes without errors while maintaining
    test functionality with vitest globals: true configuration.
  • test: extend MCP UI test coverage with wizard, TOML, and error handling
    ## McpFormModal Component Tests (+5 tests)
    
    ### Infrastructure Improvements
    - Enhance McpWizardModal mock from null to functional mock with testable onApply callback
    - Refactor renderForm helper to support custom onSave/onClose mock injection
    - Add McpServer type import for type-safe test data
    
    ### New Test Cases
    1. **Wizard Integration**: Verify wizard generates config and auto-fills ID + JSON fields
       - Click "Use Wizard" → Apply → Form fields populated with wizard-id and config
       - Uses act() wrapper for React 18 async state updates
    
    2. **TOML Auto-extraction (Codex)**: Test TOML → JSON conversion with ID extraction
       - Parse `[mcp.servers.demo]` → auto-fill ID as "demo"
       - Verify server object correctly parsed from TOML format
       - Codex-specific feature for config.toml compatibility
    
    3. **TOML Validation Error**: Test missing required field handling
       - TOML with type="stdio" but no command → block submit
       - Display localized error toast: mcp.error.idRequired (3s duration)
    
    4. **Edit Mode Immutability**: Verify ID field disabled during edit
       - ID input has disabled attribute and keeps original value
       - Config updates applied while enabled state preserved
       - syncOtherSide defaults to false in edit mode
    
    5. **Error Recovery**: Test save failure button state restoration
       - Inject failing onSave mock → trigger error
       - Verify toast error displays translated message
       - Submit button disabled state resets to false for retry
    
    ## useMcpActions Hook Tests (+2 tests)
    
    ### New API Mocks
    - Add syncEnabledToClaude and syncEnabledToCodex mock functions
    
    ### New Test Cases
    1. **Backend Error Message Mapping**: Map Chinese error to i18n key
       - Backend: "stdio 类型的 MCP 服务器必须包含 command 字段"
       - Frontend: mcp.error.commandRequired (6s toast duration)
    
    2. **Cross-app Sync Logic**: Verify conditional sync behavior
       - claude → claude: setEnabled called, syncEnabledToClaude NOT called
       - Validates sync only occurs when crossing app types
    
    ## Minor Changes
    - McpPanel.test.tsx: Add trailing newline (formatter compliance)
    
    ## Test Coverage
    - Test files: 17 (unchanged)
    - Total tests: 112 → 119 (+7, +6.3%)
    - Execution time: 3.20s
    - All 119 tests passing 
  • test: add comprehensive MCP UI test coverage with MSW infrastructure
    ## MSW Infrastructure Enhancement
    - Add 5 MCP API handlers to tests/msw/handlers.ts:
      - get_mcp_config: Fetch MCP configuration for app type
      - import_mcp_from_claude/codex: Mock import operations (returns count: 1)
      - set_mcp_enabled: Toggle MCP server enabled state
      - upsert_mcp_server_in_config: Create/update MCP server
      - delete_mcp_server_in_config: Remove MCP server
    - Add MCP state management to tests/msw/state.ts:
      - McpConfigState type with per-app server storage
      - Default test data (stdio server for Claude, http server for Codex)
      - CRUD functions: getMcpConfig, setMcpServerEnabled, upsertMcpServer, deleteMcpServer
      - Immutable state operations with deep cloning
    
    ## McpFormModal Component Tests (4 tests)
    - Test preset application: Verify ID and config JSON auto-fill from preset selection
    - Test conflict detection: Async validation shows warning when syncing to conflicting ID
    - Test field sanitization: Verify trim whitespace, split tags, clean URLs before save
    - Test validation errors: Block submit and show toast error for invalid stdio config (missing command)
    
    ## McpPanel Integration Tests (3 tests)
    - Test toggle enabled state: Click toggle button triggers useMcpActions.toggleEnabled with correct params
    - Test create server flow: Open form → submit → saveServer called with syncOtherSide option
    - Test delete server flow: Click delete → confirm dialog → deleteServer called with ID
    
    ## Test Utilities
    - Add createTestQueryClient helper with retry: false for faster test execution
    
    ## Test Coverage
    - Test files: 15 → 17 (+2)
    - Total tests: 105 → 112 (+6.7%)
    - All 112 tests passing
    - Execution time: 3.15s
  • test: add MCP functionality tests achieving 100% hooks coverage
    Milestone Achievement: 100% Hooks Coverage 🎉
    - Hooks coverage: 87.5% (7/8) → 100% (8/8)
    - Total tests: 81 → 105 (+29.6%)
    - MCP functionality: 0 → 24 tests
    
    useMcpActions Tests (8 tests):
    - Test server reload with loading state management
      - Use deferred promise pattern to verify loading state transitions
      - Verify intermediate loading=true state during async operation
      - Verify error toast (duration: 6s) on reload failure
      - Ensure loading returns to false after error
    - Test optimistic toggle with rollback on failure
      - Immediately update enabled flag before API confirmation
      - Verify success toast messages for enable/disable
      - Roll back state to original value on API failure
      - Show error toast (duration: 6s) when toggle fails
    - Test server save with list refresh
      - Verify ID rewrite logic: saveServer(newId, {...input, id: oldId}) → {id: newId}
      - Verify syncOtherSide option correctly propagated to API
      - Refresh server list after successful save
      - Propagate errors to caller while showing error toast
      - Do not refresh list when save fails
    - Test server delete with state management
      - Verify deleteServerInConfig called with correct parameters
      - Verify list refresh removes deleted server
      - Show success toast (duration: 1.5s) on delete
      - Keep state unchanged on delete failure
      - Propagate error to caller with error toast
    
    useMcpValidation Tests (16 tests):
    - Test JSON validation (4 tests)
      - Return empty string for blank/whitespace text
      - Return "mcp.error.jsonInvalid" for parsing failures
      - Reject non-object types (string, array)
      - Accept valid object payloads
    - Test TOML error formatting (2 tests)
      - Map mustBeObject/parseError to "mcp.error.tomlInvalid"
      - Append error details for unknown errors
    - Test TOML config validation (5 tests)
      - Propagate errors from validateToml utility
      - Return "mcp.error.commandRequired" for stdio without command
      - Return "mcp.wizard.urlRequired" for http without url
      - Catch and format tomlToMcpServer exceptions
      - Return empty string when validation passes
    - Test JSON config validation (5 tests)
      - Reject invalid JSON syntax
      - Reject mcpServers array format (single object required)
      - Require command field for stdio type servers
      - Require url field for http type servers
      - Accept valid server configurations
    
    Technical Highlights:
    - Deferred Promise Pattern: Precise async timing control
    - Optimistic Updates: Test immediate feedback + rollback
    - Error Propagation: Distinguish caller errors vs toast notifications
    - i18n Validation: All validators return translation keys
    - Factory Functions: Reusable test data builders
    
    All tests passing: 105/105
  • test: enhance useImportExport edge tests with mock refactor and callback verification
    Mock Refactoring:
    - Extract saveFileDialogMock and exportConfigMock as variables
      - Previously used inline vi.fn() which prevented call verification
      - Now supports expect().toHaveBeenCalledWith() assertions
      - Enables parameter and return value validation
    - Add mock reset in beforeEach for test isolation
      - Reset saveFileDialogMock state
      - Reset exportConfigMock state
      - Ensures clean state for each test
    
    New Test: Import Failure Callback Verification
    - Add test "does not call onImportSuccess when import fails"
      - User selects file successfully
      - Import operation fails (success: false)
      - Verify onImportSuccess callback NOT called
      - Verify status becomes "error"
      - Prevents triggering success logic on failure
    
    New Test: Export Success Message Verification
    - Add test "propagates export success message to toast with saved path"
      - User selects save location: /exports/config.json
      - Backend saves to: /final/config.json (may differ)
      - Verify exportConfigMock called with user-selected path
      - Verify toast success message contains actual saved path
      - Ensures user sees correct save location
    
    Coverage Improvements:
    - Import failure callback: 50% → 100%
    - Export success message: 50% → 100%
    - Mock verification capability: 0% → 100%
    
    All tests passing: 81/81 (2 new tests)
  • test: add error handling and edge case tests for hooks
    useSettings Tests:
    - Add test for null settings state protection
      - Returns null immediately without calling APIs
      - Prevents null pointer errors in save flow
    - Add test for save mutation failure
      - Verifies error propagates to caller
      - Ensures restart flag remains untouched on failure
      - Validates no side effects when save fails
    
    useProviderActions Tests:
    - Add error propagation tests for CRUD operations
      - updateProvider: propagates errors to caller
      - addProvider: propagates errors to caller
      - deleteProvider: propagates errors to caller
    - Add switch mutation error handling tests
      - Claude switch: handles errors silently (no throw)
      - Codex switch: skips plugin sync when mutation fails
      - Verifies plugin sync APIs not called on failure
    - Add loading state verification
      - Test all mutations pending scenario (existing)
      - Test all mutations idle scenario (new)
      - Ensures isLoading flag accuracy
    
    useImportExport Edge Case Tests (new file):
    - Add test for user cancelling file dialog
      - File dialog returns null (user cancelled)
      - State remains unchanged (selectedFile: "", status: "idle")
      - No error toast shown
    - Add test for resetStatus behavior
      - Clears error message and status
      - Preserves selected file path for retry
      - Resets backupId to null
    
    All tests passing: 79/79 (10 new tests)
  • test: add useDirectorySettings and useSettingsMetadata hook tests
    useDirectorySettings Tests:
    - Test directory initialization with overrides and remote defaults
      - Verify app config override with space trimming
      - Load Claude/Codex directories from remote API
      - Calculate resolvedDirs correctly
    - Test directory browsing functionality
      - Browse Claude/Codex config directories
      - Browse app config directory with proper default paths
      - Update settings callback when selection succeeds
    - Test error handling scenarios
      - User cancels directory selection (returns null)
      - Directory picker throws error (shows toast)
      - Verify settings not updated on failure
    - Test directory reset operations
      - Reset individual directories to computed defaults
      - Reset app config directory
      - Batch reset with provided server values
    - Use vi.hoisted() for proper mock initialization
    - Factory function for settings creation (reusability)
    
    useSettingsMetadata Tests:
    - Test portable mode flag loading
      - Verify initial loading state
      - Load portable flag from API
      - Handle async state transitions
    - Test error tolerance when API fails
      - Silent failure on network errors
      - Default to non-portable mode
      - Continue without blocking UI
    - Test restart flag management
      - Set restart required flag
      - Acknowledge restart to clear flag
      - State updates wrapped in act()
    
    All tests passing: 10/10 (7 useDirectorySettings + 3 useSettingsMetadata)
  • test: add directory browsing/reset and useSettings hook tests
    SettingsDialog Integration Tests:
    - Add test for directory browsing and reset functionality
      - Verify app config directory browse/reset flow
      - Verify Claude config directory manual change, browse, and reset
      - Test multiple directory inputs with getAllByTitle pattern
    - Add test for export failure error handling
      - User cancels file selection (save_file_dialog returns null)
      - Export operation fails (disk full scenario)
      - Use server.use() to dynamically override MSW handlers
      - Verify toast error messages match i18n keys
    
    MSW Handler Extension:
    - Add pick_directory handler to support directory selection API
    - Consistent with select_config_directory mock strategy
    
    useSettings Hook Unit Tests:
    - Add comprehensive tests for settings save logic
      - Test restart flag when app config directory changes
      - Test no restart when directory unchanged
      - Verify space trimming and empty string to undefined conversion
      - Test Claude plugin sync failure tolerance
    - Add test for settings reset functionality
      - Verify form/language/directories reset with server data
    - Use factory functions for mock creation (reusability)
    - Complete dependency isolation with mock hooks
    
    All tests passing: 9/9 (5 integration + 4 unit tests)
  • test: add SettingsDialog integration tests and enhance MSW infrastructure
    - Add comprehensive SettingsDialog integration tests with 3 test cases:
      * Load default settings from MSW
      * Import configuration and trigger success callback
      * Save settings and handle restart prompt
    - Extend MSW handlers with settings-related endpoints:
      * get_settings/save_settings for settings management
      * app_config_dir_override for custom config directory
      * apply_claude_plugin_config for plugin integration
      * import/export config file operations
      * file/directory dialog mocks
    - Add settings state management to MSW mock state:
      * Settings state with default values
      * appConfigDirOverride state
      * Reset logic in resetProviderState()
    - Mock @tauri-apps/api/path for DirectorySettings tests
    - Refactor App.test.tsx to focus on happy path scenarios:
      * Remove delete functionality test (covered in useProviderActions unit tests)
      * Reorganize test flow: settings → switch → usage → create → edit → switch → duplicate
      * Remove unnecessary state verifications
      * Simplify event testing
    
    All tests passing: 4 integration tests + 12 unit tests
  • test: migrate to MSW testing architecture for App integration test
    Major testing infrastructure upgrade from manual mocks to Mock Service Worker (MSW):
    
    New MSW infrastructure (tests/msw/):
    - Add state.ts: In-memory state manager with full CRUD operations
      - Manage providers and current selections per app type (Claude/Codex)
      - Auto-switch current provider when deleted
      - Deep clone to prevent reference pollution
    - Add handlers.ts: HTTP request handlers for 10 Tauri API endpoints
      - Mock get_providers, switch_provider, add/update/delete_provider
      - Mock update_sort_order, update_tray_menu, import_default_config
      - Support error scenarios (404 for non-existent providers)
    - Add tauriMocks.ts: Tauri API mock layer
      - Transparently convert invoke() calls to HTTP requests
      - Mock event listener system with emitTauriEvent helper
      - Use cross-fetch for Node.js environment
    - Add server.ts: MSW server setup for Node.js test environment
    
    Refactor App.test.tsx (-170 lines, -43%):
    - Remove 23 manual mocks (useProvidersQuery, useProviderActions, etc.)
    - Run real hooks with MSW-backed API calls instead of mock implementations
    - Test real state changes instead of mock call counts
    - Add comprehensive flow: duplicate → create → edit → delete → event listening
    - Verify actual provider list changes and current selection updates
    
    Setup integration:
    - Add MSW server lifecycle to tests/setupTests.ts
      - Start server before all tests
      - Reset handlers and state after each test
      - Close server after all tests complete
    - Clear all mocks in afterEach for test isolation
    
    Dependencies:
    - Add msw@^2.11.6 for API mocking
    - Add cross-fetch@^4.1.0 for fetch polyfill in Node.js
    
    Type fixes:
    - Add missing imports (AppType, Provider) in handlers.ts
    - Fix HttpResponse.json generic constraint with as any (MSW best practice)
    - Change invalid category "default" to "official" in state.ts
    
    Test results: All 50 tests passing across 8 files, 0 TypeScript errors
  • test: enhance SettingsDialog tests and add App integration test
    Enhanced SettingsDialog component test coverage:
    - Add test for import/export status reset on dialog open
    - Add test for onImportSuccess callback propagation to hook
    - Add test for postponing restart flow (restart later button)
    - Add test for directory management callbacks (browse/reset/change)
    - Expand existing test to cover export, import, and clear actions
    - Fix type safety issues (avoid 'as any', use type guards)
    
    New App.test.tsx integration test:
    - Add comprehensive end-to-end test for main App component
    - Test settings dialog with import success callback and tray menu update
    - Test app switcher between Claude and Codex
    - Test provider CRUD operations (add, edit, delete, duplicate)
    - Test usage script modal workflow
    - Test external website link opening
    - Use vi.hoisted() pattern for centralized mock management
    
    Technical improvements:
    - Remove two environment-dependent tests (DEV flag) that required 'as any'
    - Use proper type guards for optional callback invocation
    - Clean up unused mock variables (switchProviderMock, onImportSuccessMock, refetchPromise)
    - Simplify useProviderActions mock to avoid spread argument type error
    
    Test results: 50 tests passing across 8 test files
  • test: add comprehensive tests for settings dialog components
    Add component tests for ImportExportSection and SettingsDialog with full coverage of UI interactions, state management, and async workflows.
    
    ImportExportSection.test.tsx (5 tests):
    - Verify button states based on file selection
    - Test import/export/clear interactions
    - Validate loading, success, and error UI states
    
    SettingsDialog.test.tsx (5 tests):
    - Test loading state rendering
    - Verify tab navigation and child component callbacks
    - Validate save/cancel workflows with cleanup
    - Test restart prompt and immediate restart flow
    - Use Context Provider pattern to mock Tabs component
    - Mock 7 child components for isolation
    
    Test patterns demonstrated:
    - Complex component isolation with deep mocking
    - Context Provider mocking for UI library components
    - Async workflow validation with waitFor
    - Multi-hook mocking (useSettings + useImportExport)
    
    All 45 tests passing (7 files, 1.13s execution time)
  • test: add comprehensive tests for hooks and components
    Add extensive unit and component tests covering import/export, settings,
    and provider list functionality, advancing to Sprint 2 of test development.
    
    Hook Tests:
    - useImportExport (11 tests):
      * File selection success/failure flows
      * Import process with success/failure/exception paths
      * Export functionality with error handling
      * User cancellation scenarios
      * State management (clear selection, reset status)
      * Fake timers for async callback testing
    
    - useSettingsForm (5 tests):
      * Settings normalization on initialization
      * Language persistence from localStorage
      * Field updates with language sync
      * Reset functionality with initial language restoration
      * Optimization to avoid redundant language changes
    
    Component Tests:
    - ProviderList (3 tests):
      * Loading state with skeleton placeholders
      * Empty state with create callback
      * Render order from useDragSort with action callbacks
      * Props pass-through (isCurrent, isEditMode, dragHandleProps)
      * Mock ProviderCard to isolate component under test
    
    Technical Highlights:
    - Fake timers (vi.useFakeTimers) for async control
    - i18n mock with changeLanguage spy
    - Partial mock of @dnd-kit/sortable using vi.importActual
    - ProviderCard render spy for props verification
    - Comprehensive error handling coverage
    
    Test Coverage:
      ✓ 19 new test cases (11 + 5 + 3)
      ✓ Total: 35 tests passing
      ✓ Execution time: 865ms
      ✓ TypeScript: 0 errors
    
    Related: Import/export, settings management, provider list rendering
    Sprint Progress: Sprint 1 complete, Sprint 2 in progress (component tests)
  • test: add useProviderActions hook unit tests
    - Add comprehensive tests for provider CRUD operations:
      * addProvider: trigger mutation correctly
      * updateProvider: update provider and refresh tray menu
      * deleteProvider: call delete mutation
      * isLoading: track all mutation pending states
    - Test Claude plugin integration sync logic:
      * Conditional sync based on app type (claude vs codex)
      * Integration toggle handling (enabled/disabled)
      * Error handling with custom/fallback messages
      * Official vs custom provider category detection
    - Test usage script save functionality:
      * Update provider meta and invalidate cache on success
      * Display error toast with custom/fallback messages on failure
    - Mock React Query mutations, Tauri API, and toast notifications
    - Fix TypeScript spread operator issues in mock definitions
    - Cover all success/failure paths and edge cases
    
    Test Coverage:
      ✓ 12 test cases covering provider actions
      ✓ Plugin sync: 5 scenarios (app type, toggle, errors)
      ✓ CRUD operations: add, update, delete
      ✓ Usage script: save success/failure
      ✓ Estimated 95%+ code coverage
    
    Related: Provider management, Claude plugin integration, usage scripts
    Total Tests: 16 passed (4 useDragSort + 12 useProviderActions)
  • test: add frontend testing infrastructure with vitest
    - Introduce Vitest + React Testing Library + jsdom environment
    - Add useDragSort hook unit tests covering:
      * Sorting logic (sortIndex → createdAt → name)
      * Successful drag operation (API call + cache invalidation)
      * Failed drag operation (error toast display)
      * Edge case (no valid target, no API call)
    - Configure global test setup (i18n mock, auto cleanup)
    - Update TypeScript configs to include tests/ directory
    - Add test development plan documentation
    
    Test Coverage:
      ✓ Provider drag-and-drop sorting core logic
      ✓ React Query cache refresh
      ✓ Toast notification display
      ✓ Boundary condition handling
    
    Test Results: 4/4 passed (671ms)
    Next Steps: Sprint 2 - component tests with MSW mock layer