shipflow 0.3.1
shipflow: ^0.3.1 copied to clipboard
A Dart package and CLI that drives any Flutter project from a ticket to a merge request through a deterministic, config-driven pipeline.
Changelog #
Todos los cambios notables de shipflow se documentan en este archivo.
El formato está basado en Keep a Changelog, y este proyecto sigue Semantic Versioning.
0.3.1 — 2026-07-06 #
Release de corrección. Dos bugs de path-matching, uno de empaquetado y otro de configuración — ninguno afecta el core determinista del pipeline.
Corregido #
.pubignoreexcluía código fuente real. El patróndocs/(línea 3) estaba sin/inicial, por lo que en sintaxis gitignore se anclaba a cualquier profundidad — excluía tambiénlib/src/core/docs/ytest/core/docs/, que son código Dart, no documentación del proyecto. Anclado a la raíz (/docs/).architecture.layers.*.pathsno soportaba glob patterns, aunqueship-complete-config.mdlos recomienda para proyectos feature-first (ej.lib/src/feature/*/domain/).Directory()no expande*— el patrón se trataba como nombre literal, nunca existía, y el layer quedaba vacío en silencio. Afectaba 8 puntos del analyzer suite:analyze_command,wiring_cohesion,widget_inventoryeinventory_commandno encontraban ningún archivo;layer_integrity,security,testingypackage_boundaryreimplementaban su propio matching por prefijo literal, que tampoco entendía*. Nuevolib/src/core/paths/glob_match.dart(globMatch+expandLayerPaths) replica la semántica de glob quedart_source_graphya usa paraship graph(*un segmento,**cualquier profundidad,/final = prefijo de directorio), y los 8 puntos ahora la comparten. Schema:pathsretipado delist<relative_path>alist<glob>.
0.3.0 — 2026-07-01 #
Tercer release. El foco fue documentación intent-first: convertir la documentación del pipeline en artefactos deterministas y verificables, e introducir una fase de intención que se aprueba antes del diseño. El núcleo determinista sigue siendo 100% sin IA.
Añadido #
- Artefactos de documentación deterministas (
lib/src/core/docs/): esquema de docs verificable por máquina (doc_schema), generador de esqueleto markdown (doc_skeleton), validador estructural (doc_validator) y parser de outline (markdown_outline). Doc kindsintent/design/taskscon perfiles por tipo de ticket. Nuevos comandosship doc-skeletonyship validate-doc. - Fase intent-first + Intent Gate en el flujo de feature. Nuevo comando
/ship-capture-intent: captura problema, valor, alcance y criterios de aceptación por función en unintent.mdvalidado, con sidecar de aprobaciónintent_approved.jsonque espeja el Gate 0 de spec. Se cablea en/ship-pipelinecomo Phase 1.5 y aplica a ticketsfeature/arch/design(nobugfix). - Comando
ship docs-path: resuelve la ruta tracked de un documento del pipeline. - Tipos de ticket
archydesign: enum de clasificación extendido afeature|bugfix|arch|design, decidido por label y palabras clave. - Detalle por función forzado por código: el validador exige ≥1 bloque
### FNNcuando el perfil lo requiere, yship doc-skeletonsiembra esos bloques desdenew_components.screensdelanalysis.json.
Cambiado #
- El driver del pipeline exige aprobación de intención antes del diseño en
tickets
feature/arch/design. - El gate de análisis se evalúa antes de intención/spec: un
analysis.jsoninválido bloquea aunque ya existaspec.json(no avanzar sobre datos sin verificar). - Los command strings emitidos por el driver se normalizan al prefijo
ship-(/ship-analyze-ticket,/ship-design-feature,/ship-implement-*), en línea con los archivos de comando reales. - Etiquetas del reporte del pipeline generalizadas para
arch/design; el Intent Gate aparece en el reporte final. - Ampliadas las palabras clave de clasificación
bugfixpara reducir el ruteo incorrecto de defectos como features.
0.2.0 — 2026-06-29 #
Segundo release. El foco fue cerrar el lazo de fidelidad de diseño: extraer diseño de Figma de forma determinista, exigir que el código generado trace 1:1 contra el NDS, y volver el esquema NDS verificable por máquina. El núcleo determinista sigue siendo 100% sin IA.
Añadido #
- Subsistema Figma — extracción REST headless (
lib/src/figma/). Nuevo comandoship figma-extract: lee un diseño de Figma vía REST y produce un NDS determinista, sin plugin ni MCP. Incluye parser de URL de Figma (figma_url.dart), cliente REST (figma_api.dart) y mapeo Figma→NDS (figma_mapper.dart). ship nds-diff— compara dos NDS (o un NDS contra su realización) para medir desviación de fidelidad de diseño.- Regla
visual_fidelity/hallucinated_element— todo widget interactivo generado debe trazar a un elemento real del NDS mediante una anotación// nds:<id>. UI sin anotación se reporta como posible alucinación o elemento obsoleto. Cierra el bug donde el code-gen inventaba UI ausente del NDS. - Regla
unknown_font_weighten el analizadorvisual_fidelity(font_weight.dart). - Adaptador de design source
markup—adapter.mddocumentado como fuente de diseño de primera clase junto a Figma e imagen. - Canon de imports (
core/paths/import_canon.dart) para normalizar rutas de importación al validar capas.
Cambiado #
- BREAKING (pre-1.0):
/ship-qa-handoffse renombra a/ship-handoffy el artefactoqa_handoff.mdahandoff.md. El pipeline es agnóstico a la fuente y el consumidor puede no tener equipo de QA; el documento sirve a cualquier verificador humano (QA o reviewer). - Contrato de diseño 1:1 con el NDS. El code-gen realiza exactamente los elementos declarados en el NDS — ni de más (alucinación) ni de menos — y ahora permite diferir las capas data y presentation cuando el ticket no las requiere todavía.
nds.schema.yamlreescrito a forma verificable por máquina. Antes estaba en un YAML descriptivo que el validador no podía recorrer; ahoraship validate-artifact --schema ndslo aplica de verdad. El wrapper canónico esnds.document.elements.- Esquemas de contrato actualizados (
analysis,code_review,final_report,spec,validation_report,project-config). - Prompts del pipeline (
core/commands/*) y adaptadores de code-gen / design source afinados.
Corregido #
- El code-gen alucinaba UI ausente del NDS (ahora bloqueado por
hallucinated_element+ contrato 1:1). - El esquema NDS no era recorrible por el validador, por lo que
validate-artifactno lo aplicaba realmente.
0.1.0 — 2026-06-03 #
Lanzamiento inicial público de shipflow: un paquete de Dart + CLI que lleva
cualquier proyecto Flutter desde un ticket hasta un merge request mediante un
pipeline determinista y configurable. El núcleo (analyzers, matching,
scaffolding) es 100% determinista; el pipeline ticket→MR está en vista previa
(ver README.md → Madurez).
CLI (ship) #
Subcomandos compilables a un binario nativo (tool/compile.sh):
ship --version/-v— imprime la versión.ship init— genera el skeleton de un proyecto o un.ship.yaml.--template configlo deriva de un proyecto Flutter existente leyendopubspec.yamly escaneando capas; cada campo lleva un comentario trazable (# inferred from …,# detected at …,# default,# PLACEHOLDER) y lo no detectado se emite comoPLACEHOLDERexplícito en vez de adivinarse (ADR-0012). Idempotente con--dry-runy--force. Agrega.pipeline/al.gitignoredel consumidor.ship analyze— ejecuta los analyzers de un gate y emite el reporte en formato legible, JSON o HTML navegable (--format html→ship-reports/, triage-first: los hallazgos bloqueantes antes que los informativos, con agrupación, filtros y búsqueda; ADR-0013). Resuelve el Dart SDK desde--dart-sdk,DART_SDK, odart/flutteren PATH.ship match— resuelve color / tipografía / espaciado contra el catálogo de tokens de diseño del consumer.ship scaffold— genera el scaffold de un feature vía el adapter de code-gen.ship inventory— escanea clases de widgets y emite un inventario JSON.ship journal/ship context— inspeccionan el journal JSONL y construyen el context packet de una corrida.ship install-commands— instala de forma determinista los prompts/ship-*en tu agente (claude/gemini/codex/cursor; ADR-0021).- Subcomandos de soporte del pipeline:
redact,check-files-changed,validate-artifact,metrics,run,graph,graph-query,commands-path.
Analyzers #
Conjunto de analyzers de arquitectura, diseño y calidad: layer_integrity,
package_boundary, visual_fidelity, code_complexity,
build_method_complexity, flutter_antipatterns, widget_purity,
widget_inventory, wiring_cohesion, state_mgmt, testing, security,
performance, project_conventions, dry_detection, design_principles. Cada
uno emite AnalysisIssue estructurado (severidad minor / major /
critical / blocker, ruleId y suggestedFix). Validados contra un proyecto
Flutter de producción para minimizar falsos positivos; varias severidades son
configurables (p. ej. missing_test y missing_image_fit son informativos por
defecto, y missing_test reconoce el layout espejo lib/ → test/).
Pipeline ticket → MR (vista previa) #
Prompts en markdown bajo core/commands/ orquestados por tu CLI de IA; el
paquete no llama a ninguna API de IA. El pipeline lee el ticket, genera un spec,
implementa cada capa, corre las compuertas por capa, revisa y crea el MR; los
artefactos quedan en .pipeline/runs/<ticket_id>/. Las fases consultan un grafo
de conocimiento del código provisto por
dart_source_graph (ADR-0019). Un
gate de reconciliación verifica que los archivos modificados coincidan con los
declarados por cada fase, comparando contra el estado previo a la corrida e
ignorando el estado interno del pipeline (.pipeline/).
Adapters #
Ticket sources (asana, file), design sources (figma, image, markup),
code generators (riverpod_manual, bloc) y token catalog (dart_source,
json). Agregar soporte = una carpeta bajo adapters/<family>/<name>/ que
implemente el contrato de la familia, sin tocar el core.
Arquitectura #
- Hexagonal (Ports & Adapters): el core depende de
contracts/, nunca de un adapter concreto; la selección ocurre por búsqueda de nombre en.ship.yamlen runtime. Autovalidada:PackageBoundaryAnalyzercorre sobre el propio árbol deshipflowen CI (tool/check_shipflow_boundaries.dart). - Biblioteca de matching pura (
lib/matching.dart): ΔE CIE2000, Jaccard, puntuación difusa, snap a pasos — sin I/O. - Generación de código idempotente con rollback (
ScaffoldExecutor). - Soporte para monorepos (ADR-0011):
ship init --template featurearma un paquete cuyo token catalog apunta a undesign_system/hermano.
Dependencias #
dart_source_graph: ^0.1.2, analyzer: ^13.0.0, args: ^2.7.0,
crypto: ^3.0.7, path: ^1.9.1, yaml: ^3.1.3.
Configuración y documentación #
Schema de config del consumer
(contracts/schemas/project-config.schema.yaml),
ejemplo comentado (config/examples/sample_app.yaml),
Architectural Decision Records bajo docs/adr/, recorrido visual
(docs/PROJECT_WALKTHROUGH.md) y guía de adopción
(docs/CONSUMER_INTEGRATION.md).
Pruebas #
645 pruebas en verde a lo largo de analyzers, adapters, resolvers, scaffolding, inventory, schema, driver y el CLI runner; invariantes de frontera de paquete autovalidados (0 violaciones).