mirror of
https://github.com/kuhyx/utils.git
synced 2026-11-10 20:27:15 +01:00
`crdt_sync` is pure Dart so it can run from CLI tools and headless systemd jobs, which means it takes closures instead of depending on flutter_secure_storage and google_sign_in. Every Flutter app then wrote the same ~390 lines to supply them, and five apps ended up carrying near-identical copies of firebase_backend.dart. Those copies drifted. `todo` gained an opt-out flag and a seeded-session path that home_inventory and wake_alarm never received, so the same bug was fixed in one copy and left live in the others -- which is the actual cost being paid here, not the line count. This package owns that glue once: the keystore adapter, the persisted per-install device id, the account store and a one-call bootstrap. A new app needs a SyncApp const and `openSync(kApp)`. The wrapper routes are a parameter rather than a constant, because todo's copy hardcoded its own `~/.config/todo/firebase_auth.json`. An extraction only one app could adopt would be worse than the copies. Also documents what made this hard to find: crdt_sync_dart's README covered only the *old* GitHub transport and never mentioned the Firebase surface at all, and sync_settings_ui -- a complete drop-in settings screen -- had no README whatsoever. The five existing apps stay on their copies and on crdt_sync_dart-v0.10.0. Migration is forward-only and those fallbacks are load-bearing; converging them is a separate task, and the README says so. 35 tests, 100% line coverage, no suppressions. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CFSGeWxHPY5rHUGrPqhcmG
39 lines
993 B
YAML
39 lines
993 B
YAML
include: package:very_good_analysis/analysis_options.yaml
|
|
|
|
analyzer:
|
|
language:
|
|
strict-casts: true
|
|
strict-inference: true
|
|
strict-raw-types: true
|
|
errors:
|
|
# Promote key lints to errors so they fail CI, not just warn.
|
|
missing_required_param: error
|
|
unnecessary_null_comparison: error
|
|
dead_code: error
|
|
invalid_annotation_target: error
|
|
exclude:
|
|
- build/**
|
|
- "**/*.g.dart"
|
|
- "**/*.freezed.dart"
|
|
- "test/**"
|
|
- android/**
|
|
- ios/**
|
|
- web/**
|
|
- windows/**
|
|
- macos/**
|
|
- linux/**
|
|
|
|
linter:
|
|
rules:
|
|
# very_good_analysis enables most rules; add extras it doesn't include.
|
|
always_use_package_imports: true
|
|
avoid_print: true
|
|
avoid_relative_lib_imports: true
|
|
cancel_subscriptions: true
|
|
close_sinks: true
|
|
comment_references: false # conflicts with typical Flutter API docs style
|
|
directives_ordering: true
|
|
lines_longer_than_80_chars: true
|
|
public_member_api_docs: true
|
|
unawaited_futures: true
|