Skip to content

Latest commit

 

History

History
153 lines (122 loc) · 11.9 KB

CHANGELOG.md

File metadata and controls

153 lines (122 loc) · 11.9 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[2.1.0] - not yet released

  • Require Dart SDK ^3.13.0 and Flutter 3.47.4 (FVM pin; CI workflows aligned). Migrated constructors to the Dart 3.13 type-name-free new(...) form (unnecessary_type_name_in_constructor) and adopted very_good_analysis 11 with the new Dart 3.13 lints (use_declaring_parameters, initialize_in_field_declaration, async_return_with_no_await, etc.)
  • Regenerated the Android, iOS, macOS, Windows, Linux, and web platform folders from the Flutter 3.47.4 template and re-applied project customizations: Android moved to AGP 9.1 / Gradle 9.3.1 / Kotlin 2.4 / Java 17 with the APK naming ported to the AGP 9 Variant API; iOS uses a SceneDelegate subclass; macOS minimum deployment target raised from 10.15 to 12 (required by Flutter 3.47); Windows runner picked up the template's UTF-16 conversion fix; Linux GTK application id corrected to com.fs.fs_score_card
  • Updated dependencies (go_router 18, data_table_2 2.8, share_plus 13.3, very_good_analysis 11, and transitive bumps). data_table_2 3.0 requires migrating the app to the standalone material_ui package and is deferred to a later release
  • Added two trick-taking game modes with calculated bid/tricks scoring: Oh Hell (exact bid → 10 + bid, miss → 0) and Wizard (exact → 20 + 10×bid, miss → −10 per trick over/under). A bid/tricks round editor derives the round score; highest total wins. The round editor shows a note about a known limitation: a made 0-bid (bid 0, 0 tricks) currently scores 0. Localized in English, Spanish, and French. See docs/Game-Modes-Roadmap.md (Tier 1A)
  • Added four preset game modes: Rummy and Uno (suggested target 500), Farkle (suggested target 10,000; scores end in 0 or 5), and Rummikub (negative round scores allowed). Highest total wins; localized mode names in English, Spanish, and French. See docs/Game-Modes-Roadmap.md (Tier 3)
  • Added two low-score-wins game modes: Golf (offers 9 or 18 rounds, defaults to 18; lowest total wins) and Hearts (lowest total wins, with a suggested loser threshold of 100 that ends the game when a player crosses it). The current leader is marked in the score table, and both modes are localized in English, Spanish, and French. See docs/Game-Modes-Roadmap.md (Tier 2)
  • Restructured docs/ to the Diátaxis framework — one quadrant (tutorial / how-to / reference / explanation) per file, tagged in front matter; split mixed docs into How-To-Edit-Scores.md, How-To-Riverpod.md, State-Reference.md, and Live-Sync-Architecture.md; design, spec, and planning docs excluded
  • Added the fs-game-score-docs-diataxis project skill to classify, audit, and author docs against the Diátaxis quadrants
  • Added a Prettier Markdown formatting toolchain (.prettierrc.json, npm run format:md / check:md, Markdown Format CI workflow); vendored dart-* / flutter-* / fs-game-score-release-flutter-upgrade-sdk skills excluded to stay byte-identical to upstream
  • Added first pass machine generated localization
  • Localized hard coded live view UI strings missed in previous release
  • Localized hard coded semantics strings
  • Added Claude Code support linking the existing to directories picked up by claude

[2.0.0] - 2026-05-25

  • Host live games on Android and iOS from the in-game app bar (Live share): local WebSocket server, mDNS advertisement, QR code, and copyable connection URL with session PIN
  • Join a live game from the splash screen: browse hosts on the same Wi-Fi, scan the host QR code, or enter a ws:// URL manually in debug builds
  • Spectator read-only score table with connection status banner; scores update as the host plays (no editing, no persistence on the spectator device)
  • Admission requires matching 6-digit PIN and the same app build version on host and spectator (PackageInfo version, e.g. 1.12.0+236)
  • Privacy policy updated for LAN discovery and local network use on mobile
  • Replace player-state save debounce with coalesced single-flight persist in PlayersNotifier (better crash recovery, serialized writes)
  • Rework Riverpod to follow recommended practices: sharedPreferencesProvider, repository providers, and separate gameSyncHostProvider / gameSyncSpectatorProvider for live sync (see docs/Game-Sync.md)
  • Use Player as an immutable data object
  • Require Dart SDK ^3.12.0 and Flutter 3.44.0 (FVM pin; CI workflows aligned)
  • Migrated to Swift Dependency Package Manager and removed Cocoapods dependencies
  • Updated dependencies to support Flutter 3.41.2 and Dart 3.11.0 (including bonsoir, shelf WebSocket, QR, and mobile scanner for live sync)
  • Unit tests for live sync protocol, snapshot mapper, QR URL parsing, and platform capability flags
  • Fixed Android Gradle Kotlin plugin application so the bonsoir Android library builds correctly
  • Fixed live share host dialog crash when the QR code was placed in a scrollable AlertDialog (intrinsic dimension error)
  • Fixed Android CI integration test race where pumpAndSettle could run before the splash screen mounted
  • Added AGENTS.md for AI agent guidance; expanded docs/State-Management.md and added docs/Game-Sync.md
  • Added Google Flutter Skills and dart-lang skills; project skills for live sync and testing workflow
  • Updated Cursor rules; added Antigravity rules; removed continue.dev rules

