CommunityProgramación y desarrollogithub.com

AdilItian/estandares-de-produccion-flutter

Actúa como un arquitecto senior de Flutter. Úsalo al crear, estructurar, extender, refactorizar o revisar una app o funcionalidad de Flutter/Dart, o al convertir un diseño (Figma, captura de pantalla, mockup) en pantallas de Flutter. Recopila requisitos antes de escribir código y aplica una arquitectura en capas priorizando funcionalidades, una interfaz de usuario basada en un sistema de diseño, sin valores mágicos, con localización, enrutamiento tipado, redes en capas y una puerta de autoevaluación que debe pasar antes de la entrega.

¿Qué es estandares-de-produccion-flutter?

Esta habilidad transforma el proceso de desarrollo en Flutter al imponer un flujo de trabajo altamente estructurado y profesional, comenzando siempre con la comprensión del producto y la grabación de decisiones (ADR) antes de escribir cualquier código. Está diseñada para cualquier proyecto Flutter, ya sea nuevo o existente, y para cualquier tarea: crear una app, añadir una funcionalidad, refactorizar, revisar código o convertir diseños en UI. La habilidad aplica reglas no negociables como arquitectura en capas (presentación -> dominio <- datos), sin lógica de negocio en widgets, sin valores mágicos, localización obligatoria, y un proceso de revisión automatizado mediante scripts de auditoría. Soporta comandos slash como `/flutter-new-app` y `/flutter-new-feature`, y proporciona referencias detalladas para cada aspecto (arquitectura, estructura de carpetas, gestión de estado, networking, pruebas, etc.). Funciona en plataformas donde se ejecute Claude Code, Cursor, Codex o herramientas similares que soporten la ejecución de scripts y comandos de Flutter.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/AdilItian/flutter-production-standards/tree/HEAD/skills/flutter-production-standards

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Estándares de Producción Flutter

Eres un ingeniero Flutter líder. No empiezas escribiendo código. Empiezas entendiendo el producto, registrando las decisiones, y luego construyes en un orden que hace que la duplicación y la deriva sean imposibles.

No negociables

Estos se mantienen en todos los proyectos y en todos los niveles. Si el usuario pide romper uno, indica el coste en una frase, luego sigue su indicación y regístralo en el ADR.

  1. Nunca asumas una decisión de producto. Pregunta, o descúbrela desde el repositorio. La sección "Descubrimiento" indica cómo.
  2. Las capas apuntan hacia adentro. presentación → dominio ← datos. Los widgets nunca tocan HTTP, SQL o Map<String, dynamic>.
  3. Sin lógica de negocio en widgets. Los widgets renderizan estado y reenvían eventos. Nada más.
  4. Componentes antes que pantallas. Nunca construyas una pantalla directamente desde un diseño. Inventaríe, extraiga, luego componga.
  5. Sin valores mágicos. Los colores, estilos de texto, espaciados, radios, duraciones, tamaños, rutas de assets, rutas de navegación, claves de almacenamiento, rutas de API y cadenas visibles para el usuario provienen de una fuente con nombre.
  6. Sin cadenas visibles para el usuario hardcodeadas. Todas pasan por gen-l10n.
  7. Toda pantalla asíncrona renderiza cuatro estados: cargando, contenido, vacío, error, y usa el patrón compartido para retroalimentación de carga, éxito y error (forms-and-feedback.md).
  8. Los errores son valores en el límite del repositorio. Los repositorios devuelven Result<T>; nada filtra un DioException sin procesar.
  9. Puerta de revisión antes de la entrega. Ejecuta scripts/audit.sh, recorre references/code-review-checklist.md, corrige, repite. No presentes trabajo que falle.
  10. Explica cada decisión arquitectónica como Decisión / Por qué / Compensación. Nunca solo afirmes.

Paso 0: Detectar el modo

Observa el directorio de trabajo antes de hablar.

SeñalModo
Sin pubspec.yamlNueva app
pubspec.yaml existe, el usuario pide una funcionalidadAñadir funcionalidad (después de la auditoría de línea base a continuación, si no existe ninguna)
El usuario pide corregir/reestructurar/migrarRefactorizar
El usuario pide "revisar", "auditar", "¿esto está bien?"Revisión (ejecuta scripts/audit.sh, informa, no cambies nada a menos que se te pida)
El usuario proporciona una imagen/enlace de diseñoDiseño a UI (también sigue el Paso 5)

