Commit Graph
395 Commits
Author SHA1 Message Date
Gemini CLI 52473d216d ci: centralize Dagger calls in Taskfile and enforce standards via pre-commit 2026-05-17 16:43:52 +02:00
Gemini CLI 1266fd6338 gitignore 2026-05-17 16:34:28 +02:00
Gemini CLI 8cbe8c01bb ci: use idiomatic Dagger service bindings for Stalwart
Refactor the CI pipeline to use WithServiceBinding for the Stalwart mail
server, replacing legacy shell scripts and manual port management.
Introduces pre-seeded data for the Stalwart service to avoid network
hits and improves headless UI testing with Xvfb.
2026-05-17 16:01:42 +02:00
GuettliBot2 e6fc65a345 fix(ci): run backend tests sequentially to prevent contention 2026-05-17 14:41:00 +02:00
GuettliBot2 982618c9fe fix(ci): pin Stalwart to v0.14.1 and fix local start script 2026-05-17 14:24:06 +02:00
GuettliBot2 a22a4d1015 ci: remove Nix dependency from workflows and refactor Dagger module for native source fetching 2026-05-17 13:20:26 +02:00
GuettliBot2 92778346d3 ci: remove Nix dependency and modernize Stalwart test setup with Dagger Services 2026-05-17 13:17:28 +02:00
GuettliBot2 34d28d8a56 ci: use codeberg-small runner labels instead of ubuntu-latest 2026-05-17 12:19:35 +02:00
GuettliBot2 ef28d25f77 ci: enforce strict Dagger probing using URL1/URL2 and migrate website.yml to Dagger 2026-05-17 11:52:38 +02:00
GuettliBot2 b2d4695112 ci: add remote Dagger server setup with port probing 2026-05-17 11:50:39 +02:00
GuettliBot2 73c1a09d47 ci: minor cleanup of self-hosted runner references 2026-05-17 11:38:27 +02:00
GuettliBot2 27ce3961b1 ci: switch from self-hosted runners to Codeberg default ubuntu-latest 2026-05-17 11:37:58 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 517f799b99 feat: apply local Sieve rules after sync (#119)
- Add LocalSieveApplied table (schema v32) keyed by (accountId, messageId)
  so each email is processed by Sieve at most once, even across restarts.
- Implement EmailRepository.applySieveRules(): loads the active local Sieve
  script, runs the interpreter against new INBOX emails, and queues pending
  move/delete/flag_seen changes for any matched rules.
- Wire applySieveRules() into both _AccountSync._sync() and
  _JmapAccountSync._sync() after the per-mailbox email sync loop.
- Make _flushPendingChangesImap() treat NONEXISTENT / not-found errors as
  silent no-ops (counts as flushed) so a second device racing on the same
  email does not accumulate retries.
- Add migration test assertions and a dedicated unit test suite covering
  rule matching, deduplication, discard, and multi-email processing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 10:34:21 +02:00
GuettliBot2 8ef1c7c96f ci: adapt Codeberg CI to use Dagger secrets 2026-05-17 10:29:35 +02:00
GuettliBot2 2f19594f9b Merge branch 'main' into migrate-to-dagger 2026-05-17 10:29:03 +02:00
GuettliBot2 ea97c42675 ci: fix secret mounting in Dagger module 2026-05-17 10:28:16 +02:00
GuettliBot2 a20beda046 ci: finalize Dagger migration for all deployment tasks 2026-05-17 10:20:33 +02:00
GuettliBot2 b878502f9a ci: migrate Linux and Android APK deployment to Dagger 2026-05-17 10:19:23 +02:00
GuettliBot2 51844b5ce2 ci: migrate PublishWebsite to Dagger 2026-05-17 10:17:40 +02:00
GuettliBot2 a13cd97e39 ci: migrate BuildWebsite and GenerateBuildHistory to Dagger 2026-05-17 10:16:38 +02:00
GuettliBot2 a8dff99dd7 ci: migrate Hugo website build to Dagger 2026-05-17 10:15:04 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 f9d6d6f4cc fix(ci): restore pub get before dart format to fix language version detection
Without flutter pub get, .dart_tool/package_config.json does not exist
in the Dagger container. dart format then defaults to the current SDK
version (3.11+) rather than the package's declared language version
(3.3), applying tall-style formatting and failing on 90 files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 10:10:51 +02:00
GuettliBot2 64423d53ae ci: finalize Dagger core migration and sync formatting 2026-05-17 10:06:46 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 43e12ddef8 fix(ci): include pubspec.lock in Dagger source filter
Without pubspec.lock, flutter pub get in the Dagger container resolves
package versions independently of the local lockfile. This caused
flutter_lints to be unresolvable in the container, making dart format
fall back to a different formatter style and flag 90 files as changed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 09:56:15 +02:00
GuettliBot2 af3f1e706a ci: migrate coverage to Dagger and fix coverage gate exclusions 2026-05-17 09:15:53 +02:00
GuettliBot2 601358dbb7 ci: finalize Dagger migration for format and check-mocks with internal git init 2026-05-17 09:08:29 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 f2d9459f44 fix(ci): run pub get before dart format check
Without pub get, dart format cannot resolve package URIs and uses a
different language version, causing spurious failures for correctly
formatted files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 09:06:03 +02:00
GuettliBot2 36cf8ccf34 ci: migrate format and check-mocks to Dagger and fix formatting 2026-05-17 08:51:17 +02:00
GuettliBot2 90ab0a6905 ci: rename integration tests to test-backend and migrate to Dagger 2026-05-17 08:47:15 +02:00
Thomas SharedInbox a0e8b4359a test(agent-loop): verify InProgress is set before agent starts (#122)
Add TestMain class covering the main() flow: asserts that _set_labels
is called with State/InProgress (and State/Ready removed) strictly
before _start_agent, and that no labels or agents are touched when
there are no ready issues.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 08:13:19 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 666c42ce1c refactor(agent-loop): remove tmux, run claude directly via Popen (#120)
Replace the tmux-based agent launcher with a direct subprocess.Popen
call. Claude sessions can't be attached to anyway, so the tmux layer
added complexity with no benefit. State now tracks a PID instead of a
tmux session name; liveness is checked with os.kill(pid, 0).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 08:00:39 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 01409a164b fix(undo): await DB writes in pushAction to prevent SIGBUS in tests
unawaited saveAction/deleteAction calls in pushAction could outlive the
test and access the SQLite connection after tearDown closed it, causing
the native FFI layer to hit freed memory (SIGBUS / exit code -7).

Making both DB calls awaited ensures pushAction only returns once the
action is fully persisted, eliminating the race condition.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 07:37:43 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 6d4a1a0586 fix(agent-loop): answer workspace-trust dialog by piping a newline to stdin
The new Claude Code trust dialog appeared inside the tmux PTY despite -p
mode and stdout being piped, blocking the agent indefinitely.  With
< /dev/null the dialog could never be answered.

Replace < /dev/null with printf '\n' | so the Enter keypress confirms the
default "Yes, I trust this folder" option.  After that single newline stdin
reaches EOF, which -p mode ignores.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 07:24:06 +02:00
GuettliBot2 96c9c74151 ... 2026-05-17 07:15:12 +02:00
GuettliBot2 1c2bf08231 Merge branch 'main' into migrate-to-dagger 2026-05-17 06:29:04 +02:00
GuettliBot2 a8aa496b2e ci: simplify Base container and use surgical inclusion strategy 2026-05-17 06:28:32 +02:00
Thomas SharedInbox 130fbbe699 Revert "fix: run agent in TUI mode so tmux attach shows live progress (#118)"
This reverts commit 81fd03102b.
2026-05-17 06:24:45 +02:00
Thomas SharedInbox 5a59e7cec2 some gitignore 2026-05-17 06:23:58 +02:00
GuettliBot2 5ff994b9d0 ci: optimize Dagger pipeline and document stunnel connection 2026-05-17 00:02:41 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 81fd03102b fix: run agent in TUI mode so tmux attach shows live progress (#118)
Previously claude was launched with -p (print mode) which produces no
visible TUI.  Attaching to the session with `tmux attach -t issue-NNN`
showed a blank terminal.  Removing -p makes Claude run its interactive
TUI inside the tmux pane, so the session is fully watchable.

Add scripts/test_agent_loop.py covering _start_agent command
construction and state file round-trips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 23:26:58 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 606958e675 feat: sieve transpilation to intermediate rule-list with parser and interpreter (#117)
Implements a three-phase Sieve email filtering pipeline:
- Data models (SieveCondition, SieveAction, SieveRule) as sealed Dart classes
- SieveParser: converts RFC 5228 Sieve scripts to a flat SieveRule list,
  supporting if/elsif/else, allof/anyof, header/size/exists tests, and all
  common actions (fileinto, keep, discard, flag, mark)
- SieveInterpreter: evaluates compiled rules against a SieveEmailContext,
  tracking routing state in SieveExecutionContext with implicit keep behaviour
- 40 unit tests covering parser correctness and interpreter execution

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 22:55:46 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 7a3661dda4 fix: kill leftover stalwart process before starting integration tests
The CI self-hosted runner can leave a stalwart process alive from a prior
run that was interrupted externally, causing the next run to fail with
"port already in use". Kill any existing stalwart before starting a new one.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 22:04:35 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 ae3d849371 fix: use legacyPackages to silence system deprecation warning (#116)
Replace `import nixpkgs { inherit system; }` with the idiomatic flake
pattern `nixpkgs.legacyPackages.\${system}`, which avoids the evaluation
warning: 'system' has been renamed to/replaced by 'stdenv.hostPlatform.system'.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 21:42:49 +02:00
GuettliBot2 a2954ae812 ignore dagger certs 2026-05-16 20:04:15 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 de66081813 feat: save raw email to temp dir and add Share action to SnackBar (#115)
Save the .eml file to the temporary directory (reliable on all
platforms) and display a Share action in the SnackBar so users can
send the file to any app — including the Files app — which properly
registers it with Android's MediaStore and makes it visible in the
recently-used list.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 17:57:31 +02:00
GuettliBot2 1cb6d7f4ce Add DAGGER.md with infrastructure setup guide 2026-05-16 16:49:07 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 e327b42312 fix: close Raw Email dialog automatically after download (#114)
After a successful download, Navigator.pop is called so the dialog
dismisses without requiring a manual close. Adds a widget test that
verifies this using a fake PathProviderPlatform and IOOverrides so the
entire async chain runs as pure microtasks inside the Flutter test zone.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 13:32:22 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 651110b389 fix: do not show snackbar for stale undo actions on startup (#113)
Actions persisted to the database triggered a snackbar when the app
restarted. Added a 30-second recency check so only actions created in
the current session show the snackbar; added widget tests covering both
cases.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 09:23:49 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 0611323cfa fix: wrap QR codes in white Container to fix visibility in dark mode (#112)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 08:22:59 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 aeb4c5ab41 feat: improve About screen with labeled versions, dark mode, account counts, and bottom buttons (#111)
- Rename "Version" to "App Version"; rename "OS Version" to platform-prefixed label (e.g. "Android Version")
- Link app version to its Codeberg git commit (via GIT_HASH dart-define)
- Add "Dark Mode" yes/no row
- Add IMAP Accounts and JMAP Accounts rows
- Move copy/create-issue actions from AppBar icons to labeled buttons below the table
- Pass GIT_HASH dart-define in Taskfile APK/AAB build commands

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 08:03:13 +02:00