<feed xmlns='http://www.w3.org/2005/Atom'>
<title>claude-logbook/tests/test_cli.py, branch main</title>
<subtitle>Browse your local Claude Code sessions and project memories - terminal table and self-contained HTML</subtitle>
<link rel='alternate' type='text/html' href='http://git.all.ar/pub/claude-logbook/'/>
<entry>
<title>Translate identifiers, comments and docstrings to English</title>
<updated>2026-09-27T02:33:28+00:00</updated>
<author>
<name>Elvis Claros Castro</name>
<email>elvis@claros.ar</email>
</author>
<published>2026-09-27T02:33:28+00:00</published>
<link rel='alternate' type='text/html' href='http://git.all.ar/pub/claude-logbook/commit/?id=cbf81b04e57e03b9e1b646e0d0b7f7c1fd79acc2'/>
<id>cbf81b04e57e03b9e1b646e0d0b7f7c1fd79acc2</id>
<content type='text'>
The CLI output and help stay in Spanish, as documented in the README.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The CLI output and help stay in Spanish, as documented in the README.
</pre>
</div>
</content>
</entry>
<entry>
<title>Renombrar el proyecto a claude-logbook</title>
<updated>2026-08-17T18:14:11+00:00</updated>
<author>
<name>Elvis Claros Castro</name>
<email>elvis@claros.ar</email>
</author>
<published>2026-08-17T18:14:11+00:00</published>
<link rel='alternate' type='text/html' href='http://git.all.ar/pub/claude-logbook/commit/?id=ffe36e782b064a31b7a695ac1372f1329ac79153'/>
<id>ffe36e782b064a31b7a695ac1372f1329ac79153</id>
<content type='text'>
El nombre en español no se encontraba, y la zona de "claude + sessions" ya
está poblada por cosas distintas con las que se confundía:

  gapmiss/claude-sessions        plugin de Obsidian
  kyupid/claude-sessions         monitor de sesiones en curso (PyPI)
  claude-session-manager         wrapper que preserva contexto (PyPI)
  LearnedGeek/claude-recall      búsqueda con SQLite FTS5 (PyPI)

"logbook" cubre las dos mitades — las conversaciones y las memorias — sin
caer en "session manager", y encaja con lo que el proyecto produce: una
bitácora que se abre en cualquier lado.

  claude_sesiones/ → claude_logbook/     y todas las referencias
  ~/.cache/claude-sesiones → ~/.cache/claude-logbook
  el resumen de PyPI pasa a inglés, como el README principal

El comando viejo sigue funcionando: pyproject declara claude-sesiones como
segundo entry point del mismo main, para no rehacer la memoria muscular.

La interfaz sigue en español; solo cambia cómo se llama e instala el paquete.

De paso, memory.py faltaba en la tabla de módulos de los dos READMEs.

Claude-Session: https://claude.ai/code/session_01RmtZ9qBemrc9TncwVTG6ED
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
El nombre en español no se encontraba, y la zona de "claude + sessions" ya
está poblada por cosas distintas con las que se confundía:

  gapmiss/claude-sessions        plugin de Obsidian
  kyupid/claude-sessions         monitor de sesiones en curso (PyPI)
  claude-session-manager         wrapper que preserva contexto (PyPI)
  LearnedGeek/claude-recall      búsqueda con SQLite FTS5 (PyPI)

"logbook" cubre las dos mitades — las conversaciones y las memorias — sin
caer en "session manager", y encaja con lo que el proyecto produce: una
bitácora que se abre en cualquier lado.

  claude_sesiones/ → claude_logbook/     y todas las referencias
  ~/.cache/claude-sesiones → ~/.cache/claude-logbook
  el resumen de PyPI pasa a inglés, como el README principal

El comando viejo sigue funcionando: pyproject declara claude-sesiones como
segundo entry point del mismo main, para no rehacer la memoria muscular.

La interfaz sigue en español; solo cambia cómo se llama e instala el paquete.

De paso, memory.py faltaba en la tabla de módulos de los dos READMEs.

Claude-Session: https://claude.ai/code/session_01RmtZ9qBemrc9TncwVTG6ED
</pre>
</div>
</content>
</entry>
<entry>
<title>Explorar también las memorias de los proyectos</title>
<updated>2026-08-17T18:12:12+00:00</updated>
<author>
<name>Elvis Claros Castro</name>
<email>elvis@claros.ar</email>
</author>
<published>2026-08-17T18:12:12+00:00</published>
<link rel='alternate' type='text/html' href='http://git.all.ar/pub/claude-logbook/commit/?id=0d1fe286ac6ea30b91c15b44c0872b57a864ea7f'/>
<id>0d1fe286ac6ea30b91c15b44c0872b57a864ea7f</id>
<content type='text'>
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 &lt;nombre&gt;)
  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
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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 &lt;nombre&gt;)
  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