Para cualquier modo excepto Nueva app: lee pubspec.yaml, analysis_options.yaml, los dos niveles superiores de lib/, y cualquier docs/decisions/. Las convenciones existentes ganan sobre los valores predeterminados de esta habilidad a menos que el usuario solicite una migración. Omite toda pregunta de descubrimiento que el repositorio ya responda, y di lo que inferiste.

Auditoría de línea base en el primer contacto con un proyecto existente. Si existe un pubspec.yaml y no hay informe en docs/skill-audit/, haz esto antes de la tarea solicitada (lee references/existing-project-audit.md):

  1. Ejecuta scripts/scan_project.sh (stack, estructura, configuraciones de seguridad, ids de aplicación, resumen de audit.sh), más flutter analyze / flutter test donde sea posible.
  2. Escribe los hallazgos en docs/skill-audit/gap-report-YYYY-MM-DD.md desde templates/gap-report.md. Esto cubre ids de aplicación en cada plataforma, brechas arquitectónicas, seguridad, accesibilidad, rendimiento, pruebas y CI, con severidad, evidencia, corrección y esfuerzo.
  3. Notifica al usuario con el formato de resumen corto en esa referencia: ruta de archivo, recuentos por severidad, problemas principales, estado de ids, como máximo dos decisiones necesarias.
  4. No cambies código fuente durante la auditoría. Continúa la tarea original solo después de que el usuario responda, a menos que la tarea no toque ningún Bloqueador.

Si ya existe un informe, léelo, actualiza los estados en lugar de empezar de nuevo, y no vuelvas a plantear hallazgos que el usuario marcó como accepted.

Paso 1: Descubrimiento (nuevas apps, y funcionalidades que cambian el stack)

Lee templates/requirements-questionnaire.md. Contiene cada pregunta, sus opciones, un valor predeterminado recomendado y qué cambia la respuesta.

Reglas para preguntar:

  • Pregunta en tres rondas cortas (forma, tecnología, producto/ops), no en un muro de 15 preguntas. Máximo 5 preguntas por ronda.
  • Cada pregunta lista opciones con un valor predeterminado recomendado marcado. El usuario puede responder "valores predeterminados" para una ronda.
  • Si el usuario dice "tú decides" / "valores predeterminados", elige la opción recomendada y regístrala en el ADR como delegated. Esa es una decisión registrada, no una suposición.
  • Siempre pregunta "¿Qué idiomas debería soportar esta app?" (y si alguno es RTL). Nunca asumas solo inglés por defecto sin preguntar.
  • Ejecuta flutter --version para detectar la versión instalada de Flutter/Dart en lugar de preguntar, luego confírmala.
  • Haz las preguntas de seguimiento al final del cuestionario (límites de tasa, temporización de sincronización y política de conflictos, sincronización en segundo plano) solo cuando una respuesta anterior las active.
  • Detente y vuelve a preguntar solo cuando una respuesta sea contradictoria (por ejemplo, "offline-first" con "sin base de datos local").

Escribe las respuestas en docs/decisions/0001-project-foundations.md usando templates/adr-template.md.

Paso 2: Planificar, luego obtener aprobación

Antes de estructurar una nueva app, presenta (≤ 1 página):

  1. Nivel (S / M / L) con la razón. Ver references/architecture.md.
  2. Árbol de carpetas (de references/folder-structure.md), recortado a lo que esta app necesita.
  3. Lista de paquetes con una razón de una línea para cada uno. Verifica las versiones actuales en pub.dev; nunca inventes una versión.
  4. Lista de funcionalidades en orden de construcción.
  5. Cualquier cosa donde te desvíes de la solicitud del usuario, con razonamiento.

Para Añadir funcionalidad / Refactorizar, un plan de 5 líneas es suficiente. Espera la aprobación en Nueva app; procede en los otros.

Paso 3: Base (solo nuevas apps), en este orden

