Replace brittle localized-string selectors and broken wait helpers with a
robust, identifier-first UI test infrastructure. All 41 UI tests pass on
iOS 26.2 simulator (iPhone 17).
Foundation:
- BaseUITestCase with deterministic launch helpers (launchClean, launchOffline)
- WaitHelpers (waitUntilHittable, waitUntilGone, tapWhenReady) replacing sleep()
- UITestID enum mirroring AccessibilityIdentifiers from the app target
- Screen objects: TabBarScreen, CameraScreen, CollectionScreen, TodayScreen,
SettingsScreen, PlantDetailScreen
Key fixes:
- Tab navigation uses waitForExistence+tap instead of isHittable (unreliable
in iOS 26 simulator)
- Tests handle real app state (empty collection, no camera permission)
- Increased timeouts for parallel clone execution
- Added NetworkMonitorProtocol and protocol-typed DI for testability
- Fixed actor-isolation issues in unit test mocks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add AllTasksView and PlantEditView components
- Update CoreDataStack CloudKit container ID
- Improve CameraView and IdentificationViewModel
- Update MainTabView, RoomsListView, UpcomingTasksSection
- Minor fixes to PlantGuideApp and SettingsViewModel
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Make all Core Data attributes CloudKit-compatible (optional or with defaults)
- Fix CoreDataStack to wait for persistent store loading before operations
- Add AccentColor to asset catalog (green theme color)
- Remove Browse tab from navigation (keep underlying code)
- Update CLAUDE.md with current features, architecture, and tab structure
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement progress photo capture with HEIC compression and thumbnail
generation, gallery view with grid display and full-size viewing,
time-lapse playback with adjustable speed, and photo reminder
notifications at weekly/biweekly/monthly intervals.
New files:
- ProgressPhoto domain entity with imageData and thumbnailData
- ProgressPhotoRepositoryProtocol and CoreDataProgressPhotoRepository
- CaptureProgressPhotoUseCase with image compression/resizing
- SchedulePhotoReminderUseCase with notification scheduling
- ProgressPhotosViewModel, ProgressPhotoGalleryView
- ProgressPhotoCaptureView, TimeLapsePlayerView
Modified:
- PlantMO with progressPhotos relationship
- Core Data model with ProgressPhotoMO entity
- NotificationService with photo reminder support
- PlantDetailView with Progress Photos section
- DIContainer with photo service registrations
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement batch task completion feature allowing users to select and
complete multiple care tasks at once. Adds edit mode to Today View with
selection checkmarks, floating BatchActionBar, and confirmation dialog
for completing more than 3 tasks.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace the Care tab with a new Today View dashboard that shows
overdue and today's care tasks grouped by room. Features include:
- TodayView: Main dashboard with greeting, progress stats, and task sections
- TodayViewModel: Room-based task grouping with completion tracking
- QuickStatsBar: Progress indicator showing completed vs total tasks
- TaskSection: Collapsible sections for overdue/today tasks
- RoomTaskGroup: Tasks grouped by room with "Water all" bulk action
- InMemoryRoomRepository: In-memory room storage for testing/mocks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update Plant test fixtures to use roomID instead of deprecated location
- Add URLDataFetcher protocol to ImageCache for dependency injection
- Update ImageCacheTests to use protocol-based mock instead of URLSession subclass
- Add missing cancelReminders(for:plantID:) method to MockNotificationService
- Add Equatable conformance to ImageCacheError for test assertions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements Phase 3 of the feature roadmap:
- Room entity with 7 default rooms (Kitchen, Living Room, Bedroom, etc.)
- RoomRepositoryProtocol and CoreDataRoomRepository for persistence
- CreateDefaultRoomsUseCase and ManageRoomsUseCase for CRUD operations
- RoomsListView with swipe-to-delete and drag-to-reorder
- RoomEditorView with SF Symbol icon picker
- RoomPickerView for assigning plants to rooms
- Updated Plant entity (location → roomID) and PlantDetailView
- Added "Manage Rooms" section in SettingsView
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Switch CoreDataStack from NSPersistentContainer to NSPersistentCloudKitContainer
- Configure CloudKit container: iCloud.com.t-t.PlantGuide
- Remove uniqueness constraints from all Core Data entities (CloudKit incompatible)
- Add CloudKit container identifier to entitlements
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create DesignSystem with ColorTokens, AppearanceManager, spacing, and typography
- Add appearance picker in Settings (System/Light/Dark modes)
- Replace hardcoded colors with design tokens in MainTabView and Enums+UI
- Inject AppearanceManager via environment in PlantGuideApp
- Add FEATURE_ROADMAP.md documenting 8 planned features
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds competitive analysis document comparing PlantGuide against major
plant identification apps (PlantIn, PictureThis, Planta, etc.) and
CLAUDE.md to help future Claude Code instances navigate the codebase.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix Core Data transformer conflict causing cache decode failures
- Changed PlantCareInfoMO attributes from Transformable to Binary type
- Removed valueTransformerName references that conflicted with manual JSON encoding
- Fix cache key mismatch causing cache misses
- Normalize scientificName to lookup name when saving to cache
- Remove cache expiration (cache now persistent until plant deleted)
- Removed cacheExpiration property and isCacheStale check
- Added forceRefresh parameter to FetchPlantCareUseCase for manual refresh
- Add cache cleanup when deleting plants
- Added PlantCareInfoRepositoryProtocol dependency to DeletePlantUseCase
- Clean up cached care info when plant is deleted
- Add extensive debug logging to PlantNetAPIService
- Log request/response details, status codes, and decoding errors
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Implement camera capture and plant identification workflow
- Add Core Data persistence for plants, care schedules, and cached API data
- Create collection view with grid/list layouts and filtering
- Build plant detail views with care information display
- Integrate Trefle botanical API for plant care data
- Add local image storage for captured plant photos
- Implement dependency injection container for testability
- Include accessibility support throughout the app
Bug fixes in this commit:
- Fix Trefle API decoding by removing duplicate CodingKeys
- Fix LocalCachedImage to load from correct PlantImages directory
- Set dateAdded when saving plants for proper collection sorting
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>