# MoonWell Launcher Project Review

Reviewed on 2026-06-18.

## Overview

MoonWell Launcher is a Flutter desktop application for a private World of
Warcraft: Wrath of the Lich King server. Its core responsibilities are account
login, client installation/synchronization, news display, and launching
`Wow.exe`.

The project is already more than a Flutter template: it has a clear launcher
API contract, domain models for manifests and sessions, a sync use case,
installation scanning, logging, dependency injection, and tests around the
most important file verification behavior.

## Strong Points

- The project uses a readable layered structure: UI under `lib/app`, feature
  code under `lib/features`, and shared primitives under `lib/core`.
- Client sync is manifest driven and verifies downloaded files by size and
  SHA-256 before replacing local files.
- Local path handling normalizes manifest paths and rejects absolute paths or
  traversal attempts before resolving files under the selected installation
  directory.
- Player-generated or volatile client directories are excluded from
  verification: `Cache`, `Errors`, `Logs`, `Screenshots`, `WTF`, and launcher
  metadata.
- Hash caching is implemented as an optimization while keeping the server
  manifest as the source of truth.
- Sync diagnostics are written to `.moonwell_launcher/launcher.log`, and failed
  downloads can be preserved for inspection.
- The Web API integration is documented in `docs/launcher_web_api_spec.md`,
  including login, manifest, presigned download, news, pause/resume, and launch
  behavior.
- Tests cover deterministic build hash behavior, ignored directories, hash
  cache behavior, path traversal rejection, sync success, stale file removal,
  download verification failure, session restore, preferences, and news loading.

## Weak Points And Risks

- `README.md` was still the generated Flutter starter text before this review,
  so new contributors had no project-specific setup or operation guide.
- There was no `AGENTS.md`, so future automated or human contributors had to
  infer architecture, commands, and safety rules from source code.
- At initial review, `lib/main.dart` contained a large inactive demo
  `LauncherHome` implementation. This has since been removed from the active
  entrypoint.
- At initial review, several Russian UI strings appeared mojibake-encoded in
  the active login and home flow. These active strings have since been
  normalized to UTF-8.
- At initial review, custom title-bar widgets were duplicated between login and
  home screens. They have since been extracted into a shared widget.
- Session tokens were originally persisted through `shared_preferences`. They
  now use `flutter_secure_storage`, while `shared_preferences` remains limited
  to non-sensitive launcher preferences.
- The dependency injection output file `lib/service_container.config.dart` is
  committed, but the regeneration command was not previously documented.
- UI/widget/integration coverage is still light compared with the risk in login,
  bootstrap, directory selection, news failure handling, sync controls, and
  launch behavior.
- There is no visible CI configuration in the repository.
- The current working tree already had modified `pubspec.yaml` and
  `pubspec.lock` before this documentation pass. Those changes were not part of
  this review and should be preserved.

## Flutter 3.44.2 Upgrade Feasibility

Assumption: `3.44.2` means Flutter SDK `3.44.2`.

Current local indicators:

- `.fvmrc` is absent.
- `pubspec.yaml` declares Dart SDK `^3.9.0`.
- `pubspec.lock` declares Flutter SDK `>=3.38.0`.
- The project policy is latest stable Flutter SDK only; FVM-pinned workflows are
  not supported.
- The local shell now finds Flutter `3.44.2` on the stable channel.

Flutter `3.44.2` has been validated for dependency resolution, formatting,
analysis, and tests. A production-like Windows build smoke test remains open.

Recommended upgrade path:

1. Keep the latest stable Flutter SDK on PATH.
2. Run `flutter pub get`.
3. Regenerate dependency injection only if dependency resolution or generator
   output requires it:
   `dart run build_runner build --delete-conflicting-outputs`.
4. Run `flutter analyze`.
5. Run a Windows build smoke test:
   `flutter build windows --dart-define=MOONWELL_API_BASE_URL=https://host`.

## Recommended Refactoring Direction

- Keep secure session persistence covered by tests when login or session
  restore behavior changes.
- Add CI or a documented local verification workflow that runs analysis and a
  Windows build smoke test with the latest stable Flutter SDK.
