- run_unit_tests.sh and CI now run unit + widget tests together for coverage
- Removed account_list, email_list, mailbox_list, settings screens from
_excluded (all ≥70% when measured with widget tests)
- Added tests: mailbox tile tap, account tile tap, empty-state button,
settings Remove confirmation, email search submit/results/sync/edit
- FakeEmailRepository accepts searchResults for testing search paths
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- EmailRepository: add searchEmails(accountId, mailboxPath, query)
- EmailRepositoryImpl: UID SEARCH with OR SUBJECT/TEXT criteria,
fetch ENVELOPE+FLAGS for matching UIDs
- EmailListScreen: toggle search bar in AppBar; submit triggers server
search; results replace the stream list; ESC/back closes search
- Refactored list into _buildList() shared by stream and search views
- README/PLAN.md updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- email_detail: add Move-to-folder button (bottom-sheet mailbox picker,
excludes current folder, calls moveEmail on server)
- email_list: show amber star for flagged, paperclip for attachments
in trailing area alongside date
- PLAN.md: mark phase 8 done
- README: add flag/move/attachment to working features
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- compose_screen: show From dropdown when >1 account, auto-select first
account when none pre-selected (fixes silent failure on new mail)
- email_detail_screen: add flag/unflag star button with amber highlight
- PLAN.md: collapse completed phases, list remaining UI gaps
- README: fix stale "vendored" package reference, update platform table,
add Working Features section
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The directory was tracked as a mode-160000 gitlink (bare submodule
reference) without a .gitmodules entry, causing 'has no commit checked
out' errors on commit. Re-added as ordinary tracked files so the
vendored copy is fully part of this repo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- flutter test --coverage generates coverage/lcov.info; awk script
computes line coverage and fails if below threshold (currently 100%)
- Add Email, EmailBody, EmailAttachment constructor tests to cover the
3 previously uncovered lines in email.dart
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The project depends on the Flutter SDK so dart pub/dart test fail with
"version solving failed". Switch task:test to flutter test and
task:codegen to flutter pub run build_runner.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- enough_mail: use uidFetchMessage/uidMarkSeen/uidMarkFlagged/uidMove/
uidMarkDeleted/uidExpunge, remove non-existent isUidSequence param,
fix SmtpClient construction and use quit() not disconnect()
- Drift: add @DataClassName('MailboxRow') to avoid ugly 'Mailboxe',
alias core model imports to resolve type name conflicts
- EmailsCompanion.insert: uid/receivedAt are required, not Value<T>
- Lint: remove unrecognised rules (prefer_const_collections,
avoid_returning_null_for_future), add missing mounted guards after await
- Tests: fix html_utils expectations to match trim() behaviour,
add explicit Map casts in email_model_test for avoid_dynamic_calls
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- flake.nix: Flutter 3.41.6, Android SDK, Stalwart, GTK3/build
tools for Linux desktop, go-task
- .envrc: copied from sharedinbox — use flake + dotenv_if_exists
- Taskfile.yml: analyze, test, integration, codegen, run tasks
- stalwart-dev/: IMAP+SMTP dev server reused from sharedinbox
- test/integration/imap_sync_test.dart: login, list mailboxes,
send via SMTP and receive via IMAP
- pubspec.yaml: add flutter_secure_storage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
IMAP/SMTP email client with offline-first architecture:
sync engine writes to Drift (SQLite), UI reads reactively
from the local DB. enough_mail vendored under packages/.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>