17 KiB
Tasks: Migration UI Improvements
Feature: Migration UI Improvements
Branch: 008-migration-ui-improvements
Generated: 2025-12-27
Status: Ready for Implementation
Overview
This document provides actionable, dependency-ordered tasks for implementing the Migration UI Improvements feature. All tasks follow the strict checklist format and are organized by user story for independent implementation and testing.
Dependencies & Execution Order
Phase 1: Setup (Project Initialization)
- Goal: Initialize project structure and verify prerequisites
- Dependencies: None
- Test Criteria: Project structure exists, all dependencies available
Phase 2: Foundational (Blocking Prerequisites)
- Goal: Extend core components to support new functionality
- Dependencies: Phase 1 complete
- Test Criteria: Core extensions work independently
Phase 3: User Story 1 - Task History and Status (P1)
- Goal: Display list of recent migration tasks with status
- Dependencies: Phase 2 complete
- Test Criteria: Start a migration, verify it appears in task list with correct status
Phase 4: User Story 2 - Task Log Inspection (P2)
- Goal: View detailed logs for any migration task
- Dependencies: Phase 3 complete (uses task list)
- Test Criteria: Click "View Logs" button, see modal with task log entries
Phase 5: User Story 3 - Interactive Password Resolution (P1)
- Goal: Handle missing database password errors interactively
- Dependencies: Phase 2 complete
- Test Criteria: Trigger migration with missing password, verify UI prompts instead of failing
Phase 6: Polish & Cross-Cutting Concerns
- Goal: Finalize integration, add tests, documentation
- Dependencies: All previous phases complete
- Test Criteria: All user stories work together, tests pass
Parallel Execution Opportunities
Within Phase 3 (US1):
- Backend API endpoints can be implemented in parallel with frontend components
- Task list API and Task log API are independent
Within Phase 5 (US3):
- Password prompt UI can be developed independently of backend resumption logic
- Error detection in MigrationPlugin can be tested separately
Phase 1: Setup (Project Initialization)
-
T001 Verify project structure and create missing directories
- Check backend/src/api/routes/ exists
- Check backend/src/models/ exists
- Check frontend/src/components/ exists
- Check frontend/src/services/ exists
- Create any missing directories per plan.md structure
-
T002 Verify Python 3.9+ and Node.js 18+ dependencies
- Check Python version >= 3.9
- Check Node.js version >= 18
- Verify FastAPI, Pydantic, SQLAlchemy installed
- Verify SvelteKit, Tailwind CSS configured
-
T003 Initialize task tracking for this implementation
- Create implementation log in backend/logs/implementation.log
- Document start time and initial state
Phase 2: Foundational (Blocking Prerequisites)
Backend Core Extensions
-
T004 [P] Extend TaskStatus enum in backend/src/core/task_manager.py
- Add new state:
AWAITING_INPUT - Update state transition logic
- Add validation for new state
- Add new state:
-
T005 [P] Extend Task class in backend/src/core/task_manager.py
- Add
input_required: boolfield - Add
input_request: Dict | Nonefield - Add
logs: List[LogEntry]field - Update constructor and validation
- Add
-
T006 [P] Implement task history retrieval in TaskManager
- Add
get_tasks(limit, offset, status)method - Add
get_task_logs(task_id)method - Add
persist_awaiting_input_tasks()method - Add
load_persisted_tasks()method
- Add
-
T007 [P] Create SQLite schema for persistent tasks
- Create migration script for
persistent_taskstable - Add indexes for status and created_at
- Test schema creation
- Create migration script for
-
T008 [P] Extend MigrationPlugin error handling
- Add pattern matching for Superset password errors
- Detect "Must provide a password for the database" message
- Extract database name from error context
- Transition task to AWAITING_INPUT state
-
T009 [P] Implement password injection mechanism
- Add method to resume task with credentials
- Validate password format
- Handle multiple database passwords
- Update task context with credentials
Backend API Routes
-
T010 [P] Create backend/src/api/routes/tasks.py
- Create file with basic route definitions
- Add route handlers with stubbed responses
- Register router in init.py (covered by T011)
- Add basic error handling structure
-
T011 [P] Add task routes to backend/src/api/routes/init.py
- Import and register tasks router
- Verify route registration
Frontend Services
- T012 [P] Create frontend/src/services/taskService.js
- Implement
getTasks(limit, offset, status)function - Implement
getTaskLogs(taskId)function - Implement
resumeTask(taskId, passwords)function - Add proper error handling
- Implement
Frontend Components
-
T013 [P] Create frontend/src/components/TaskHistory.svelte
- Display task list with ID, status, start time
- Add "View Logs" action button
- Handle empty state
- Support real-time updates
-
T014 [P] Create frontend/src/components/TaskLogViewer.svelte
- Display modal with log entries
- Show timestamp, level, message, context
- Auto-scroll to latest logs
- Close button functionality
-
T015 [P] Create frontend/src/components/PasswordPrompt.svelte
- Display database name and error message
- Show password input fields (dynamic for multiple databases)
- Submit button with validation
- Error message display for invalid passwords
Phase 3: User Story 1 - Task History and Status (P1)
Goal: As a user, I want to see a list of my recent and currently running migration tasks so that I can track progress and review past results.
Independent Test: Start a migration and verify it appears in a "Recent Tasks" list with its current status.
Backend Implementation
-
T016 [US1] Implement GET /api/tasks endpoint logic
- Query TaskManager for task list
- Apply limit/offset pagination
- Apply status filter if provided
- Return TaskListResponse format
-
T017 [US1] Implement GET /api/tasks/{task_id}/logs endpoint logic
- Validate task_id exists
- Retrieve logs from TaskManager
- Return TaskLogResponse format
- Handle not found errors
-
T018 [US1] Add task status update WebSocket support
- Extend existing WebSocket infrastructure
- Broadcast status changes to /ws/tasks/{task_id}/status
- Broadcast log updates to /ws/tasks/{task_id}/logs
Frontend Implementation
-
T019 [US1] Integrate TaskHistory component into migration page
- Add component to frontend/src/routes/migration/+page.svelte
- Fetch tasks on page load
- Handle loading state
- Display error messages
-
T020 [US1] Implement real-time status updates
- Subscribe to WebSocket channel for task updates
- Update task list on status change
- Add visual indicators for running tasks
-
T021 [US1] Add task list pagination
- Implement "Load More" button
- Handle offset updates
- Maintain current task list while loading more
Testing
-
T022 [US1] Test task list retrieval
- Create test migration tasks
- Verify API returns correct format
- Verify pagination works
- Verify status filtering works
-
T023 [US1] Test real-time updates
- Start a migration
- Verify task appears in list
- Verify status updates in real-time
- Verify WebSocket messages are received
Phase 4: User Story 2 - Task Log Inspection (P2)
Goal: As a user, I want to view the detailed logs of any migration task so that I can understand exactly what happened or why it failed.
Independent Test: Click a "View Logs" button for a task and see a modal or panel with the task's log entries.
Backend Implementation
- T024 [P] [US2] Enhance log storage in TaskManager
- Ensure logs are retained for all task states
- Add log context preservation
- Implement log cleanup on task retention
Frontend Implementation
-
T025 [US2] Implement TaskLogViewer modal integration
- Add "View Logs" button to TaskHistory component
- Wire button to open TaskLogViewer modal
- Pass task_id to modal
- Fetch logs when modal opens
-
T026 [US2] Implement log display formatting
- Color-code by log level (INFO=blue, WARNING=yellow, ERROR=red)
- Format timestamps nicely
- Display context as JSON or formatted text
- Auto-scroll to bottom on new logs
-
T027 [US2] Add log refresh functionality
- Add refresh button in modal
- Poll for new logs every 5 seconds while modal open
- Show "new logs available" indicator
Testing
-
T028 [US2] Test log retrieval
- Create task with various log entries
- Verify logs are returned correctly
- Verify log context is preserved
- Test with large log files
-
T029 [US2] Test log viewer UI
- Open logs for completed task
- Open logs for running task
- Verify formatting and readability
- Test refresh functionality
Phase 5: User Story 3 - Interactive Password Resolution (P1)
Goal: As a user, I want the system to detect when a migration fails due to a missing database password and allow me to provide it interactively.
Independent Test: Trigger a migration that requires a DB password and verify the UI prompts for the password instead of just failing.
Backend Implementation
-
T030 [US3] Implement password error detection in MigrationPlugin
- Add error pattern matching for Superset 422 errors
- Extract database name from error message
- Create DatabasePasswordRequest object
- Transition task to AWAITING_INPUT state
-
T031 [US3] Implement task resumption with passwords
- Add validation for password format
- Inject passwords into migration context
- Resume task execution from failure point
- Handle multiple database passwords
-
T032 [US3] Add task persistence for AWAITING_INPUT state
- Persist task context and input_request
- Load persisted tasks on backend restart
- Clear persisted data on task completion
- Implement retention policy
Frontend Implementation
-
T033 [US3] Implement password prompt detection
- Monitor task status changes
- Detect AWAITING_INPUT state
- Show notification to user
- Update task list to show "Requires Input" indicator
-
T034 [US3] Wire PasswordPrompt to task resumption
- Connect form submission to taskService.resumeTask()
- Handle success (close prompt, resume task)
- Handle failure (show error, keep prompt open)
- Support multiple database inputs
-
T035 [US3] Add visual indicators for password-required tasks
- Highlight tasks needing input in task list
- Add badge or icon
- Show count of pending inputs
Testing
-
T036 [US3] Test password error detection
- Mock Superset password error
- Verify error is detected
- Verify task transitions to AWAITING_INPUT
- Verify DatabasePasswordRequest is created
-
T037 [US3] Test password resumption
- Provide correct password
- Verify task resumes
- Verify task completes successfully
- Test with incorrect password (should prompt again)
-
T038 [US3] Test persistence across restarts
- Create AWAITING_INPUT task
- Restart backend
- Verify task is loaded
- Verify password prompt still works
-
T039 [US3] Test multiple database passwords
- Create migration requiring 2+ databases
- Verify all databases listed in prompt
- Verify all passwords submitted
- Verify task resumes with all credentials
Phase 6: Polish & Cross-Cutting Concerns
Integration & E2E
-
T040 [P] Integrate all components on migration page
- Add TaskHistory to migration page
- Add password prompt handling
- Ensure WebSocket connections work
- Test complete user flow
-
T041 [P] Add loading states and error boundaries
- Show loading spinners during API calls
- Handle API errors gracefully
- Show user-friendly error messages
- Add retry mechanisms
Configuration & Security
-
T042 [P] Add configuration options
- Task retention days (default: 30)
- Task retention limit (default: 100)
- Pagination limits (default: 10, max: 50)
- Password complexity requirements
-
T043 [P] Security review
- Verify passwords are not logged
- Verify passwords are not stored permanently
- Verify input validation on all endpoints
- Check for SQL injection vulnerabilities
Documentation
-
T044 [P] Update API documentation
- Add new endpoints to OpenAPI spec
- Update API contract examples
- Document WebSocket channels
-
T045 [P] Update quickstart guide
- Add task history section
- Add log viewing section
- Add password prompt section
- Add troubleshooting tips
Testing & Quality
-
T046 [P] Write unit tests for backend
- Test TaskManager extensions
- Test MigrationPlugin error detection
- Test API endpoints
- Test password validation
-
T047 [P] Write unit tests for frontend
- Test taskService functions
- Test TaskHistory component
- Test TaskLogViewer component
- Test PasswordPrompt component
-
T048 [P] Write integration tests
- Test complete password flow
- Test task persistence
- Test WebSocket updates
- Test error recovery
-
T049 [P] Run full test suite
- Execute pytest for backend
- Execute frontend tests
- Fix any failing tests
- Verify all acceptance criteria met
-
T050 [P] Final validation
- Verify all user stories work independently
- Verify all acceptance scenarios pass
- Check performance (pagination, real-time updates)
- Review code quality and security
Implementation Strategy
MVP Approach (Recommended)
Focus on User Story 1 (P1) first:
- Complete Phase 1 (Setup)
- Complete Phase 2 (Foundational) - Backend only
- Complete Phase 3 (US1) - Task History
- MVP Complete: Users can view task list and status
Then add User Story 3 (P1): 5. Complete Phase 5 (US3) - Password Resolution 6. Enhanced MVP: Users can handle password errors
Finally add User Story 2 (P2): 7. Complete Phase 4 (US2) - Log Inspection 8. Full Feature: Complete UI improvements
Parallel Development
Backend Team:
- T004-T009 (Core extensions)
- T010-T011 (API routes)
- T016-T018 (US1 backend)
- T024 (US2 backend)
- T030-T032 (US3 backend)
Frontend Team:
- T012 (Services)
- T013-T015 (Components)
- T019-T021 (US1 frontend)
- T025-T027 (US2 frontend)
- T033-T035 (US3 frontend)
Testing Team:
- T022-T023 (US1 tests)
- T028-T029 (US2 tests)
- T036-T039 (US3 tests)
- T046-T050 (Integration & final)
Risk Mitigation
-
Superset API Changes: Pattern matching may need updates if Superset changes error format
- Mitigation: Make pattern matching configurable
-
WebSocket Scalability: Real-time updates may impact performance with many users
- Mitigation: Use polling fallback, implement rate limiting
-
Password Security: Handling sensitive data requires careful implementation
- Mitigation: Never log passwords, clear from memory after use, use secure transport
-
Task Persistence: SQLite may not scale for high-volume task history
- Mitigation: Configurable retention, consider migration to full database later
Success Criteria Validation
User Story 1 - Task History and Status
- SC-001: Users can view status of last 10 migration tasks on migration page
- Real-time status updates work
- Task list shows ID, status, start time, actions
User Story 2 - Task Log Inspection
- SC-002: Users can access full log in less than 2 clicks
- Log viewer shows timestamped messages
- Modal/panel works correctly
User Story 3 - Interactive Password Resolution
- SC-003: 100% of "Missing Password" errors caught and presented as prompts
- SC-004: Users can resume blocked migration by providing password
- Task state transitions work correctly
- Multiple database passwords supported
Cross-Cutting Requirements
- All API endpoints follow contract specifications
- All components follow existing patterns
- Security requirements met
- Performance acceptable (pagination, real-time updates)
- Configuration options available
- Documentation complete
Task Summary
Total Tasks: 50
Setup Phase: 3 tasks
Foundational Phase: 12 tasks
US1 Phase: 8 tasks
US2 Phase: 6 tasks
US3 Phase: 10 tasks
Polish Phase: 11 tasks
Parallel Opportunities: 15+ tasks can be developed in parallel within their phases
MVP Scope: Tasks 1-23 (Setup, Foundational, US1) - ~23 tasks
Full Feature: All 50 tasks
Next Steps
- Review this tasks.md with team leads
- Assign tasks to backend/frontend developers
- Start Phase 1 immediately (Setup)
- Schedule daily standups to track progress
- Use this document as the single source of truth for implementation
Ready for Implementation: ✅ All design artifacts complete, tasks generated, dependencies mapped.