Project initializer (melos run init) + Flutter 3.47.5, Melos 8, native upgrades - #122
Merged
Merged
Conversation
- .fvmrc 3.41.3 -> 3.47.5; packages require sdk ^3.13.0, flutter >=3.47.0 - Major bumps: get_it 9, go_router 18, permission_handler 13, package_info_plus 10, app_links 7, firebase_core 4, flutter_dotenv 6, equatable 3, flutter_lints 6 - flutter_dotenv 6: testLoad -> loadFromString in the EnvConfig tests - dio 5.9+: map DioExceptionType.transformTimeout (analyzer error on main) - lints 6 (strict_top_level_inference): add the missing getter types - flutter_web_plugins: import url_strategy.dart, the cross-platform entry point; the web-only library no longer compiles for mobile - Flutter 3.47's analysis_options migration: exclude build/platform dirs, and generated l10n code - dart format with the 3.13 language version (tall style) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…andards Android - Gradle 9.3.1, AGP 9.1.0, Kotlin 2.4.0, Java 17, AGP 9 compatibility flags (as generated by the Flutter 3.47 template); layout.buildDirectory - Fixes the build on main (Kotlin 1.8.22 was too old for the plugins) - compileSdk 37 (required by permission_handler 13), target 36, min 24 - Identity (applicationId, namespace, launcher label) now lives only in build.properties; the manifest label uses an appLabel placeholder - Release builds fall back to debug signing when key.properties is absent - Removed the deprecated manifest package attributes iOS - Deployment target 15.0 (Xcode 27 rejects 12/13, which broke every build) - CocoaPods removed (pod deintegrate): every plugin supports Swift Package Manager, Flutter's default; Flutter added its SPM integration - UIScene lifecycle migration performed by the Flutter tool - Identity in Flutter/AppIdentity.xcconfig (APP_BUNDLE_ID, APP_DISPLAY_NAME); every configuration derives bundle ID and display name from it - Fixed the flavor xcconfigs: wrong Generated.xcconfig include path, release Pods include in debug configs, Debug bundle ID applied .debug twice - PRODUCT_NAME is Runner again; version comes from pubspec only - Removed the stray root ios/Podfile Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- flutter_base.json records the repository state (template | initialized) and the identity currently written into the repository - tool/project_init: pure-Dart initializer (runs before melos bootstrap). Validates all input, plans every edit in memory, applies atomically with rollback, refuses to run twice (exit 3), supports --dry-run and prompts - Tests initialize a copy of the repository and fail on template drift - Melos 7 -> 8.9: exec scripts, dependsOn (test, verify, lint:all), noSelect, gen:l10n, pub:runner limited to build_runner users, run:web on dev flavor - CI: new ci.yml (format, analyze, test, Android build) for template and projects; SonarQube becomes project-only, gated on flutter_base.json - Template identity normalized to "RS Base" (web, l10n appName) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- docs/development/project-initialization.md: lifecycle, state detection, parameters, what init changes, manual steps, verification, toolchain - CLAUDE.md, README, module/testing/customization guides and known issues updated for Melos 8, Flutter 3.47, SPM and the initializer Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The package-name check only knew the dependencies listed in the workspace pubspecs, so names such as `bloc` (reached through flutter_bloc) or `meta` passed validation. Init then rewrote the project and marked it initialized, `melos bootstrap` failed version solving, and a re-run was refused. The initializer runs before bootstrap, when there is no pubspec.lock, so the resolved dependency graph is listed in resolved_packages.dart. A test fails when the lock gains a package the list is missing, and a lock that exists is read as well. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The README now covers the requirements, setting up a project (init, bootstrap, verify, manual steps), environments, running each flavor on iOS, Android and web, everyday Melos commands, release builds, CI and contributing to the template. It drops features that don't exist (the Gemini chat, RS-GPT-Review, Bitrise) and the stale compileSdk note, and known-issues #15 is updated to match. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Adds a template → project lifecycle, and upgrades the toolchain and native projects. This is easiest to review commit by commit:
Flutter 3.41.3 → 3.47.5 (Dart 3.11.1 → 3.13.4) and dependencies.
testLoad→loadFromString(flutter_dotenv 6).transformTimeoutcase (dio). This was an analyzer error onmain.url_strategy.dartimport. The web-only import doesn't compile for mobile on 3.47.Native projects.
android/build.propertiesandios/Flutter/AppIdentity.xcconfig.Project initializer and Melos 8.
flutter_base.jsonrecords the state (template|initialized).tool/project_initis a pure-Dart initializer:melos run init(prompts), ordart tool/project_init/bin/init.dart --name … --package-name … --bundle-id ….exec,dependsOn,verify,gen:l10n).ci.yml: format, analyze, test and an Android build, in the template and in projects.gatejob readsflutter_base.json, so it's skipped in the template and turns on afterinit.Docs.
docs/development/project-initialization.md: lifecycle, parameters, what init changes, manual steps, toolchain.Initializer fix: indirect dependency names.
bloc, reached through flutter_bloc, ormeta) used to pass validation.melos bootstrapthen failed, and the initializer refused to run again.tool/project_init/lib/src/resolved_packages.dart, and a test fails whenpubspec.lockgains a package the list is missing.README rewrite.
Issue
N/A
Preview
N/A (tooling / native)
Validation (local: macOS, Xcode 27, JDK 17)
main(Flutter 3.41.3): analyze failed, format failed (a test file from fix(common): make ResultType.mapError invoke its callback #118), and all native builds failed. The causes were Kotlin 1.8.22, iOS deployment targets below 15, and a broken include path inqa.xcconfig.melos run verifypasses: format, analyze across 5 packages, 27 tests.devandqaflavors; web.acme_field_notes/com.acme.fieldnotes), in a fresh copy:melos run.com.acme.fieldnotes(.debug/.qa)and the new name.Behavior changes to review
com.rs.base.debug.debug(.debugapplied twice). It's nowcom.rs.base.debug.version:is the single source.appName. Before, these wereflutter_base_rootstrap/ "Flutter Target".key.propertiesare signed with the debug key instead of failing.run:webuses the dev entrypoint.SONAR_URLsecret.sonar.testslists only directories that exist.sdkmanager "platforms;android-37.0".ci.ymlinstalls it.docs/architecture/known-issues.md(Define Arch #17–Define PR template for base project. #21). Among them:firebase_corepulls the entire Firebase iOS SDK while Firebase is never initialized, and lock files aren't committed.🤖 Generated with Claude Code