Commit Graph

6 Commits

  • 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(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`.
  • 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 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