</pre>
</div>
</content>
</entry>
<entry>
<title>Preparar el proyecto para publicarlo</title>
<updated>2026-08-16T22:57:17+00:00</updated>
<author>
<name>Elvis Claros Castro</name>
<email>elvis@claros.ar</email>
</author>
<published>2026-08-16T22:57:17+00:00</published>
<link rel='alternate' type='text/html' href='http://git.all.ar/pub/claude-logbook/commit/?id=bd3ca3a04fcd8d882d23deeb3f3a0d6f04b3f93f'/>
<id>bd3ca3a04fcd8d882d23deeb3f3a0d6f04b3f93f</id>
<content type='text'>
El script suelto pasa a ser un paquete instalable, con tests y documentación.
El comportamiento del CLI no cambia: mismos flags, misma salida.

Estructura
  - claude_sesiones/{sessions,terminal,webpage,cli}.py separa parseo,
    presentación, generación del HTML y argumentos. El template pasa a ser
    data del paquete.
  - pyproject.toml con el entry point claude-sesiones, sin dependencias.
  - build.sh se disuelve en `claude-sesiones --html [ARCHIVO]`: el HTML se
    arma en proceso, sin subprocess ni data.json intermedio. `--open` lo
    abre en el navegador.

Arreglos
  - El template no tenía doctype ni &lt;meta charset&gt;: abierto como file://
    quedaba en quirks mode y con la codificación del sistema, así que los
    acentos salían rotos. Tampoco tenía viewport, con lo que en el celular
    se veía a escala de escritorio.
  - `delete_sessions()` se llamaba con un argumento de menos (lo encontró
    el test de borrado).
  - El orden de la tabla comparaba timestamps como strings; ahora compara
    los datetimes ya parseados.
  - `mark()` buscaba el texto crudo dentro del HTML ya escapado, así que
    resaltar algo con &amp; o &lt; nunca encontraba nada. `esc()` no escapaba la
    comilla simple.
  - El caché no tenía versión: al cambiar el esquema del registro se leían
    registros de la forma anterior. Ahora se invalida solo. El temporal
    lleva el pid, para que dos corridas simultáneas no se pisen.
  - `pick()` cortaba el proceso con sys.exit desde adentro; ahora levanta
    SessionError y el código de salida lo decide la CLI.

Mejoras
  - Respeta CLAUDE_CONFIG_DIR.
  - La página tiene botón de tema claro/oscuro que recuerda la elección,
    deep links (#uuid abre esa conversación), atajos de teclado, trampa de
    foco en el lector y aviso si el JS está apagado. Las tres copias de la
    paleta quedaron en dos, una por tema.
  - 92 tests con unittest, sin dependencias, contra árboles de .jsonl
    falsos: nunca tocan ~/.claude. CI en GitHub Actions, Python 3.9 a 3.13.
  - README en inglés y español, con el esquema del JSON y una advertencia
    sobre lo que hay adentro de sesiones.html.
  - Apache-2.0.

Claude-Session: https://claude.ai/code/session_01RmtZ9qBemrc9TncwVTG6ED
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
El script suelto pasa a ser un paquete instalable, con tests y documentación.
El comportamiento del CLI no cambia: mismos flags, misma salida.

Estructura
  - claude_sesiones/{sessions,terminal,webpage,cli}.py separa parseo,
    presentación, generación del HTML y argumentos. El template pasa a ser
    data del paquete.
  - pyproject.toml con el entry point claude-sesiones, sin dependencias.
  - build.sh se disuelve en `claude-sesiones --html [ARCHIVO]`: el HTML se
    arma en proceso, sin subprocess ni data.json intermedio. `--open` lo
    abre en el navegador.

Arreglos
  - El template no tenía doctype ni &lt;meta charset&gt;: abierto como file://
    quedaba en quirks mode y con la codificación del sistema, así que los
    acentos salían rotos. Tampoco tenía viewport, con lo que en el celular
    se veía a escala de escritorio.
  - `delete_sessions()` se llamaba con un argumento de menos (lo encontró
    el test de borrado).
  - El orden de la tabla comparaba timestamps como strings; ahora compara
    los datetimes ya parseados.
  - `mark()` buscaba el texto crudo dentro del HTML ya escapado, así que
    resaltar algo con &amp; o &lt; nunca encontraba nada. `esc()` no escapaba la
    comilla simple.
  - El caché no tenía versión: al cambiar el esquema del registro se leían
    registros de la forma anterior. Ahora se invalida solo. El temporal
    lleva el pid, para que dos corridas simultáneas no se pisen.
  - `pick()` cortaba el proceso con sys.exit desde adentro; ahora levanta
    SessionError y el código de salida lo decide la CLI.

Mejoras
  - Respeta CLAUDE_CONFIG_DIR.
  - La página tiene botón de tema claro/oscuro que recuerda la elección,
    deep links (#uuid abre esa conversación), atajos de teclado, trampa de
    foco en el lector y aviso si el JS está apagado. Las tres copias de la
    paleta quedaron en dos, una por tema.
  - 92 tests con unittest, sin dependencias, contra árboles de .jsonl
    falsos: nunca tocan ~/.claude. CI en GitHub Actions, Python 3.9 a 3.13.
  - README en inglés y español, con el esquema del JSON y una advertencia
    sobre lo que hay adentro de sesiones.html.
  - Apache-2.0.

Claude-Session: https://claude.ai/code/session_01RmtZ9qBemrc9TncwVTG6ED
</pre>
</div>
</content>
</entry>
</feed>
