architecture
Experto en arquitectura limpia modularizada por features. Genera código optimizado, archivos cortos, desacoplados y con cumplimiento estricto de reglas de linter (0 warnings).
Installation
Suivez les instructions du dépôt pour votre agent. Consultez les fichiers et dépendances avant l’installation.
Voir la source ↗GuidesInstructions
Responsabilidad Única
Definir la estructura del proyecto y patrones arquitectónicos. NO incluye UI/UX, lógica de negocio, ni optimizaciones de performance.
Estructura de Proyecto (Feature-First)
Para cada funcionalidad (feature_name), el agente debe organizar los archivos así:
lib/features/feature_name/
├── domain/
│ ├── entities/
│ ├── repositories/ (interfaces)
│ └── usecases/
├── data/
│ ├── models/
│ ├── datasources/
│ └── repositories/ (implementaciones)
└── presentation/
├── providers/ (Riverpod) o bloc/ (Bloc)
├── pages/
└── widgets/
Stack Técnico Core
State Management
- Riverpod: Preferido para nuevos features (Notifier API, AsyncNotifier)
- Bloc: Alternativa válida (extender de Equatable para optimizar comparación de estados)
Dependency Injection
-
GetIt: Registro manual de dependencias en archivo centralizado
service_locator.dart - Registrar como singleton, lazy singleton o factory según el caso
Navigation
- GoRouter: Routing declarativo con guards de autenticación
- Definir rutas en archivo centralizado
- Implementar Auth Guard usando Supabase Session
Error Handling
-
fpdart: Usar tipo
Either<Failure, Success>para manejo funcional de errores - Definir
Failureclasses en la capa Domain - Nunca usar
print()para errores, siempre retornarFailure
Modelado de Datos
-
Models (Data Layer): Incluir métodos
toEntity()yfromEntity() -
Entities (Domain Layer): Clases inmutables con
freezedoequatable - Separación estricta: Models manejan JSON, Entities son puros
Testing Strategy (TDD)
Workflow TDD
Para cada feature, seguir este orden:
- Escribir test del Use Case (usando Mocktail)
- Implementar Use Case para que el test pase
- Escribir test del Repository
- Implementar Repository
- Escribir test del Provider/Bloc
- Implementar Provider/Bloc
Tools
- Mocktail: Para mocks y stubs
- flutter_test: Testing framework
- integration_test: Para tests E2E
Mandamientos de Código
Inmutabilidad
- Todo widget debe usar
constsiempre que sea posible - Clases de estado deben ser inmutables (
finalfields) - Usar
freezedoequatablepara value objects
Atomicidad
- Máximo una clase principal por archivo
- Si un Widget es complejo (>60 líneas), extraerlo a
widgets/de la feature - Archivos cortos: 150-200 líneas máximo
- Priorizar composición sobre herencia
Cero Tolerancia a Warnings
- Tras generar o editar código, verificar que no existan warnings
- Lints, tipos faltantes, imports sin usar: TODO debe estar limpio
- Usar
analysis_options.yamlestricto
Organización de Imports
// 1. Dart core
import 'dart:async';
// 2. Flutter
import 'package:flutter/material.dart';
// 3. Packages externos
import 'package:riverpod/riverpod.dart';
// 4. Imports internos (features)
import 'package:vector/features/packages/domain/entities/package.dart';
Protocolo de Implementación
Al solicitar una nueva funcionalidad, el agente responderá en este orden:
- Entidad (Domain) - Definir la entidad core
- Interfaz del Repositorio (Domain) - Contrato del repositorio
- Casos de Uso (Domain) - Lógica de negocio pura
-
Modelo y DTOs (Data) - Mappers
toEntity/fromEntity - Implementación del Repositorio (Data) - Conexión con datasources
- Provider/Bloc (Presentation) - State management
- UI Atómica (Presentation) - Widgets pequeños y reutilizables
Reglas de Separación de Capas
Domain (Núcleo)
- ✅ Entities, Use Cases, Repository Interfaces
- ❌ PROHIBIDO: Importar Flutter, paquetes de terceros (excepto fpdart/equatable)
Data
- ✅ Models, DataSources, Repository Implementations
- ✅ Puede importar: Supabase, HTTP clients, JSON serialization
- ❌ PROHIBIDO: Importar Flutter widgets
Presentation
- ✅ Providers/Bloc, Pages, Widgets
- ✅ Puede importar: Flutter, Riverpod/Bloc, Domain entities
- ❌ PROHIBIDO: Importar Models de Data directamente
File Naming Conventions
-
Entities:
package.dart,delivery_route.dart -
Models:
package_model.dart,delivery_route_model.dart -
Repositories:
package_repository.dart(interface y implementation) -
Use Cases:
get_packages.dart,create_package.dart -
Providers:
package_provider.dart -
Screens:
packages_screen.dart,add_package_screen.dart -
Widgets:
package_card.dart,status_badge.dart
Ejemplo de Feature Completa
lib/features/packages/
├── domain/
│ ├── entities/
│ │ └── package.dart
│ ├── repositories/
│ │ └── package_repository.dart
│ └── usecases/
│ ├── get_packages.dart
│ └── create_package.dart
├── data/
│ ├── models/
│ │ └── package_model.dart
│ ├── datasources/
│ │ └── package_remote_datasource.dart
│ └── repositories/
│ └── package_repository_impl.dart
└── presentation/
├── providers/
│ └── package_provider.dart
├── pages/
│ └── packages_screen.dart
└── widgets/
└── package_card.dart
Exemples
Consultez les exemples du dépôt source.
Voir la source ↗Historique source
- Date d’indexation
- 2026-01-20
- Mise à jour de l’index
- 2026-01-26
- Branch
- main
Les dates concernent ce répertoire. Consultez le dépôt pour l’historique du code.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!