./scripts/setup.sh→ App name, bundle ID, API URL, environments configured
mason make feature --name [feature_name]→ Complete MVC + routes + state + tests + build
./scripts/run.sh [development|staging|production]./scripts/build.sh [environment] [apk|ios|web|...]Created automatically:
├── lib/features/profile/
│ ├── models/profile_models.dart ✅ Freezed models
│ ├── controllers/profile_actions.dart ✅ Redux CRUD actions
│ └── views/
│ ├── profile_screen.dart ✅ UI
│ ├── profile_connector.dart ✅ StoreConnector
│ └── profile_vm.dart ✅ ViewModel
Updated automatically:
├── lib/core/store/
│ ├── app_state.dart ✅ ProfileState added
│ └── substates/profile_state.dart ✅ Created
├── lib/core/router/app_router.dart ✅ Route + extensions
├── lib/core/constants/app_constants.dart ✅ API endpoints
└── test/profile_test.dart ✅ Unit tests
Generated automatically:
└── *.freezed.dart, *.g.dart ✅ build_runner ran
After mason make feature --name profile:
// Immediately available:
context.goToProfile(); // Navigate
context.pushProfile(); // Push
// Route URL:
// https://yourapp.com/profileAPI_BASE_URL=https://dev-api.yourapp.com
APP_ENV=development
ENABLE_LOGGING=trueAPI_BASE_URL=https://api.yourapp.com
APP_ENV=production
ENABLE_LOGGING=falseEnvConfig.apiBaseUrl
EnvConfig.isDevelopment
EnvConfig.enableLogging# Code generation
dart run build_runner build --delete-conflicting-outputs
# Watch mode
dart run build_runner watch --delete-conflicting-outputs
# Tests
flutter test
# Analyze
flutter analyze
# Clean
flutter clean && flutter pub getWhat Mason does for you:
- Create MVC structure
- Add Freezed models
- Create Redux actions
- Build UI components
- Create state file
- Update AppState
- Register routes
- Add navigation methods
- Add API endpoints
- Generate tests
- Run build_runner
- ✨ Everything compiles!
What you do:
- Customize models
- Implement UI
- Write business logic
- Ship features! 🚀
- Features:
snake_case(user_profile) - Files:
snake_case.dart - Classes:
PascalCase - Actions:
VerbNounAction - Routes:
/kebab-case - Methods:
camelCase()
- Always use Mason for features - It's faster and error-free
- Use environment scripts -
./scripts/run.sh development - Let build_runner run - Mason does it automatically
- Check generated tests - They're a great starting point
- Review DEVELOPMENT.md - Comprehensive dev guide
Check lib/core/router/app_router.dart for the route
Verify AppState includes your feature state
Run: dart run build_runner build --delete-conflicting-outputs
See: DEVELOPMENT.md for detailed guide
Keep this card handy! 📌