50 lines
1.5 KiB
Cheetah
50 lines
1.5 KiB
Cheetah
---
|
|
description: "Feature-First architecture conventions for {{PROJECT_NAME}}"
|
|
alwaysApply: true
|
|
---
|
|
|
|
# Feature-First Architecture — {{PROJECT_NAME}}
|
|
|
|
## Folder structure
|
|
```
|
|
lib/
|
|
features/
|
|
auth/
|
|
auth_screen.dart
|
|
auth_provider.dart (or auth_bloc.dart)
|
|
auth_repository.dart
|
|
auth_model.dart
|
|
widgets/
|
|
login_form.dart
|
|
social_login_button.dart
|
|
home/
|
|
home_screen.dart
|
|
home_provider.dart
|
|
...
|
|
core/
|
|
di/ ← Dependency injection setup
|
|
network/ ← HTTP client, interceptors
|
|
storage/ ← Local storage abstraction
|
|
widgets/ ← Shared widgets used by 3+ features
|
|
theme/ ← App theme, colors, text styles
|
|
routing/ ← Router config
|
|
shared/
|
|
models/ ← Models shared across features
|
|
utils/ ← Pure utility functions
|
|
```
|
|
|
|
## Import rules (STRICTLY ENFORCED by arch-guard hook)
|
|
{{ARCH_IMPORT_RULES}}
|
|
|
|
## Feature isolation rules
|
|
- A feature folder is self-contained: its own screen, state, model, repository
|
|
- Features MUST NOT import from other feature folders
|
|
- Shared code MUST be extracted to `core/` or `shared/` before sharing
|
|
- The 3-feature rule: if 3+ features need the same widget → move it to `core/widgets/`
|
|
|
|
## File naming within a feature
|
|
- `[feature]_screen.dart` — the main screen widget
|
|
- `[feature]_provider.dart` — Riverpod providers (or `[feature]_bloc.dart`)
|
|
- `[feature]_repository.dart` — data fetching + caching
|
|
- `[feature]_model.dart` — data model (Freezed or plain Dart)
|