version: "3" silent: true tasks: default: desc: Run all checks (analyze + unit tests + widget tests + integration, in parallel) deps: [check] _preflight: internal: true run: once preconditions: - sh: test "${DIRENV_DIR#-}" = "{{.TASKFILE_DIR}}" msg: "Not in nix dev shell. Run: nix develop" cmds: - scripts/silent_on_success.sh pre-commit install _flutter-check: internal: true run: once deps: [_preflight] cmds: - cmd: scripts/silent_on_success.sh fvm install --skip-pub-get - cmd: scripts/silent_on_success.sh fvm use --skip-pub-get setup: desc: Fully set up the dev environment (FVM, pub get, codegen, hooks) deps: [_preflight, _codegen] cmds: - echo "Setup complete." _pub-get: internal: true run: once deps: [_flutter-check] cmds: - scripts/silent_on_success.sh fvm flutter pub get --suppress-analytics _linux-deps-check: internal: true run: once preconditions: - sh: command -v clang >/dev/null 2>&1 msg: "Linux desktop deps missing. Run: sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev libstdc++-12-dev" - sh: pkg-config --exists gtk+-3.0 2>/dev/null msg: "Linux desktop deps missing. Run: sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev libstdc++-12-dev" install-hooks: desc: Install pre-commit hooks (requires pre-commit; see .pre-commit-config.yaml) cmds: - pre-commit install _codegen: internal: true run: once deps: [_pub-get] cmds: - scripts/silent_on_success.sh fvm flutter pub run build_runner build --delete-conflicting-outputs codegen: desc: Generate Drift DB code (run after any schema change) deps: [_preflight, _pub-get] cmds: - fvm flutter pub run build_runner build --delete-conflicting-outputs analyze: desc: Static analysis (flutter analyze) deps: [_preflight, _codegen] cmds: - scripts/run_analyze.sh format: desc: Format all Dart source files deps: [_preflight] cmds: - fvm dart format . analyze-fix: desc: Auto-fix lint issues with dart fix --apply deps: [_preflight] cmds: - fvm dart fix --apply test: desc: Unit tests + coverage gate (fails if any non-excluded lib/ file is missing) deps: [_preflight, _codegen] cmds: - scripts/run_unit_tests.sh test-widget: desc: Widget tests — headless, no display or network required deps: [_preflight, _codegen] cmds: - scripts/run_widget_tests.sh test-flutter: desc: Full Flutter test suite (unit + widget + integration) deps: [_preflight] cmds: - fvm flutter test integration: desc: Integration tests against a local Stalwart mail server deps: [_flutter-check] cmds: - stalwart-dev/test.sh integration-ui: desc: UI E2E tests on Linux via Xvfb — headless, no emulator needed deps: [_preflight, _linux-deps-check, _pub-get] cmds: - stalwart-dev/integration_ui_test.sh integration-android: desc: UI integration tests on a connected Android emulator (Stalwart on host, emulator reaches it via 10.0.2.2) deps: [_preflight, _android-sdk-check, _android-avd-setup] cmds: - stalwart-dev/integration_android_test.sh build-linux: desc: Build the Linux desktop app (debug) deps: [_preflight, _linux-deps-check, _codegen] cmds: - scripts/silent_on_success.sh fvm flutter build linux --debug --no-pub _android-avd-setup: internal: true run: once status: - test -f "${ANDROID_HOME:-$HOME/Android/Sdk}/emulator/emulator" - test -d "$HOME/.android/avd/sharedinbox_test.avd" cmds: - cmd: | SDK="${ANDROID_HOME:-$HOME/Android/Sdk}" SDKMANAGER="$SDK/cmdline-tools/latest/bin/sdkmanager" AVDMANAGER="$SDK/cmdline-tools/latest/bin/avdmanager" yes | "$SDKMANAGER" --licenses >/dev/null 2>&1 || true "$SDKMANAGER" "emulator" "system-images;android-34;google_apis;x86_64" echo no | "$AVDMANAGER" create avd \ --name sharedinbox_test \ --package "system-images;android-34;google_apis;x86_64" \ --device pixel_4 \ --force _android-sdk-check: internal: true run: once preconditions: - sh: test -d "${ANDROID_HOME:-$HOME/Android/Sdk}" msg: | Android SDK not found. Install it with: wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O /tmp/cmdtools.zip mkdir -p ~/Android/Sdk/cmdline-tools unzip /tmp/cmdtools.zip -d ~/Android/Sdk/cmdline-tools mv ~/Android/Sdk/cmdline-tools/cmdline-tools ~/Android/Sdk/cmdline-tools/latest ~/Android/Sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" "build-tools;34.0.0" "platforms;android-34" - sh: ls "${ANDROID_HOME:-$HOME/Android/Sdk}/platforms/" 2>/dev/null | grep -qE '^android-([3-9][4-9]|[4-9][0-9]|[1-9][0-9]{2,})$' msg: | Android platform 34 or higher not found. Install it with: ${ANDROID_HOME:-$HOME/Android/Sdk}/cmdline-tools/latest/bin/sdkmanager "build-tools;34.0.0" "platforms;android-34" build-android: desc: Build a release APK deps: [_preflight, _android-sdk-check, _pub-get] cmds: - ANDROID_HOME=${ANDROID_HOME:-$HOME/Android/Sdk} fvm flutter build apk --release --no-pub | grep -Ev "was tree-shaken|Tree-shaking can be disabled" deploy-android: desc: Build release APK and upload via scp to $ANDROID_APK_SCP_USER@$ANDROID_APK_SCP_HOST:$ANDROID_APK_SCP_PATH deps: [check, build-android] dotenv: [".env"] cmds: # integration-android runs after check (not in parallel) so the two E2E # test suites don't compete for CPU and slow the Android emulator. - task: integration-android - scripts/deploy_android.sh run: desc: Run the app on Linux desktop deps: [_preflight, _linux-deps-check, _pub-get] cmds: - fvm flutter run -d linux --no-pub run-android: desc: Run the app on a connected Android emulator (boots sharedinbox_test AVD if needed) deps: [_preflight, _android-sdk-check, _android-avd-setup, _pub-get] cmds: - stalwart-dev/run_android.sh coverage: desc: Coverage gate — run after test (and optionally integration) have written lcov.info deps: [_preflight] cmds: - fvm dart run scripts/check_coverage.dart check-fast: desc: Pre-commit checks — analyze + unit tests + widget tests (no build, no integration) deps: [analyze, test, test-widget] _integrations: internal: true run: once deps: [integration, integration-ui] check: desc: Full check suite — unit tests first, then integration (merges coverage), then gate deps: [analyze, test-widget, build-linux, test] cmds: - task: _integrations - task: coverage