focus-flow/apps/focus_flow_flutter/README.md

97 lines
2.9 KiB
Markdown

<!-- SPDX-FileCopyrightText: 2026 FocusFlow contributors -->
<!-- SPDX-License-Identifier: AGPL-3.0-only -->
# FocusFlow Flutter
Flutter desktop app target for the FocusFlow UI work.
## Current Scope
The app launches into the compact Today timeline. Normal startup now opens an
on-disk SQLite database and bootstraps owner settings plus the default Home
project when they are missing.
The compact Today screen can toggle completion for currently rendered task
cards. Backlog widgets and quick-capture controls exist for tests and focused
composition paths, but the sidebar Backlog navigation remains out of scope for
this screen.
## Runtime Data
Normal runtime uses `lib/app/persistent_scheduler_composition.dart`, which reads
`SCHEDULER_SQLITE_PATH` from a Dart define. If no define is present, it uses the
local dev convention:
```text
~/ADHD_Scheduler/scheduler.sqlite
```
Static demo data still lives in `lib/app/demo_scheduler_composition.dart`, but
it is for deterministic widget/visual tests and explicit demo composition only.
It is not inserted during normal startup.
Widgets consume `TodayScreenData` from `lib/models/today_screen_models.dart`.
Scheduler core remains the source of truth for task state and Today ordering.
## Package Boundary
Allowed app imports include public scheduler APIs such as:
```dart
import 'package:scheduler_core/scheduler_core.dart';
```
The persistent composition root may import
`package:scheduler_persistence_sqlite/sqlite.dart` and `dart:io` for runtime
path resolution. Widgets/controllers must not import scheduler `src/` files,
Drift, SQLite adapters, desktop notification implementations, backup/export
packages, or direct OS APIs. `test/forbidden_imports_test.dart` enforces that
boundary.
## Intentionally No-op
- Sidebar navigation.
- Date navigation and calendar buttons.
- Compact/Normal toggle.
- Settings button.
- Show upcoming.
- Timeline card action icons.
- Modal Push, Move to Backlog, and Break up buttons.
## Persistence Proof
Current focused tests prove:
- first run opens an empty SQLite file without seeded task rows,
- quick capture writes a backlog task,
- scheduling writes planned Today placement,
- done and not-done state persists,
- closing and reopening the same SQLite file reloads the task state.
Manual verification:
```sh
scripts/bootstrap_dev.sh
scripts/dev.sh --sqlite /tmp/focus_flow_persistence_plan_1.sqlite
```
Use the same `--sqlite` path after closing the app to confirm state persists. To
reset local dev data, close the app and delete the chosen `.sqlite` file. This is
only a dev reset; backup/restore UI remains out of scope.
## Commands
```sh
flutter pub get
flutter analyze
flutter test
```
Run these from `apps/focus_flow_flutter/`.
## Next Plans
- Wire visible Backlog navigation and quick-capture UI into the main shell.
- Wire functional Push, Move to Backlog, and Break up actions.
- Add real navigation/settings.
- Add Shield/Recovery only in a later scope.