[1.11.0] - 2026-03-14

  • Support for negative scores in the round score editor when in General Scoring mode
  • Miles field receives focus automatically when the round editor modal opens in French Driving mode
  • Auto set the scoring filter based on the game mode
  • Added validation to the round score editor to prevent invalid scores from being entered and show an error message if the score is invalid
  • Added an integration test to verify that entering negative scores works correctly and deducts from the total
  • Fixed a bug where returning to the splash screen from French car racing mode would reset the game mode to Standard
  • Added skyjo game type and made it support negative numbers. Standard went back to positive only
  • Add trademark disclaimer in an about panel and app bar on the splash screen
  • Resolved race condition between async repository prefs loading and Riverpod provider initialization. Repositories (GameRepository, PlayersRepository) now accept a ProviderContainer via initialize() and push loaded state directly into their respective notifiers (repositoryDidLoadPrefs) instead of relying on notifier build() to poll a cached field. main() creates the container before loading prefs and exposes it to the widget tree via UncontrolledProviderScope.

[1.10.0] - 2026-02-24

  • Phases couldn't be selected after round 10 - max phase and max number of rounds were used interchangeably

[1.9.0] - 2026-02-05

  • Load previous game on startup if it is in Stored Preferences and jump immediately to the game. This supports accidental web reloads and mobile apps that are suspended and resumed suspended/rehydrated
  • Save the game state to disk with a 5 second delay to prevent excessive writes.
  • Split the GameConfiguration from the Game model to segregate a game instance from its configuration.
  • Added French Driving game mode
  • Released 1.9.0 into app store

[1.8.0] - 2025-12-28

  • Close modal panels on return key in model panel entry fields on non Android and non iOS.
  • Move from Navigator to goRouter.
  • Load prefs on startup blocking until loading complete if they exist.
  • Player name editor highlights name when modal alert editor is made visible.
  • Moved prefs code to GameRepository and added new game button test
  • Moved all integration test to single file so can run all with single command in GitHub Actions
  • Added GitHub action that runs the integration tests on Windows, macOS and iOS, Android. See README.md for status

[1.7.0] - 2025-12-25

  • Landscape SplashScreen layout changed to better support wide screens. Two columns are now the center two of 4 columns.
  • Added I10n Internationalization / Localization English first pass
  • Added I10n Internalionalization / Localization Spanish first pass
  • iPad iOS 26.1 fix broke integration tests because it ignored 0,0 offset taps.
  • Released 1.7.0 into app store

[1.6.0] - 2025-12-24

1.6.0 only exists for iOS to fix iOS 26.1 related Flutter app bar (top of window) click issue mentioned below

  • Updated Flutter to dart 3.9 or later to support built in dart mcp server https://docs.flutter.dev/install/archivecirsp
  • Building with Flutter 3.38.5 which is current at time of update
  • Migrated from standard linter to VGV linter
  • Added .cursor/rules/flutter-recommended/RULE.md and .github/copilot-instructions.md based on Flutter recommended ai rules
  • Removed unecessary Semantics instead relying on semanticLabel were available
  • Migrated to Flutter Navigation and routes
  • Migrated to fvm for flutter version management
  • Replace hard coded font size with ThemeData
  • Remove classes orphaned by AI and no longer referenced.
  • Added new property for game finished. Players who have finished have their names bolded in the score sheet.
  • Tap error on new game buttons in app bar on iPad only introduced with iOS 26.1 flutter/flutter#175606 (comment)

[1.5.0] - 2025-10-21

  • gameId for new games - not for restarts
  • moved from in-cell editing to editing in a modal panel without a close button
  • round cell editing dialog changes orientation based on device orientation
  • player name cell editing dialog changes orientation based on the device orientation
  • recast all the field key properties to same format to simplify testing
  • added cursor rules
  • tests and views now share ValueKey definitions implemented as static functions in the views. Simplifies tests but loses any Key drift (should not be issue because keys are only used internally)
  • tweaked name display behavior to avoid overflow - use elipses
  • Light/Dark test switch only in debug mode.
  • Created new them using flex color scheme
  • Added ITSAppUsesNonExemptEncryption : No to macos and ios info.plist using XCode.
  • Added sharePositionOrigin after testing on ipad 16.7. Threw exception without it.
  • Added hyperlinks to Joe's LinkedIn and this GitHub repository
  • Added no data collection privacy policy
  • Submitted to the app store
  • published to github.io as GitHub pages https://freemansoft.github.io/freemans-score-card/

[1.4.0] -- 2025-09-21

  • upgrade gradle plugin from 8.5.0 to 8.6.2 and kotlin from 1.8.22 to 2.2.0
  • migrated from Riverpod 2 to Riverpod 3
  • icons set using flutter_launcher_icons for android,ios,macos,linux,web

[1.3.0] - 2025-08-10

  • Score filter configuration option to restrict entry to numbers ending in 0 and 5
  • Real-time validation for score entry fields

[1.2.0] - 2025-08-09

  • Ability to share CSV via device share functionality
  • Share button in app bar with platform-specific icons (iOS share icon on macOS/iOS)
  • CSV export with quoted player names for comma handling
  • Share functionality with title and subject including date/time

[1.1.0] - 2024-08-04

  • Save/load last game configuration
  • Persistent game state using SharedPreferences
  • Automatic game state restoration on app restart

[1.0.0] - 2024-12-19

  • Initial release
  • Basic score tracking functionality
  • Player management
  • Round-based scoring system
  • Data table interface
  • Game reset functionality