# Design Document ## Overview This design document outlines the replacement of the Blessed-based TUI with a Windows-compatible alternative using **Ink** (React for CLI) as the primary library choice. Ink provides excellent cross-platform support, modern React-based component architecture, and superior Windows compatibility compared to Blessed. The design maintains all existing functionality while improving performance, maintainability, and user experience across all platforms. ## Architecture ### Library Selection: Ink (React for CLI) **Primary Choice: Ink v4.x** - **Rationale**: Ink is built on React principles, providing a modern component-based architecture - **Windows Compatibility**: Excellent support for Windows Terminal, Command Prompt, and PowerShell - **Performance**: Uses React's reconciliation for efficient updates, reducing flicker - **Ecosystem**: Large ecosystem of pre-built components and utilities - **Maintenance**: Actively maintained by Vercel with strong community support **Alternative Considerations**: - **Blessed**: Current library with Windows issues (being replaced) - **Terminal-kit**: Good Windows support but more complex API - **Enquirer**: Limited to prompts, not full TUI applications - **Neo-blessed**: Fork of Blessed with some improvements but still has Windows issues ### Component Architecture ``` TuiApplication (Root) ├── AppProvider (Context/State Management) ├── Router (Screen Management) ├── StatusBar (Global Status) └── Screens/ ├── MainMenuScreen ├── ConfigurationScreen ├── OperationScreen ├── SchedulingScreen ├── LogViewerScreen └── TagAnalysisScreen ``` ### State Management Using React Context API with custom hooks for: - Application state (current screen, navigation history) - Configuration state (environment variables, settings) - Operation state (progress, results, errors) - UI state (focus, selections, modal states) ## Components and Interfaces ### Core Components #### 1. TuiApplication (Root Component) ```javascript const TuiApplication = () => { return ( ); }; ``` #### 2. AppProvider (State Management) ```javascript const AppProvider = ({ children }) => { const [appState, setAppState] = useState({ currentScreen: "main-menu", navigationHistory: [], configuration: {}, operationState: null, }); return ( {children} ); }; ``` #### 3. Router (Screen Management) ```javascript const Router = () => { const { appState } = useContext(AppContext); const screens = { "main-menu": MainMenuScreen, configuration: ConfigurationScreen, operation: OperationScreen, scheduling: SchedulingScreen, logs: LogViewerScreen, "tag-analysis": TagAnalysisScreen, }; const CurrentScreen = screens[appState.currentScreen]; return ; }; ``` #### 4. StatusBar (Global Status Display) ```javascript const StatusBar = () => { const { connectionStatus, operationProgress } = useAppState(); return ( ● Connected | Progress: {operationProgress}% ); }; ``` ### Screen Components #### MainMenuScreen - Navigation menu with keyboard shortcuts - Current configuration summary - Quick action buttons - Help information #### ConfigurationScreen - Environment variable editor - Input validation with real-time feedback - API connection testing - Save/cancel operations #### OperationScreen - Operation type selection (update/rollback) - Real-time progress display - Product processing information - Error handling and display #### SchedulingScreen - Date/time picker interface - Schedule management - Countdown display - Cancellation controls #### LogViewerScreen - Paginated log display - Search and filtering - Log entry details - Export functionality #### TagAnalysisScreen - Tag listing and statistics - Product count per tag - Sample product display - Recommendations ### Reusable UI Components #### ProgressBar ```javascript const ProgressBar = ({ progress, label, color = "blue" }) => { const width = 40; const filled = Math.round((progress / 100) * width); return ( {label} {"█".repeat(filled)} {"░".repeat(width - filled)} {progress}% ); }; ``` #### InputField ```javascript const InputField = ({ label, value, onChange, validation, placeholder }) => { const [isValid, setIsValid] = useState(true); return ( {label}: { onChange(val); setIsValid(validation ? validation(val) : true); }} placeholder={placeholder} /> {!isValid && Invalid input} ); }; ``` #### MenuList ```javascript const MenuList = ({ items, selectedIndex, onSelect }) => { return ( {items.map((item, index) => ( {index === selectedIndex ? "► " : " "} {item.label} ))} ); }; ``` ## Data Models ### Application State ```javascript interface AppState { currentScreen: string; navigationHistory: string[]; configuration: ConfigurationState; operationState: OperationState | null; uiState: UIState; } interface ConfigurationState { shopifyDomain: string; accessToken: string; targetTag: string; priceAdjustment: number; operationMode: "update" | "rollback"; isValid: boolean; lastTested: Date | null; } interface OperationState { type: "update" | "rollback" | "scheduled"; status: "idle" | "running" | "completed" | "error"; progress: number; currentProduct: string | null; results: OperationResults | null; errors: Error[]; } interface UIState { focusedComponent: string; modalOpen: boolean; selectedMenuIndex: number; scrollPosition: number; } ``` ### Service Integration ```javascript interface ServiceIntegration { shopifyService: ShopifyService; productService: ProductService; progressService: ProgressService; configService: ConfigurationService; } ``` ## Error Handling ### Error Categories 1. **Configuration Errors**: Invalid environment variables, API credentials 2. **Network Errors**: Connection failures, timeout issues 3. **API Errors**: Shopify API rate limits, authentication failures 4. **UI Errors**: Component rendering issues, state inconsistencies 5. **System Errors**: File system access, permission issues ### Error Display Strategy ```javascript const ErrorBoundary = ({ children }) => { const [error, setError] = useState(null); if (error) { return ( Error Occurred {error.message} Press 'r' to retry or 'q' to quit ); } return children; }; ``` ### Graceful Degradation - Fallback to basic text display if advanced features fail - Automatic retry mechanisms for network operations - State persistence to recover from crashes - Clear error messages with suggested actions ## Testing Strategy ### Component Testing ```javascript // Example test using Ink's testing utilities import { render } from "ink-testing-library"; import { MainMenuScreen } from "../screens/MainMenuScreen"; test("renders main menu with correct options", () => { const { lastFrame } = render(); expect(lastFrame()).toContain("Price Update Operations"); expect(lastFrame()).toContain("Configuration"); expect(lastFrame()).toContain("View Logs"); }); ``` ### Integration Testing - Test service integration with mock services - Verify state management across screen transitions - Test keyboard navigation and input handling - Validate error handling scenarios ### Cross-Platform Testing - Automated testing on Windows, macOS, and Linux - Terminal compatibility testing (Windows Terminal, Command Prompt, PowerShell) - Unicode and color support verification - Performance testing with large datasets ## Migration Strategy ### Phase 1: Setup and Core Infrastructure 1. Install Ink and related dependencies 2. Create basic application structure 3. Implement state management system 4. Set up routing and navigation ### Phase 2: Screen Implementation 1. Implement MainMenuScreen (simplest) 2. Create ConfigurationScreen with form handling 3. Build OperationScreen with progress display 4. Add remaining screens (Scheduling, Logs, TagAnalysis) ### Phase 3: Component Migration 1. Replace Blessed ProgressBar with Ink version 2. Migrate form components and input handling 3. Update navigation and keyboard shortcuts 4. Implement error handling and validation ### Phase 4: Testing and Refinement 1. Comprehensive testing on Windows systems 2. Performance optimization and bug fixes 3. Documentation updates 4. Legacy code cleanup ### Dependency Changes ```json { "dependencies": { "ink": "^4.4.1", "react": "^18.2.0", "@ink/text-input": "^5.0.1", "@ink/select-input": "^5.0.1", "@ink/spinner": "^5.0.1" }, "devDependencies": { "ink-testing-library": "^3.0.0" } } ``` ### File Structure Changes ``` src/ ├── tui/ │ ├── components/ │ │ ├── common/ │ │ │ ├── ProgressBar.jsx │ │ │ ├── InputField.jsx │ │ │ ├── MenuList.jsx │ │ │ └── ErrorBoundary.jsx │ │ ├── screens/ │ │ │ ├── MainMenuScreen.jsx │ │ │ ├── ConfigurationScreen.jsx │ │ │ ├── OperationScreen.jsx │ │ │ ├── SchedulingScreen.jsx │ │ │ ├── LogViewerScreen.jsx │ │ │ └── TagAnalysisScreen.jsx │ │ └── providers/ │ │ ├── AppProvider.jsx │ │ └── ServiceProvider.jsx │ ├── hooks/ │ │ ├── useAppState.js │ │ ├── useNavigation.js │ │ └── useServices.js │ ├── utils/ │ │ ├── keyboardHandlers.js │ │ └── validation.js │ └── TuiApplication.jsx └── tui-entry.js (new entry point) ``` ## Performance Considerations ### Rendering Optimization - Use React.memo for expensive components - Implement virtual scrolling for large lists - Debounce rapid state updates - Minimize re-renders with proper state structure ### Memory Management - Clean up event listeners and timers - Implement proper component unmounting - Use weak references for large data structures - Monitor memory usage during long operations ### Windows-Specific Optimizations - Use Windows-compatible Unicode characters - Optimize for Windows Terminal performance - Handle Windows-specific keyboard events - Ensure proper color rendering in different terminals ## Security Considerations ### Input Validation - Sanitize all user inputs - Validate configuration values - Prevent injection attacks through input fields - Secure handling of API credentials ### State Security - Encrypt sensitive data in state - Clear sensitive information on exit - Prevent credential logging - Secure temporary file handling This design provides a robust foundation for replacing Blessed with Ink, ensuring excellent Windows compatibility while maintaining all existing functionality and improving the overall user experience.