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
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
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
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-01-26
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!