@ -13,6 +13,7 @@ Taskbot ayuda a coordinar grupos en WhatsApp: crea y asigna tareas, recuerda pen
## Características
- Gestión de tareas: crear, asignar, reclamar/soltar, fechas límite y código corto de referencia.
- Edición desde la web: reclamar/soltar y actualizar fecha de vencimiento desde /app.
- Recordatorios configurables por usuario (frecuencia y hora, respetando zona horaria).
- Control de acceso por grupos: modos off, discover y enforce; aprobación y bloqueo por admins.
- Sincronización de grupos y miembros con cachés y schedulers configurables.
@ -27,7 +28,7 @@ Taskbot ayuda a coordinar grupos en WhatsApp: crea y asigna tareas, recuerda pen
- No es un framework general de bots ni un CRM.
- No conecta directamente con WhatsApp: requiere Evolution API.
- No gestiona flujos conversacionales complejos ni multimedia avanzada.
- Panel web: login operativo, vista básica de tareas (por fecha de vencimiento), vista de grupos (contadores "abiertas" y "sin responsable") y página de preferencias de recordatorios; la interacción principal sigue siendo WhatsApp.
- Panel web: login operativo, lista de tareas con acciones básicas (reclamar/soltar y editar fecha), vista de grupos (contadores "abiertas" y "sin responsable") y página de preferencias de recordatorios; la interacción principal sigue siendo WhatsApp.
- Está optimizado para un despliegue por comunidad/instancia (no multi-tenant masivo).
## Cómo funciona (alto nivel)
@ -103,6 +104,7 @@ Consulta:
- Etapa 1 (autenticación web): completada. /login (GET intermedio + POST), sesión con idle 2h, logout y ruta /app protegida; desplegado con proxy interno en Bun.
- Etapa 2 (lectura de datos - MVP): completada. GET /api/me/tasks (orden por due_date asc con NULL al final, búsqueda con ESCAPE, filtros soonDays/dueBefore, paginación page/limit), GET /api/me/groups (contadores open/unassigned) y GET /api/groups/:id/tasks (unassignedFirst, onlyUnassigned, limit). UI: /app (Mis tareas, filtros/búsqueda/paginación) y /app/groups (bloque “sin responsable” con prefetch).
- Etapa 3 (preferencias): completada. GET/POST /api/me/preferences y página /app/preferences con cálculo de “próximo recordatorio” coherente con la TZ y semántica del bot.
- Edición de tareas en web: completada. Reclamar/soltar y editar fecha desde /app (con gating y validación).
- Roadmap y contribuciones: pendientes de publicación.
- Devuelve las preferencias del usuario para recordatorios como { freq, time }. Si no hay registro previo, responde { freq: 'off', time: '08:30' }.
- POST /api/me/preferences
- Actualiza preferencias. Valida freq ∈ {off,daily,weekly,weekdays} y time en formato HH:MM (24h); normaliza hora (p. ej., 7:5 → 07:05). Upsert con updated_at; si freq='off' y no se envía time, conserva la última hora guardada (o '08:30' por defecto).
- POST /api/tasks/:id/claim
- Reclama la tarea para el usuario actual (idempotente). Requiere sesión; valida que la tarea esté abierta y aplica gating: t.group_id IS NULL o (grupo permitido y membresía activa).
- POST /api/tasks/:id/unassign
- Elimina la asignación del usuario actual (idempotente) si existe. Requiere sesión; tarea abierta y gating equivalente.
- PATCH /api/tasks/:id
- Actualiza campos básicos; actualmente solo admite { due_date: 'YYYY-MM-DD' | null }. Valida formato; requiere sesión, tarea abierta y gating.
@ -13,6 +13,7 @@ Este documento define el plan para añadir una interfaz web al sistema, mantenie
- Calidad: tests de /app/preferences actualizados; resuelto warning de export no usado en TaskItem.
- Incidencia de producción resuelta: la causa era Content-Encoding (brotli/gzip) no compatible en la cadena. Se desactivó la compresión end-to-end: SvelteKit se construye con precompress=false y, en el proxy Bun, se fuerza Accept-Encoding: identity hacia la web y se eliminan Content-Encoding/Vary/Content-Length en las respuestas al cliente.
- Verificación: los assets /_app/* sirven 200 sin Content-Encoding y con Content-Type correcto. Estilos y JavaScript cargan correctamente.
- Edición de tareas en web integrada: reclamar/soltar y edición de fecha (PATCH /api/tasks/:id), con gating por AllowedGroups + membresía activa.
## 1) Decisiones fijadas
@ -32,6 +33,7 @@ Este documento define el plan para añadir una interfaz web al sistema, mantenie
- Mis tareas: lista (orden por fecha de vencimiento asc), filtros (abiertas, vencen pronto), búsqueda por texto simple.
- Tareas de mis grupos: solo grupos permitidos y en los que el usuario está activo; sección destacada de “sin responsable”.
- Edición de tareas desde la web: reclamar/soltar asignación y editar fecha de vencimiento (YYYY-MM-DD).
- Preferencias de recordatorios: ver y modificar frecuencia (daily/weekly/weekdays/off) y hora. Visualización de próximo recordatorio según TZ.
- Autenticación: comando /t web que devuelve URL con token. Canje en /login y cookie de sesión.
- Integraciones:
@ -134,7 +136,7 @@ Notas:
## 9) UI (apps/web)
- Páginas:
- /app (dashboard): “Mis tareas” por defecto.
- /app (dashboard): “Mis tareas” con acciones (reclamar/soltar/editar fecha).
- /app/groups: lista de grupos del usuario; en cada uno, “sin responsable” prominente.
- /app/preferences: frecuencia y hora de recordatorios; vista “próximo recordatorio”.
- /app/integrations: enlaces ICS
@ -224,7 +226,7 @@ Etapa 5 — Pulido y observabilidad
- UX: copiar enlace, avisos claros, vacíos de estado.
Etapa 6 — Evolutivos (posteriores)
- Edición de tareas (claim/unassign, fechas).
- Edición de tareas (claim/unassign, fechas) — HECHO.