diff options
| author | Elvis Claros Castro <elvis@claros.ar> | 2026-08-17 15:12:12 -0300 |
|---|---|---|
| committer | Elvis Claros Castro <elvis@claros.ar> | 2026-08-17 15:12:12 -0300 |
| commit | 0d1fe286ac6ea30b91c15b44c0872b57a864ea7f (patch) | |
| tree | 554d6c8a0bdcf1c30bfa2d752d557b39c1554d6e /claude_sesiones/webpage.py | |
| parent | bd3ca3a04fcd8d882d23deeb3f3a0d6f04b3f93f (diff) | |
| download | claude-logbook-0d1fe286ac6ea30b91c15b44c0872b57a864ea7f.tar.gz claude-logbook-0d1fe286ac6ea30b91c15b44c0872b57a864ea7f.zip | |
Explorar también las memorias de los proyectos
Claude Code deja, además de las sesiones, un directorio memory/ por proyecto:
un .md por recuerdo con frontmatter, y un MEMORY.md que hace de índice. Lo
que no figura en ese índice sigue en disco pero deja de cargarse en contexto,
así que la diferencia entre ambos es justamente lo que vale la pena mirar.
-m cambia de sesiones a memorias y reusa los mismos verbos:
claude-sesiones -m tabla de memorias
claude-sesiones -m docker busca en nombre, descripción y cuerpo
claude-sesiones -m -s 3 lee la nº 3 (o -s <nombre>)
claude-sesiones -m --check audita índices, enlaces y orígenes
claude-sesiones -m -D 3 la borra y la saca de MEMORY.md
claude-sesiones -m --type feedback filtra por tipo declarado
--check es la parte con criterio propio: reporta memorias que no están en
MEMORY.md, entradas del índice que apuntan a archivos que ya no existen,
enlaces [[...]] rotos y sesiones de origen que ya no están.
El registro de una memoria usa claves cortas como el de sesiones, por el
mismo motivo: viaja embebido en el HTML, que ahora tiene su propia pestaña
de memorias.
Claude-Session: https://claude.ai/code/session_01RmtZ9qBemrc9TncwVTG6ED
Diffstat (limited to 'claude_sesiones/webpage.py')
| -rw-r--r-- | claude_sesiones/webpage.py | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/claude_sesiones/webpage.py b/claude_sesiones/webpage.py index 8291a6b..c8550fe 100644 --- a/claude_sesiones/webpage.py +++ b/claude_sesiones/webpage.py @@ -23,18 +23,27 @@ def template_text(path=None): return (resources.files(__package__) / TEMPLATE_NAME).read_text(encoding="utf-8") -def encode_payload(records): - """Serializa los registros para meterlos en un <script type=application/json>. +def build_payload(sessions, memories=None): + """Estructura que viaja embebida en la página. + + Un objeto y no una lista porque la página muestra dos cosas distintas: + sesiones y memorias de proyecto. + """ + return {"s": list(sessions), "m": list(memories or ())} + + +def encode_payload(payload): + """Serializa el payload para meterlo en un <script type=application/json>. El parser de HTML corta ese bloque en el primer "</script", y las transcripciones tienen HTML adentro. Escapamos "</" como "<\\/", que es un escape válido de JSON: JSON.parse lo devuelve intacto. """ - raw = json.dumps(records, ensure_ascii=False, separators=(",", ":")) + raw = json.dumps(payload, ensure_ascii=False, separators=(",", ":")) return raw.replace("</", "<\\/") -def render(records, template=None): +def render(records, memories=None, template=None): """Devuelve el HTML completo con los datos ya embebidos.""" html = template if template is not None else template_text() # No se puede verificar el resultado buscando el marcador: estas mismas @@ -44,21 +53,22 @@ def render(records, template=None): raise TemplateError( f"el template debe tener exactamente un {MARKER} " f"(encontrados: {html.count(MARKER)})") - return html.replace(MARKER, encode_payload(records)) + return html.replace(MARKER, encode_payload(build_payload(records, memories))) -def write(records, out_path, template=None): +def write(records, out_path, memories=None, template=None): """Escribe la página y devuelve un resumen de lo que quedó adentro.""" - html = render(records, template=template) + html = render(records, memories=memories, template=template) with open(out_path, "w", encoding="utf-8") as f: f.write(html) - return summary(records) + return summary(records, memories) -def summary(records): +def summary(records, memories=None): return { "sesiones": len(records), "proyectos": len({r["p"] for r in records}), "mensajes": sum(r["u"] for r in records), "bloques": sum(len(r["c"]) for r in records), + "memorias": len(memories or ()), } |