migrate
# Preview firstdart run stackchain migrate --state cubit --dry-run
# Applydart run stackchain migrate --state cubitdart run stackchain migrate --preset production_riverpoddart run stackchain migrate --routing go_router --di get_itOptions
Section titled “Options”| Flag | Values |
|---|---|
--architecture |
feature_first | clean | mvvm | mvc |
--state |
bloc | cubit | riverpod | provider | getx | rxdart |
--routing |
go_router | auto_route | navigator | getx |
--di |
get_it | injectable | getx |
--network |
dio | http |
--preset |
any preset ID |
--keep-old |
don’t delete old generated files/packages |
--dry-run |
preview only |
What changes
Section titled “What changes”| Area | Behavior |
|---|---|
| Presentation pages + state classes | Rewritten for the new API (Bloc → Cubit, etc.). // <stackchain:custom> is preserved and ported |
App shell (bootstrap, main, app.dart) |
Regenerated for the target stack (e.g. drops ProviderScope when leaving Riverpod) |
| Router / DI | State-only migrates: markers updated via sync — code outside markers stays. Routing/DI-type changes: full template refresh |
| Domain / data | Kept (unless architecture changes) |
| Packages | Target deps added; obsolete ones dropped (unless --keep-old) |
| Tests | Feature scaffolds refreshed; *_custom_test.dart never overwritten |
Honest limits
Section titled “Honest limits”- Do not put irreplaceable logic in
bootstrap.dart/main*.dart/app.dart— migrate rewrites those files for the new stack. - Put feature logic in
// <stackchain:custom>or your own unmarked files underdomain//data/. - After migrate, if anything looks stale:
dart run stackchain feature <name> --overwrite(pages refresh; custom regions stay).
- Commit first.
- Always
--dry-runonce. - Re-run
dart run stackchain test --allafter migrate if you want a full suite refresh.