Resumen
PR #55 (commit f8b2a0b, 2026-05-20) unifica las dos vistas de actividad que existían en el Workspace — la página /worklog (sesiones de desarrollo del WORKLOG.md) y el componente ActivityLog (registros del activity_log de la API) — en una única ruta /worklog con timeline cronológico descendente.
Se elimina la ruta /history y el componente ActivityLog.tsx (457 líneas), considerados duplicado funcional tras la integración.
Componentes implicados
src/lib/worklog-parser.ts — Parser híbrido
Parser que detecta dos formatos de sesión en WORKLOG.md:
| Formato | Identificación | Descripción |
|---|---|---|
| s64+ moderno | Cabecera Resumen + Detalle | Sesiones a partir de la sesión 64 aprox. |
| Legacy | Patrón autor + bullets | Sesiones anteriores al formato s64 |
En la carga inicial parsea 71 sesiones del historial completo.
src/components/worklog/WorklogTimeline.tsx — Componente principal
Timeline cronológico que combina dos tipos de ítem:
- Sesiones de desarrollo → cards expandibles con botón “Ver detalle técnico” que despliega el bloque
Detalledel WORKLOG. - Actividades del
activity_log→ filas finas (mismo estilo que el antiguoActivityLog).
Los ítems se agrupan por día y se ordenan en sentido DESC (más reciente primero).
Filtros disponibles
| Filtro | Aplica a |
|---|---|
| Persona / actor | Sesiones + actividades |
| Acción | Solo actividades |
| Rango de fechas | Sesiones + actividades |
| Búsqueda full-text | Sesiones + actividades |
| Toggle Todo / Sesiones / Actividades | Ambos |
src/lib/activity-format.ts — Formato del detalle de actividad
Las llamadas del MCP quedan en activity_log como details = {"tool": "<nombre>", "args": {…}}. Este módulo (extraído de WorklogTimeline.tsx, con pruebas en test/activity-format.test.ts) decide cómo se ve esa cadena en la fila: desde el 28-09-2026, una frase en castellano por herramienta (TOOL_TEXT: “Actualizó el índice de la Biblioteca con 46 documentos”, “Actualizó el texto de una página de la wiki: slug o el fichero; una herramienta sin frase propia sale con su nombre sin guiones bajos. Las etiquetas de acción (index, lint…) y de tipo (bib_docs, wiki_page…) de esas llamadas se traducen en ACTION_LABELS / ENTITY_TYPE_LABELS de src/lib/constants.ts (“Índice”, “Biblioteca”, “Wiki”). Hasta el 27-09 la fila decía “bib_index_docs · 46”, que seguía siendo jerga para quien lee el Worklog. El módulo da también la firma que usa activitySig para colapsar llamadas seguidas a la misma herramienta en una fila ×N.
Cambios en rutas y navegación
| Antes | Después |
|---|---|
/worklog → solo sesiones WORKLOG | /worklog → timeline unificado (sesiones + activity_log) |
/history → ActivityLog.tsx | ❌ Eliminado |
| Sidebar: entrada “Historial” | ❌ Quitada de navigation.ts |
Widget “Actividad reciente” del dashboard → /history | Widget → /worklog |
La página /worklog ahora corre dentro del SecondaryLayout estándar del shell, alineándose con el resto de secciones.
Archivos clave
| Archivo | Estado | Descripción |
|---|---|---|
src/lib/worklog-parser.ts | ✅ Modificado/nuevo | Parser híbrido s64+/legacy |
src/components/worklog/WorklogTimeline.tsx | ✅ Añadido | Componente timeline unificado |
src/components/activity/ActivityLog.tsx | ❌ Eliminado | 457 LOC — funcionalidad absorbida por WorklogTimeline |
src/lib/navigation.ts | ✅ Modificado | Entrada “Historial” eliminada del sidebar |
src/lib/activity-format.ts | ✅ Añadido (27-09-2026, PR #198) · extendido (28-09-2026, PR #204) | Formato del detalle de actividad MCP — frase en castellano por herramienta (TOOL_TEXT) |
src/lib/constants.ts | ✅ Modificado (28-09-2026, PR #204) | Traducciones de ACTION_LABELS / ENTITY_TYPE_LABELS para las acciones y tipos de las llamadas del MCP |
Motivación y decisión de diseño
Existían dos superficies separadas con propósito solapado:
/worklog: contexto rico de sesiones pero sin eventos de API./history: eventos de API pero sin contexto de sesiones.
La unificación reduce la superficie de navegación, elimina la duplicación de lógica de filtrado y convierte /worklog en el destino canónico para auditoría de actividad del equipo.
Incidencia corregida (27-09-2026, PR #197)
Desde el 16-09-2026 (s329) las sesiones nuevas escriben el autor dentro de la propia cabecera (## fecha · sNNN · Autor (modelo) — título, con variantes: orden fecha/sNNN, con o sin modelo, con día de la semana, con horquilla de sesiones). El HEADER_RE original nunca contempló esas formas: reconocía 315 de las 347 cabeceras reales de WORKLOG.md y las 32 restantes quedaban pegadas como texto dentro de la sesión anterior — la página /worklog dejó de mostrar las sesiones nuevas desde esa fecha.
Fix: worklog-parser.ts añade una cascada de 7 patrones de respaldo (FALLBACK_HEADER_PATTERNS), probados solo cuando HEADER_RE no casa, más una red final que convierte cualquier cabecera con fecha en sesión propia aunque no case ningún patrón conocido. Cobertura verificada: 347/347 cabeceras del fichero real (test/worklog-parser.test.ts).
Commit: 7227c07f (PR #197).
Incidencia corregida (27-09-2026, PR #198)
Las llamadas del MCP se registran en activity_log con details = {"tool": "<nombre>", "args": {…}} (functions/api/mcp/index.ts). La fila de actividad pintaba ese JSON en crudo — cientos al día de bib_index_docs/bib_index_chunks con todo el contenido indexado dentro de args, ilegible en la vista.
Fix: nuevo módulo src/lib/activity-format.ts extrae toolOf() (nombre de la herramienta) y firstListLength() (tamaño del primer argumento tipo lista). formatActivityDetail() mostraba <herramienta> · N en vez del JSON, y activitySig() colapsa llamadas seguidas a la misma herramienta en una sola fila ×N aunque sus argumentos cambien. Los helpers, antes locales a WorklogTimeline.tsx, se mueven a este módulo nuevo con pruebas (test/activity-format.test.ts).
Commit: 24f0af7e (PR #198).
Ese formato
<herramienta> · Nseguía siendo jerga interna — corregido por el PR #204 de abajo.
Incidencia corregida (28-09-2026, PR #204)
El fix del PR #198 (arriba) resolvió el JSON en crudo, pero dejó jerga interna en las tres piezas de la fila: formatActivityDetail() mostraba el nombre técnico de la herramienta (bib_index_docs · 46) en vez de una frase legible, y las etiquetas de acción/tipo del filtro (index, lint, bib_docs, wiki_page…) salían tal cual, sin traducir. Edu lo reportó el mismo 28-09-2026.
Fix: activity-format.ts gana un mapa TOOL_TEXT con una frase en castellano por herramienta del MCP (p. ej. “Actualizó el índice de la Biblioteca con 46 documentos”, “Actualizó el texto de una página de la wiki: <slug>”), construida a partir del tamaño del primer argumento tipo lista y, si lo hay, el slug o el nombre del fichero tocado; una herramienta sin frase propia sale con su nombre técnico pero sin guiones bajos, nunca con el JSON crudo. src/lib/constants.ts añade las traducciones que faltaban en ACTION_LABELS (index → “Índice”, lint → “Revisado”…) y ENTITY_TYPE_LABELS (bib_docs/wiki_page… → “Biblioteca”/“Wiki”) para las acciones y tipos de esas mismas llamadas.
Commit: d99e0a00 (PR #204).
Véase también
- [[workspace—dashboard]]
- [[workspace—que-es-workspace]]