From ec77a7fffa902c14d0aa285c7e0d4f2b33ccd8e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Ben=C3=ADtez?= Date: Tue, 7 Jul 2026 17:47:31 -0300 Subject: [PATCH] =?UTF-8?q?docs(sprint-8):=20ETAPA=5F0=5FPROMPT=20?= =?UTF-8?q?=E2=80=94=20versionado,=20CHANGELOG,=20AppFooter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sprints/sprint-8/ETAPA_0_PROMPT.md | 268 +++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 sprints/sprint-8/ETAPA_0_PROMPT.md diff --git a/sprints/sprint-8/ETAPA_0_PROMPT.md b/sprints/sprint-8/ETAPA_0_PROMPT.md new file mode 100644 index 0000000..c6b6e21 --- /dev/null +++ b/sprints/sprint-8/ETAPA_0_PROMPT.md @@ -0,0 +1,268 @@ +# Sprint 8 — Etapa 0: Versionado profesional + +> **Tipo:** Infraestructura / Documentación +> **Rama:** main +> **Estimación:** 1-2 horas +> **Dependencias:** ninguna — es la primera etapa del sprint + +--- + +## Objetivo + +Establecer el ciclo profesional de versiones antes de abrir cualquier feature nueva: +1. `CHANGELOG.md` con historial completo desde v0.1.0 +2. `package.json` actualizado a v0.8.0 +3. `AppFooter` visible en la app con la versión actual +4. `simulador-web/CLAUDE.md` actualizado con la sección de versionado + +--- + +## Contexto + +El producto está en producción en https://inq-roi.inqualityhq.com y https://process-cost-platform.pages.dev. No existe `CHANGELOG.md`. La versión en `package.json` tiene algún valor anterior (verificar). No hay componente de footer con versión visible en la UI. + +El sprint adopta Conventional Commits a partir de esta etapa. Todos los commits de Sprint 8 deben seguir el formato especificado en `simulador-web/CLAUDE.md` (sección "Gestión de versiones y commits"). + +--- + +## Alcance estricto + +### 1. Verificar versión actual en `package.json` + +Leer `package.json` y reportar el valor actual de `"version"`. Luego actualizarlo a `"0.8.0"`. + +### 2. Crear `src/lib/version.ts` + +```typescript +// Lee la versión desde package.json en tiempo de build (Vite lo expone vía import.meta.env) +// Alternativa simple: constante string que se actualiza manualmente con cada release +export const APP_VERSION = '0.8.0' +``` + +Si Vite ya expone `import.meta.env.VITE_APP_VERSION` o similar, usar ese mecanismo. Si no, usar la constante string — es más simple y suficiente para el caso de uso. + +### 3. Crear `src/components/AppFooter.tsx` + +Componente discreto, una sola línea, esquina inferior. Visible en todas las páginas. + +**Diseño:** +- Texto: `InQ ROI v0.8.0 · Powered by InQuality` +- Tipografía: `text-xs text-muted-foreground` +- Alineación: centrado o derecha, `py-4` +- Sin borde superior ni decoración adicional + +```tsx +import { APP_VERSION } from '@/lib/version' + +export function AppFooter() { + return ( + + ) +} +``` + +### 4. Integrar `AppFooter` en las páginas principales + +Agregar `` al final del layout o directamente en las páginas indicadas. Mínimo obligatorio: + +- `LibraryPage.tsx` — antes del cierre del contenedor principal +- `ReportPage.tsx` — antes del cierre del contenedor principal + +Si existe un layout compartido que envuelva todas las páginas (verificar en `router.tsx` o `App.tsx`), preferir ponerlo ahí una sola vez. Si no existe layout compartido, agregar en las dos páginas listadas. + +**NO modificar** el header `AppHeader.tsx` — la versión va en el footer, no en el header. + +### 5. Crear `CHANGELOG.md` + +Ubicación: `simulador-web/CHANGELOG.md` (raíz del proyecto, mismo nivel que `package.json`). + +Formato: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +```markdown +# Changelog + +All notable changes to InQ ROI will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.8.0] - 2026-07-07 +### Added +- CHANGELOG.md con historial de versiones +- AppFooter con versión visible en todas las páginas +- Conventional Commits adoptados como estándar de commits + +## [0.7.0] - 2026-07-07 +### Added +- Multi-tenancy: tabla `organizations`, 4 roles de plataforma (platform_admin, member, client_editor, client_viewer) +- Edge Functions `invite-user` y `revoke-user` para gestión de acceso +- Panel de administración `/admin` con gestión de Organizations y Users +- Login email/password y página `/reset-password` para flujo de invitación +- Back button contextual en workspace (muestra nombre del cliente via JOIN en getById) +- Política RLS `simulations_update` para que client_editor pueda guardar simulaciones + +### Fixed +- Race condition en AuthContext: `isProfileLoaded` como guard antes de renderizar contenido rol-dependiente +- `syncProfileFromDB` ahora lee `platform_role` y `org_id` desde DB (no inferido por dominio de email) +- `normalizeGroupLabel()`: limpia artículos iniciales de labels de grupos con datos corruptos + +## [0.6.0] - 2026-06-24 +### Added +- Logo InQuality en header de PDFs (isotipo, páginas 2+, fallback a texto) +- Panel de análisis de sensibilidad en tab ROI: sliders de volumen e inversión, recálculo en tiempo real +- Doble línea en CumulativeSavingsChart (base gris dashed + ajustada naranja con área sombreada) +- `whitespace-nowrap` en MetricCell de columna Eficiencia + +### Fixed +- `ProfileSheet.getAccessToken()` leía clave inexistente (`'supabase.auth.token'`); el guardado de perfil nunca llegaba a Supabase desde Sprint 4. Fix: calcular `sb-${projectRef}-auth-token` + +## [0.5.0] - 2026-06-23 +### Added +- Fix crítico: workspace loading — race condition auth/processId resuelto con `isProfileLoaded` +- Controles de zoom BPMN: fit-viewport con centering correcto, botones zoom-in/zoom-out/fit +- Heatmap con gradiente continuo de 4 stops + toggle percentile/min-max persistido +- "Ver procesos por recurso" en catálogo de recursos +- Campo "empresa" en perfil de usuario +- Columna "Eficiencia de automatización" en ComparisonTable (+ columna "Ahorro esperado") + +### Fixed +- Flakiness en botón "Guardar cambios": debounce + Web Locks en process-store +- Specs E2E migradas de Dexie a Supabase + +## [0.4.0] - 2026-06-18 +### Added +- Autenticación Google Workspace OAuth + Supabase +- Migración completa IndexedDB (Dexie) → PostgreSQL (Supabase) +- Row Level Security con `is_platform_admin()` y políticas granulares +- Catálogo global de recursos (sin processId) +- Identidad en UI: avatar/dropdown AppHeader, "Actualizado por" en proceso +- ResourceCatalogPage + ResourceFormSheet +- Fix Web Locks API deadlock (processLock) +- Fix `.maybeSingle()` en simulation-repo +- Fix `formatCostPerHour()` precisión dinámica +- Fix Google OAuth `prompt: 'select_account'` +- Catálogo con contexto de proceso (banner + query param fromProcess) + +## [0.3.0] - 2026-05-27 +### Added +- Biblioteca de procesos con grupos/tags/búsqueda (Dexie v4) +- Indicador de simulación desactualizada ("Hay cambios sin simular") +- Zoom BPMN fit-viewport +- Recursos TO-BE en escenario automatizado (motor + UI + reporte + PDF) +- Branding InQ ROI en todas las páginas (AppHeader + favicon + logos) +- Kit de socialización del equipo: guía de usuario, guía de pre-venta, presentación PPTX + +## [0.2.0] - 2026-05-20 +### Added +- Modelo de recursos `utilizationMinutes + units` (migración Dexie v3) +- ActivityPanel con cálculo de costo en tiempo real +- Reporte web con filas expandibles de desglose de recursos +- Edición inline de proceso/cliente +- Tabla de recursos en PDF (página condicional) + +## [0.1.5] - 2026-05-18 +### Added +- Identidad visual completa: paleta naranja InQ #F59845, gradiente → magenta #ED3E8F +- PDFs de clase profesional: 3 documentos (Actual, Automatizado, ROI) +- Badge ⚡ en canvas BPMN para actividades automatizables +- ROI con 5 KPIs +- Sistema de componentes establecido + +## [0.1.0] - 2026-05-01 +### Added +- MVP: importar BPMN 2.0, parametrizar actividades, simular costos, exportar PDF +- Motor de simulación AS-IS / TO-BE (Modelo A) +- Heatmap de costos en canvas BPMN +- Reporte web básico con tabla de actividades y gráfico de barras +``` + +**Nota sobre las fechas:** usar las fechas de cierre formal de sprint documentadas en `STRATEGIC_DIRECTION.md`. Si alguna fecha no está documentada, usar la fecha más cercana disponible (commits de git son referencia). + +### 6. Actualizar `simulador-web/CLAUDE.md` + +La sección "Gestión de versiones y commits" ya está en `CLAUDE.md` (fue agregada en el cierre de Sprint 7). Verificar que el contenido sea correcto y consistente con lo que se implementa en esta etapa. Si la sección no existe, crearla. + +Verificar específicamente que diga: +- `Sprint 7 = v0.7.x (MVP multi-tenant). Sprint 8 arranca en v0.8.0.` +- El formato de Conventional Commits está documentado con los scopes correctos + +**Si la sección ya existe y es correcta, NO modificar `CLAUDE.md`** — no tocar lo que ya está bien. + +--- + +## Criterios de validación + +### Funcionales +- [ ] `package.json` tiene `"version": "0.8.0"` +- [ ] `src/lib/version.ts` exporta `APP_VERSION = '0.8.0'` +- [ ] `AppFooter` renderiza `InQ ROI v0.8.0 · Powered by InQuality` +- [ ] Footer visible en LibraryPage (validación visual) +- [ ] Footer visible en ReportPage (validación visual) +- [ ] `CHANGELOG.md` existe con historial desde v0.1.0 hasta v0.8.0 + +### Técnicos +- [ ] Build sin errores TypeScript (`npm run build`) +- [ ] Tests sin regresiones (`npm run test`) +- [ ] No hay cambios en archivos fuera del scope listado + +--- + +## Restricciones explícitas + +- **NO** modificar `AppHeader.tsx` — la versión va en el footer solamente +- **NO** agregar modal de "novedades" ni changelog interactivo en la UI +- **NO** usar `import.meta.glob` ni mecanismos complejos para leer el version — la constante simple es suficiente +- **NO** agregar dependencias nuevas — todo con lo que ya existe en el stack +- **NO** crear README.md ni documentación adicional — solo los archivos listados + +--- + +## Archivos autorizados a modificar/crear + +``` +simulador-web/ +├── package.json ← actualizar "version" +├── CHANGELOG.md ← crear +├── src/ +│ ├── lib/ +│ │ └── version.ts ← crear +│ └── components/ +│ └── AppFooter.tsx ← crear +├── src/features/library/LibraryPage.tsx ← agregar al final +├── src/features/report/ReportPage.tsx ← agregar al final +``` + +Si existe un layout global donde sea más correcto poner `AppFooter`, se puede usar en lugar de modificar LibraryPage y ReportPage — pero reportar la decisión antes de ejecutar (Nivel 2). + +--- + +## Commit esperado + +``` +chore(version): v0.8.0 — CHANGELOG, AppFooter, version.ts +``` + +Seguido de: + +``` +docs(changelog): etapa 0 sprint 8 +``` + +(Si se hacen en un solo commit, usar el primer mensaje.) + +--- + +## Reporte esperado + +Al finalizar, reportar: +1. Valor previo de `"version"` en `package.json` +2. Si el layout global existe (y si AppFooter se puso ahí en lugar de en las páginas) +3. Lista exacta de archivos modificados con diff resumen +4. Resultado de `npm run build` y `npm run test` +5. Screenshot o descripción del footer visible en la app (para validación visual del director)