Manual operativo del proyecto: arquitectura (content.js + use.html snapshot),
cómo cargar/probar sin build, y gotchas (fragilidad ante cambios de claude.ai,
Boost 2x caduco, supuesto semanal-lunes).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
El usuario prefiere ver la página de Uso nativa de Claude en vez de un
overlay propio. Eso permite borrar mucho código:
- Fuera openOverlayPanel, closeOverlayPanel, setOverlaySpinner,
renderOverlayWithCache, showOverlayError.
- Fuera refreshInBackground, tryOpenViaPushState/Hash/Click,
closeUsageModal, waitForDialogWithData — ya no auto-abrimos en
background.
- Fuera formatAge y CACHE_TTL_MS y OVERLAY_ID y refreshPromise.
- Fuera __claudeUsageTracker (era andamio de debug).
- Fuera bloque de CSS del overlay (~120 líneas).
Nuevo onFabClick: 3 intentos en cascada para abrir el modal nativo de
Claude (hash → pushState+popstate → click en "Uso"). Si los 3 fallan,
warn en consola y queda el manual.
Y siguiendo lo que pediste, en el resumen del tracker (el que se
inyecta dentro del modal) ahora aparece un bloque azul "⏱ Sesión
termina a las HH:MM (en Xh Ym)" justo debajo del bloque verde del
reinicio semanal.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Antes la miniatura mostraba solo "X% / Y%" (sesión / semanal). Ahora
muestra "sUsado%/sIdeal% ~ wUsado%/wIdeal%" para ver de un vistazo si
vas por encima o por debajo del ritmo proporcional al tiempo
transcurrido en la sesión y en la semana.
- sIdeal = % de los 5h de sesión ya transcurridos.
- wIdeal = idealUsedByNow (% de la semana ya transcurrida).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
El error TypeError: estimatedEndDate.toLocaleDateString seguía
ocurriendo a pesar de rehydrateDates al cargar caché. Sin entender
todavía por qué la rehidratación no convierte el valor (posible que
el campo en storage no sea ISO-string sino algo no contemplado),
añado defense in depth: createWeeklyTracker normaliza los tres campos
Date (sessionStart, sessionEnd, estimatedEndDate) en su primera línea.
Es no-op cuando rehydrateDates funciona (instanceof Date → as-is) y
rescata el render cuando falla por cualquier motivo. Una llamada a
toLocaleDateString sobre un string ya no rompe la extensión.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bug raíz del click-no-abre-overlay: chrome.storage serializa con JSON,
los Date (sessionStartTime, sessionEndTime, estimatedEndDate) volvían
como strings ISO, y createWeeklyTracker llamaba .toLocaleDateString
en un string. rehydrateDates los devuelve a Date al cargar.
Mejoras adicionales:
- showOverlayError ya no destruye el panel si hay tracker visible:
saca un aviso temporal en el header (auto-oculta a los 7s).
- DOM en el aviso construido con textContent, no innerHTML, para
cerrar la puerta a XSS aunque el msg sea hardcodeado.
- Limpieza del andamio [CUT-DIAG] usado para encontrar el bug;
__claudeUsageTracker se queda expuesto para depuración futura.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
El FAB se ve y muestra datos cacheados (47%/40%) pero el click no abre
el overlay. Añado:
- console.log en cada paso del camino click→cache→openOverlayPanel
- try/catch en onFabClick y openOverlayPanel para cazar fallos silenciosos
- pointerdown listener en FAB para diferenciar "click cancelado por
Claude" de "handler nunca conectado"
- window.__claudeUsageTracker con loadCache, openOverlayPanel,
forceShowOverlay, etc. para reproducir cada paso desde la consola
Cambios temporales: una vez identificada la causa se retiran.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Claude movió la página de uso de /settings/usage a un modal con hash
#settings/usage sobre cualquier URL, así que el content script no se
ejecutaba en ningún sitio. Tres flujos nuevos:
- FAB flotante en claude.ai/* con uso cacheado (X% / Y%); se oculta
mientras el modal real está abierto.
- Inyección del tracker dentro del modal real cuando el usuario lo abre,
anclando estructuralmente sobre la fila del primer progressbar
(locale-proof) en vez de por texto.
- Overlay propio abierto desde el FAB con caché instantánea y refresh
en background si TTL >5 min: intenta pushState+popstate, hash,
click en "Uso" como fallbacks; cierra con botón X o Escape.
Cache en chrome.storage.local; se calienta cuando el usuario abre el
modal por su cuenta. Observers acotados y desconectados agresivamente.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
La página de uso de Claude eliminó el design token text-text-100,
lo que rompía la búsqueda de filas por p.font-base.text-text-100 y
dejaba al tracker sin inyectarse. Reescrito parsePageData para
localizar cada métrica por su etiqueta de texto ("Todos los modelos",
"Sesión actual"), subir hasta el ancestro con [role=progressbar] y
leer aria-valuenow + texto "Se restablece". Robusto ante renombrados
de clases de Claude.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>