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 /tests/test_terminal.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 'tests/test_terminal.py')
| -rw-r--r-- | tests/test_terminal.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/tests/test_terminal.py b/tests/test_terminal.py index fdb9fc8..9f57935 100644 --- a/tests/test_terminal.py +++ b/tests/test_terminal.py @@ -138,5 +138,81 @@ class TestSalida(unittest.TestCase): "cd /a b && claude --resume xyz") +class TestMemorias(unittest.TestCase): + def memoria(self, **kw): + m = { + "name": "deploy-docker", "file": "deploy-docker.md", + "p": "/home/u/proj", "desc": "Cómo se despliega", "ty": "project", + "src": "abcdef01-2345-6789-abcd-ef0123456789", + "body": "Se despliega con `make up`.", "ln": ["roles-db"], + "k": 1.2, "l": ago(1), "ix": True, "hix": True, + } + m.update(kw) + return m + + def test_tabla_sin_color_no_tiene_ansi(self): + buf = io.StringIO() + T.print_memories([self.memoria()], T.Style(False), NOW, buf, width=120) + out = buf.getvalue() + self.assertNotIn("\x1b", out) + self.assertEqual(len(out.strip().split("\n")), 2) + self.assertIn("deploy-docker", out) + self.assertIn("project", out) + self.assertIn("Cómo se despliega", out) + + def test_tabla_angosta_esconde_columnas(self): + buf = io.StringIO() + T.print_memories([self.memoria()], T.Style(False), NOW, buf, width=70) + out = buf.getvalue() + self.assertIn("deploy-docker", out) + self.assertNotIn("Cómo se despliega", out) + + def test_marca_las_que_no_estan_en_el_indice(self): + buf = io.StringIO() + T.print_memories([self.memoria(ix=False)], T.Style(False), NOW, buf, + width=120) + self.assertIn("*", buf.getvalue()) + + def test_lectura_trae_cuerpo_enlaces_y_origen(self): + buf = io.StringIO() + T.print_memory(self.memoria(), T.Style(False), buf, path="/x/y.md") + out = buf.getvalue() + self.assertIn("Se despliega con", out) + self.assertIn("roles-db", out) + self.assertIn("abcdef01", out) + self.assertIn("/x/y.md", out) + + def test_lectura_avisa_si_no_esta_indexada(self): + buf = io.StringIO() + T.print_memory(self.memoria(ix=False), T.Style(False), buf) + self.assertIn("no figura en MEMORY.md", buf.getvalue()) + + def test_lectura_avisa_si_el_proyecto_no_tiene_indice(self): + buf = io.StringIO() + T.print_memory(self.memoria(ix=False, hix=False), T.Style(False), buf) + self.assertIn("no tiene MEMORY.md", buf.getvalue()) + + def test_auditoria_vacia_no_imprime_nada(self): + buf = io.StringIO() + total = T.print_audit({}, T.Style(False), buf) + self.assertEqual(total, 0) + self.assertEqual(buf.getvalue(), "") + + def test_auditoria_cuenta_todos_los_bloques(self): + buf = io.StringIO() + m = self.memoria() + total = T.print_audit({ + "sin_indice": [m], + "sin_listar": [m], + "indice_fantasma": [("-p", "fantasma")], + "enlaces_rotos": [(m, "roto")], + "origen_perdido": [m], + }, T.Style(False), buf) + out = buf.getvalue() + self.assertEqual(total, 5) + self.assertIn("fantasma", out) + self.assertIn("[[roto]]", out) + + if __name__ == "__main__": unittest.main() |