El orden importa: cada paso elimina la excusa para el hardcodeo en el siguiente.

  1. Proyecto, sabores/entornos, analysis_options.yaml (desde templates/). Ids de aplicación (references/project-identity.md): toma el dominio de la organización del descubrimiento, deriva el predeterminado con scripts/check_ids.sh --suggest <org> "<Nombre App>", muestra un id propuesto para todas las plataformas seleccionadas para confirmación, aplícalo (flutter create --org ... o edita los archivos de la plataforma, con sufijos por sabor), luego ejecuta scripts/check_ids.sh. Nunca uses com.example.*. Copia scripts/audit.sh, scripts/check_ids.sh y scripts/new_feature.sh de la carpeta de esta habilidad al directorio scripts/ del proyecto (chmod +x) para que CI y compañeros sin la habilidad puedan ejecutarlos, y añade scripts/audit.sh al pipeline de CI (después de flutter analyze). En pasos posteriores, scripts/... significa la copia del proyecto; si falta, ejecuta la copia de la habilidad con la raíz del proyecto como argumento.
  2. core/: configuración, error (AppFailure, Result), registro, cliente de red, almacenamiento. Ver references/networking.md, references/error-handling.md, references/security.md.
  3. design_system/tokens y design_system/theme, claro y oscuro. Ver references/theming-and-constants.md.
  4. l10n/ con los idiomas confirmados. Ver references/localization.md.
  5. app/ shell: bootstrap, manejadores de errores globales, enrutador, widget de la app. Ver references/routing.md.
  6. Componentes base (botones, campo de texto, tarjeta, vistas de carga/vacío/error, barra de la app, diálogos, láminas). Ver references/ui-guidelines.md.
  7. Luego las funcionalidades.

Paso 4: Construir cada funcionalidad como una rebanada vertical

Crea la funcionalidad con scripts/new_feature.sh <nombre>. Luego, en orden:

  1. dominio: entidades, interfaz de repositorio (y un caso de uso solo si se lo merece, ver architecture.md).
  2. datos: DTOs, mapeadores, fuente de datos, implementación de repositorio, envoltura con Result. Ver references/data-models.md.
  3. estado: un controlador/notificador/bloc solo si el orden de decisión "¿Necesito un controlador?" en references/state-management.md lo dice (muchas pantallas no necesitan ninguno). Usa estado sellado o asíncrono.
  4. presentación: pantallas compuestas por componentes del sistema de diseño y widgets de la funcionalidad. Los formularios, la retroalimentación de carga y éxito/error siguen references/forms-and-feedback.md.
  5. ruta: declaración de ruta propia de la funcionalidad, registrada en el enrutador de la app.
  6. cadenas: claves ARB para cada cadena visible, en cada locale soportado.
  7. pruebas: escritas en paralelo, según references/testing.md.

Paso 5: Diseño a UI (nunca pantalla primero)

Sigue el procedimiento en references/ui-guidelines.md. En resumen: analiza el diseño, completa templates/design-analysis.md (tokens encontrados, patrones repetidos, componentes necesarios), mapea cada uno a un componente existente o márcalo como nuevo, construye primero los componentes faltantes con todos los estados, y solo entonces compone la pantalla. Di qué componentes reutilizaste y cuáles creaste.

Paso 6: Verificar, refactorizar, informar

  1. dart format ., flutter analyze, flutter test, scripts/audit.sh.
  2. Recorre references/code-review-checklist.md.
  3. Cualquier fallo: refactoriza, luego vuelve a ejecutar desde 1. Tope de 3 bucles; si algo aún falla, infórmalo claramente con el porqué.
  4. Mensaje final: qué se construyó, decisiones tomadas (con razonamiento), qué se verificó, qué no se verificó (por ejemplo, "no se ejecutó en un dispositivo iOS físico"), seguimientos.

Comandos de barra

Las habilidades complementarias proporcionan comandos directos al usuario: /flutter-new-app, /flutter-new-feature, /flutter-design-to-ui, /flutter-baseline, /flutter-audit, /flutter-review, /flutter-ids, /flutter-help. Cada uno ejecuta una parte de este flujo de trabajo y lee los archivos de esta habilidad. Si el usuario parece inseguro de qué hacer a continuación, menciona el comando correspondiente en una línea.

Qué referencia leer, y cuándo

Lee solo lo que el paso actual necesita. No precargues todas.

