Commit Graph
274 Commits
Author SHA1 Message Date
Thomas SharedInboxandClaude Sonnet 4.6 53757595c4 revert(android): restore epoch seconds for build-number
The (YY-20)mmddHHMM formula generates ~605M for 2026, which is lower
than existing epoch-second deployments (~1.747B). Google Play rejects
version code regressions at commit time (403 Forbidden).

Blocked — see issue #63 for context.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 19:00:02 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 71a88358f5 docs: add issue template with label workflow reminder
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 18:53:26 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 f0c0eeb9a4 docs(agents): add explicit fgj commands for issue label transitions
Makes the InProgress-first rule harder to skip by including the exact
command to run, so there is no ambiguity about how or when to do it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 18:49:00 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 28b86ec1be fix(android): use human-readable build number (YY-20)mmddHHMM
Replaces epoch seconds with a compact date-based integer so the Play
Store version code is interpretable by humans while staying below the
2 100 000 000 upper bound until ~2040.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 18:26:43 +02:00
Thomas SharedInbox caa238303e docs 2026-05-14 18:24:07 +02:00
Thomas SharedInbox c0d6699f92 AGENTS: issue workflow 2026-05-14 18:14:19 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 c46de2abb8 fix(android): use epoch seconds for versionCode, not yymmddhhmm
date +%y%m%d%H%M for 2026-05-14 17:17 = 2605141717 which exceeds
Android's 2100000000 versionCode cap, aborting the build.
Epoch seconds (~1.75B today) stay under the cap and remain unique.
Human-readable build-name (yymmddhhmm) is unchanged for issue #63.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 17:19:50 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 3dbd8f53be fix(ci): move Play Store deploy into ci.yml; drop release.yml
workflow_run is not supported by Forgejo Actions — release.yml never
fired after CI passed.  Port the deploy-playstore job into ci.yml with
needs: check + if: main, matching the pattern already used by build-linux.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 17:11:00 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 f7e75cd5b6 fix(test): update E2E test for onboarding screen + increase timeouts
The U7 onboarding view replaced "No accounts yet." with "Welcome to
SharedInbox", causing the E2E test to spin for the full timeout budget
(pumping slowly in headless CI) before failing. Fix the finder and
bump per-attempt timeout from 240s → 360s and CI job ceiling from
20 min → 30 min to give the full account-add → send → verify flow
room to complete.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 16:56:53 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 9c1d8cfe72 fix(ci): manage Xvfb directly to get accurate E2E exit codes
xvfb-run catches SIGTERM from `timeout`, kills its children, and exits 0,
making a timed-out test indistinguishable from a pass (CI #168 false positive).
Running Xvfb ourselves captures fvm flutter test's real exit code so timeouts
(exit 124) are correctly treated as failures.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 16:45:38 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 d12cdd6ca4 fix(e2e): kill stale processes + retry once on display init hang
Previous failed CI runs leave orphan sharedinbox/flutter processes that hold
onto Xvfb display resources, causing the next run's GTK app to hang during
initialisation (never connects back to the flutter test runner, no output
for 9+ min until timeout fires).

Fix:
- Kill stale sharedinbox/flutter processes before launching xvfb-run
- Retry the xvfb-run call once (4-min timeout per attempt) so a transient
  display-init hang doesn't permanently fail the job

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 16:27:48 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 5ede675668 fix(ci): revert to single task check step to preserve build cache
Splitting into separate steps breaks the Dart compilation cache that task
check builds up via parallelism. Without the shared cache, flutter test
integration_test/ -d linux rebuilds cold (9+ min instead of ~24s).

Keep the single 'nix develop --command task check' step which runs
analyze+build-linux+test in parallel (Task deps) and warms the cache
before the E2E test. Add timeout-minutes: 20 as a job-level safety net.
The xvfb-run timeout 600 (already in integration_ui_test.sh) still
prevents infinite hangs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 16:09:18 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 0d6a8062e4 fix(ci): increase E2E timeout to 10 min (was 5 min, too tight)
Sequential CI steps leave the runner under heavier load than the parallel
task check approach, so the E2E test can legitimately take 4-5 min.
Raise timeout 300→600 in integration_ui_test.sh and step timeout 6→12 min.
Job-level ceiling raised to 30 min to match.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 15:51:58 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 b95545dff2 fix(ci): generate changelog before analyze (assets/ must exist)
The assets/ directory is created by generate-changelog. Splitting CI into
separate steps meant analyze ran before any step created it, causing a
pubspec.yaml asset_directory_does_not_exist warning that fails the check.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 15:39:39 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 c45b0e852e ci: add step-level timeouts and cap E2E hang at 5 min (#67)
- Split single 'Run Full Check Suite' step into named steps so per-step
  timing is visible in the CI UI
- Add timeout-minutes: 20 to the overall job and timeout-minutes: 6 to
  the UI E2E step — previously a stuck xvfb-run could hang for 23+ min
- Add 'timeout 300' to xvfb-run in integration_ui_test.sh so the E2E
  test exits with a clear error instead of hanging indefinitely

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 15:36:31 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 f6f10700f8 feat: select all, human-readable build version, release gated on CI
- Add Select All button to AppBar during selection mode (#15)
- Replace Unix timestamp build number with yymmdd-hhmm format (#63)
- Gate release.yml on CI workflow success via workflow_run event
- Update golden for email_list_selection to reflect new Select All button

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 14:23:54 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 d8d0f89c68 fix(ci): switch Play Store uploader from httplib2 to requests
httplib2 raises RedirectMissingLocation on Google Play's resumable upload
redirects, causing every deploy since run #77 to fail. Replace google-api-python-client
+ google-auth-httplib2 with a direct requests-based implementation using
AuthorizedSession; drop httplib2 from flake.nix entirely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 12:12:56 +02:00
Bot of Thomas Güttler 1581d145a5 docs: SYNC.md — full email action lifecycle (D3) (#54) 2026-05-14 12:01:26 +02:00
Bot of Thomas Güttler 12639d1e24 feat: onboarding walkthrough for first-time users (U7) (#55) 2026-05-14 11:57:08 +02:00
Bot of Thomas Güttler 2f1bff8922 ci: enforce ui/→data/ layer boundary (A5) (#53) 2026-05-14 11:41:34 +02:00
Bot of Thomas Güttler dd66c3834d test: golden tests for key EmailListScreen states (T5) (#52) 2026-05-14 11:33:45 +02:00
Bot of Thomas Güttler 548f4e92dc perf: cache formatted date strings in EmailListScreen (P5) (#51) 2026-05-14 11:31:19 +02:00
Bot of Thomas Güttler 5311720a7e fix: open HTML email links in external browser (S4) (#50) 2026-05-14 11:26:33 +02:00
Bot of Thomas Güttler a723380560 perf: defer HTML-to-plain conversion off the UI thread (P3) (#49) 2026-05-14 11:14:23 +02:00
Bot of Thomas Güttler 499774d1a6 feat: add 'Mark all as read' to mailbox overflow menu (U8) (#48) 2026-05-14 10:58:33 +02:00
Bot of Thomas Güttler 132b6aeb9a feat: recent searches history in SearchScreen (U3) (#47) 2026-05-14 10:51:28 +02:00
Bot of Thomas Güttler efd5a1fc17 test: AccountSyncManager integration tests without real servers (A3) (#46) 2026-05-14 10:49:29 +02:00
Bot of Thomas Güttler 44e387bfb3 fix: treat TLS config errors as permanent in sync loops (R5) (#45) 2026-05-14 10:29:07 +02:00
Bot of Thomas Güttler 546b06ba5a test(T3): add contract test suites for Account/Mailbox/Email repositories (#43) 2026-05-14 10:20:32 +02:00
Bot of Thomas Güttler 5ba24a66e0 fix: retry AAB upload on httplib2 RedirectMissingLocation error (#44) 2026-05-14 10:20:25 +02:00
Bot of Thomas Güttler 4f16587564 feat(P2): paginate email list — default 50 threads, Load more button (#42) 2026-05-14 10:09:05 +02:00
Bot of Thomas Güttler f0f81777b5 feat(P1): FTS5 virtual table for email search (replaces LIKE scan) (#41) 2026-05-14 10:01:42 +02:00
Bot of Thomas Güttler 64fdc53bbd refactor(A1): extract EmailDetailNotifier, drop initState DB coupling (#39) 2026-05-14 09:49:38 +02:00
Bot of Thomas Güttler 084ba2b7ba fix: increase Play Store upload timeout and add retries (#40) 2026-05-14 09:46:59 +02:00
Bot of Thomas Güttler 6d83a5670d fix: upgrade workmanager to 0.9.0+3 to fix Kotlin 2.x AAB build failure (#38) 2026-05-14 09:03:17 +02:00
Bot of Thomas Güttler 1d93eb10f3 fix: enable core library desugaring for flutter_local_notifications (#37) 2026-05-14 08:39:42 +02:00
Bot of Thomas Güttler f9030dc1e5 perf(P4): add indexes on mailboxes and threads for observeMailboxes/observeThreads (#36) 2026-05-14 08:37:00 +02:00
Bot of Thomas Güttler 92e91d9fad fix(R3): wrap flutter_html in error boundary to prevent screen crash (#35) 2026-05-14 08:27:02 +02:00
Bot of Thomas Güttler 1117cadf2a feat(D2): add task check-coverage and enforce coverage gate in check-fast (#34) 2026-05-14 05:29:41 +02:00
Bot of Thomas Güttler 3125713e6b refactor(A2): extract shared EmailTile widget (#33) 2026-05-14 05:20:11 +02:00
Bot of Thomas Güttler 4f3a5434cc test(T4): extend migration tests to cover all schema versions up to v24 (#32) 2026-05-14 05:09:15 +02:00
Bot of Thomas Güttler 17e404407f test(T2): add widget tests for ThreadDetailScreen and SearchScreen (#31) 2026-05-14 04:58:59 +02:00
Bot of Thomas Güttler dff2b5e2ca test(T1): add edge-case coverage for EmailRepositoryImpl (#30) 2026-05-14 04:43:11 +02:00
Bot of Thomas Güttler 7096c27ede feat(U6): show sync status indicator in email list app bar (#29) 2026-05-14 04:23:07 +02:00
Bot of Thomas Güttler 2715c1613f feat(U4): background sync and local notifications for new mail (#28) 2026-05-14 04:06:35 +02:00
Bot of Thomas Güttler 0e291b509b feat(U2): sync local drafts with IMAP Drafts folder (#27) 2026-05-14 00:27:47 +02:00
Bot of Thomas Güttler 7421855922 feat(U1): show Unsubscribe chip in email detail (#26) 2026-05-14 00:09:14 +02:00
Bot of Thomas Güttler 855f9a3a6d feat(S2): validate IMAP/SMTP hostnames against injection (#25) 2026-05-13 23:49:30 +02:00
Bot of Thomas Güttler a0c35c647a test(R6): backoff stress tests for AccountSyncManager (#24) 2026-05-13 23:37:40 +02:00
Bot of Thomas Güttler fc592c475f feat(R4): dismissible sync error banner in email list (#23) 2026-05-13 23:14:44 +02:00