aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_webpage.py
diff options
context:
space:
mode:
authorElvis Claros Castro <elvis@claros.ar>2026-08-17 15:12:12 -0300
committerElvis Claros Castro <elvis@claros.ar>2026-08-17 15:12:12 -0300
commit0d1fe286ac6ea30b91c15b44c0872b57a864ea7f (patch)
tree554d6c8a0bdcf1c30bfa2d752d557b39c1554d6e /tests/test_webpage.py
parentbd3ca3a04fcd8d882d23deeb3f3a0d6f04b3f93f (diff)
downloadclaude-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 'tests/test_webpage.py')
-rw-r--r--tests/test_webpage.py20
1 files changed, 15 insertions, 5 deletions
diff --git a/tests/test_webpage.py b/tests/test_webpage.py
index e738458..b768073 100644
--- a/tests/test_webpage.py
+++ b/tests/test_webpage.py
@@ -14,12 +14,20 @@ REGISTRO = {"id": "abc", "p": "/proj", "u": 1, "c": [{"r": "u", "x": "hola"}]}
class TestPayload(unittest.TestCase):
def test_escapa_el_cierre_de_etiqueta(self):
- raw = webpage.encode_payload([{"x": "mirá este </script> de acá"}])
+ raw = webpage.encode_payload({"s": [{"x": "mirá este </script> de acá"}]})
self.assertNotIn("</", raw)
- self.assertEqual(json.loads(raw)[0]["x"], "mirá este </script> de acá")
+ self.assertEqual(json.loads(raw)["s"][0]["x"], "mirá este </script> de acá")
def test_no_escapa_a_ascii(self):
- self.assertIn("ñ", webpage.encode_payload([{"x": "año"}]))
+ self.assertIn("ñ", webpage.encode_payload({"s": [{"x": "año"}]}))
+
+ def test_separa_sesiones_de_memorias(self):
+ payload = webpage.build_payload([REGISTRO], [{"name": "algo"}])
+ self.assertEqual(payload["s"], [REGISTRO])
+ self.assertEqual(payload["m"], [{"name": "algo"}])
+
+ def test_sin_memorias_igual_trae_la_clave(self):
+ self.assertEqual(webpage.build_payload([REGISTRO])["m"], [])
class TestRender(unittest.TestCase):
@@ -45,7 +53,8 @@ class TestRender(unittest.TestCase):
bloques = PAYLOAD_RE.findall(html)
self.assertEqual(len(bloques), 1)
vuelta = json.loads(bloques[0])
- self.assertEqual(vuelta[0]["c"][0]["x"], "poné </script><img> y __DATA__")
+ self.assertEqual(vuelta["s"][0]["c"][0]["x"],
+ "poné </script><img> y __DATA__")
class TestTemplate(unittest.TestCase):
@@ -83,7 +92,8 @@ class TestWrite(unittest.TestCase):
stats = webpage.write(
[REGISTRO, dict(REGISTRO, id="def", p="/otro", u=2)], out)
self.assertEqual(stats, {"sesiones": 2, "proyectos": 2,
- "mensajes": 3, "bloques": 2})
+ "mensajes": 3, "bloques": 2,
+ "memorias": 0})
with open(out, encoding="utf-8") as f:
self.assertEqual(len(PAYLOAD_RE.findall(f.read())), 1)