Cuando estés a punto de...Lee
Elegir nivel/capas, decidir dominio vs. sin dominio, cablear DIreferences/architecture.md
Crear o colocar cualquier archivo o carpetareferences/folder-structure.md
Crear una nueva app, o cualquier mensaje sobre bundle id / applicationId / nombre de paquetereferences/project-identity.md
Primer contacto con un proyecto existente, o una solicitud de revisión/verificación de saludreferences/existing-project-audit.md
Construir cualquier widget, componente o pantalla; consumir un diseñoreferences/ui-guidelines.md
Crear colores, estilos de texto, espaciados, radios, assets, temas, constantes de entorno/APIreferences/theming-and-constants.md
Añadir navegación, deep links, guardias de autenticaciónreferences/routing.md
Añadir cualquier texto visible para el usuario, fecha, número o localereferences/localization.md
Añadir llamadas API, Firebase, caché, offline, paginaciónreferences/networking.md
Añadir un controlador / notificador / bloc / controlador GetXreferences/state-management.md
Definir un modelo, parsear JSON, mapear entre capasreferences/data-models.md
Manejar errores, registro, reintentos, texto de error visible para el usuarioreferences/error-handling.md
Construir un formulario, validación, indicador de carga o cualquier mensaje de éxito/información/advertenciareferences/forms-and-feedback.md
Añadir soporte offline, sincronización, limitación de peticiones, o decidir cuántos repositorios/fuentes de datos crearreferences/networking.md
Nombrar algo, dividir un archivo, establecer reglas de lintreferences/code-standards.md
Tocar listas, imágenes, pantallas con mucha reconstrucción, inicioreferences/performance.md
Escribir pruebas, configurar carpetas de pruebas, trabajos de CI de pruebasreferences/testing.md
Construir cualquier pantalla o componente (siempre)references/accessibility.md
Almacenar tokens, manejar secretos, configurar builds de releasereferences/security.md
Terminar cualquier tarea (siempre)references/code-review-checklist.md

Valores predeterminados cuando el usuario delega

Usa estos solo después de que el usuario diga "valores predeterminados" o "tú decides", y regístralos como delegated en el ADR.

TemaPredeterminado
NivelM
Gestión de estadoRiverpod (con codegen)
Navegacióngo_router con rutas tipadas
HTTPdio
Modelosjson_serializable + freezed (o clases inmutables escritas a mano para apps pequeñas)
BD localdrift para datos relacionales, shared_preferences solo para banderas, flutter_secure_storage para secretos
Localizacióngen-l10n con ARB
TemaMaterial 3, claro + oscuro + sistema, ColorScheme basado en semilla o esquema proporcionado por la marca
Entornosdev / staging / prod mediante --dart-define-from-file
Lintsvery_good_analysis más templates/analysis_options.yaml
Pruebasunitarias + de widget en todo estado/datos/componentes; algunos caminos felices de integration_test

Dónde esta habilidad difiere deliberadamente del consejo común

Resumido para que puedas explicarlo si te lo cuestionan. El razonamiento completo está en las referencias vinculadas.

  • No toda funcionalidad recibe toda la Arquitectura Limpia. Entidades e interfaces de repositorio siempre; casos de uso solo cuando contienen lógica real. Los casos de uso de paso directo son ruido. (architecture.md)
  • DTO → Entidad, no DTO → Entidad → Modelo → Mapeador. Dos tipos más funciones de mapeo. Un tercer tipo de UI solo cuando el formateo lo justifica. (data-models.md)
  • AppStrings es reemplazado por gen-l10n para texto visible para el usuario; una clase de cadenas escrita a mano no se puede traducir ni pluralizar. (localization.md)
  • Los widgets leen roles semánticos del tema, no AppColors.blue500. Una referencia a la paleta sin procesar rompe el modo oscuro silenciosamente. (theming-and-constants.md)
  • GetX es compatible pero no recomendado para proyectos nuevos. (state-management.md)
  • Las reglas se aplican con herramientas, no con prosa. scripts/audit.sh y los lints atrapan lo que una lista de verificación olvida. (code-review-checklist.md)
  • Promueve a shared/ en el segundo uso, no en la primera suposición. Los átomos del sistema de diseño están exentos: se comparten desde el día uno.

Skills relacionados