Initial commit: Grounded Flutter frontend
A to-do app that doesn't believe you — an enforcement layer rather than a
neutral ledger.
Architecture ported from Autoreceptives/Frontend/Receptive: stacked MVVM with
the mandatory 4-file screen pattern, one ParentViewModel owning the loading /
network / error overlays and the handleError decision tree, one AppDataManager
gateway, dio comms carrying the three identity headers, secure storage with
random-suffixed keys, and a single-chokepoint Navigator. Package root and Dart
package name are both Grounded; org is nya.
The enforcement engine, one unit per formula in utils/:
- DebtEngine w(class) x severity(d) x decay(t), sublinear severity so old
misses cannot swamp the score; abandonment 2x with 30-day
decay immunity; late complete retains 30%
- StandingEngine Good -> Warned -> Grounded -> Lockdown, derived not set;
Grounded replaces home with the overdue queue
- CapacityEngine blocks over-scheduling against p50 of historically completed
minutes, with a learned per-category estimation multiplier
- IntegrityEngine session integrity, weekly volume, plyometric contact ceiling
and enforced recovery gaps
- ExcuseAnalyser on-device excuse clustering plus the confrontation copy
- GuardrailEngine distress detection and rationed amnesty
- ToneEngine all enforcement copy, so the tone cap lives in one place
CommitmentEvent is append-only and is the source of truth rather than the
status field, which is what makes honest history and excuse analysis possible.
Goals contain commitments via parentId, and a task can be run from a
full-screen runner that derives elapsed time from wall-clock so screen-off
cannot lose time. Backgrounding pauses the clock and is counted. The runner is
mirrored into an ongoing notification, with alarm-class full-screen intents
reserved for non-negotiables.
Design language, fonts, icon and native splash are in place; Mason bricks are
retargeted to this project and verified end-to-end.
flutter analyze lib/ reports no errors.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mfu2gQLSFN21YRBcU2NrTt
This commit is contained in:
132
frontend/pubspec.yaml
Normal file
132
frontend/pubspec.yaml
Normal file
@@ -0,0 +1,132 @@
|
||||
name: Grounded
|
||||
description: Grounded — a to-do app that doesn't believe you.
|
||||
|
||||
publish_to: 'none'
|
||||
|
||||
version: 1.0.0+1
|
||||
|
||||
environment:
|
||||
sdk: ^3.6.2
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
cupertino_icons: ^1.0.2
|
||||
|
||||
# ── State management (MVVM) ─────────────────────────────────────────────
|
||||
stacked: ^3.5.0
|
||||
|
||||
# ── HTTP / env ──────────────────────────────────────────────────────────
|
||||
dio: ^5.7.0
|
||||
flutter_dotenv: ^6.0.1
|
||||
|
||||
# ── Secure storage ──────────────────────────────────────────────────────
|
||||
flutter_secure_storage: ^10.3.1
|
||||
shared_preferences: ^2.3.2
|
||||
|
||||
# ── Navigation ──────────────────────────────────────────────────────────
|
||||
page_transition: ^2.0.5
|
||||
|
||||
# ── Connectivity / device ───────────────────────────────────────────────
|
||||
connectivity_plus: ^7.1.1
|
||||
device_info_plus: ^12.4.0
|
||||
permission_handler: ^12.0.3
|
||||
path_provider: ^2.0.11
|
||||
uuid: ^4.5.1
|
||||
|
||||
# ── Proof capture (photo / timer / location) ────────────────────────────
|
||||
camera: ^0.12.0+1
|
||||
file_picker: ^11.0.2
|
||||
image: ^4.2.0
|
||||
geolocator: ^14.0.2
|
||||
|
||||
# ── Report card / charts ────────────────────────────────────────────────
|
||||
fl_chart: ^1.2.0
|
||||
|
||||
# ── Notifications ───────────────────────────────────────────────────────
|
||||
flutter_local_notifications: ^21.0.0
|
||||
local_notifier: ^0.1.6
|
||||
|
||||
# ── UI ──────────────────────────────────────────────────────────────────
|
||||
flutter_spinkit: ^5.1.0
|
||||
modal_bottom_sheet: ^3.0.0-pre
|
||||
smooth_page_indicator: ^2.0.1
|
||||
group_button: ^5.3.4
|
||||
pin_code_fields: ^9.3.0
|
||||
calendar_date_picker2: ^3.0.0
|
||||
photo_view: ^0.15.0
|
||||
flutter_animate: ^4.5.0
|
||||
vibration: ^3.1.2
|
||||
url_launcher: ^6.1.11
|
||||
intl: ^0.20.2
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
||||
flutter_lints: ^6.0.0
|
||||
|
||||
flutter_launcher_icons: ^0.14.4
|
||||
|
||||
flutter_native_splash: ^2.4.6
|
||||
|
||||
flutter:
|
||||
|
||||
uses-material-design: true
|
||||
|
||||
assets:
|
||||
- assets/
|
||||
- assets/icons/
|
||||
- assets/images/
|
||||
- .env
|
||||
|
||||
# General Sans (Fontshare, FFL) — see fonts/LICENSE-GeneralSans.txt
|
||||
fonts:
|
||||
|
||||
- family: GroundedBold
|
||||
fonts:
|
||||
- asset: fonts/bold.ttf
|
||||
|
||||
- family: GroundedLight
|
||||
fonts:
|
||||
- asset: fonts/light.ttf
|
||||
|
||||
- family: GroundedRegular
|
||||
fonts:
|
||||
- asset: fonts/regular.ttf
|
||||
|
||||
- family: GroundedMedium
|
||||
fonts:
|
||||
- asset: fonts/medium.ttf
|
||||
|
||||
# ── Launcher icon ─────────────────────────────────────────────────────────────
|
||||
flutter_launcher_icons:
|
||||
image_path: "assets/icons/icon.png"
|
||||
android: "ic_launcher"
|
||||
adaptive_icon_background: "#141414"
|
||||
adaptive_icon_foreground: "assets/icons/icon_foreground.png"
|
||||
min_sdk_android: 21
|
||||
ios: true
|
||||
remove_alpha_ios: true
|
||||
web:
|
||||
generate: true
|
||||
background_color: "#141414"
|
||||
theme_color: "#141414"
|
||||
windows:
|
||||
generate: true
|
||||
icon_size: 256
|
||||
|
||||
# ── Native splash ─────────────────────────────────────────────────────────────
|
||||
# The native splash matches the Flutter splash exactly, so the handover from
|
||||
# the OS screen to the app is invisible.
|
||||
flutter_native_splash:
|
||||
color: "#141414"
|
||||
image: "assets/icons/splash.png"
|
||||
android_12:
|
||||
color: "#141414"
|
||||
image: "assets/icons/icon_foreground.png"
|
||||
icon_background_color: "#141414"
|
||||
android: true
|
||||
ios: true
|
||||
web: true
|
||||
Reference in New Issue
Block a user