<feed xmlns='http://www.w3.org/2005/Atom'>
<title>claude-logbook/NOTICE, 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>Unificar la atribución y terminar el renombre</title>
<updated>2026-08-17T18:41:22+00:00</updated>
<author>
<name>Elvis Claros Castro</name>
<email>elvis@claros.ar</email>
</author>
<published>2026-08-17T18:41:22+00:00</published>
<link rel='alternate' type='text/html' href='http://git.all.ar/pub/claude-logbook/commit/?id=0a08eb01eb882004d7094e029490531bb736f61c'/>
<id>0a08eb01eb882004d7094e029490531bb736f61c</id>
<content type='text'>
La titularidad estaba escrita de tres formas distintas: el apéndice de la
licencia decía "2026 dev.all.ar", el NOTICE "2025 Elvis Claros Castro" y el
pyproject solo el nombre. Queda una sola: Copyright 2026 Elvis Claros Castro.

Dos cosas que el renombre se había salteado, las dos por no tener extensión
o por ser una ruta:

  - NOTICE seguía diciendo claude-sesiones en la primera línea.
  - .gitignore excluía "*.html" con una excepción para
    claude_sesiones/template.html, que después del renombre ya no apuntaba a
    nada. El template no se perdió porque los archivos versionados no los
    afecta .gitignore, pero cualquier `git add` futuro lo habría dejado
    afuera en silencio.

Claude-Session: https://claude.ai/code/session_01RmtZ9qBemrc9TncwVTG6ED
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
La titularidad estaba escrita de tres formas distintas: el apéndice de la
licencia decía "2026 dev.all.ar", el NOTICE "2025 Elvis Claros Castro" y el
pyproject solo el nombre. Queda una sola: Copyright 2026 Elvis Claros Castro.

Dos cosas que el renombre se había salteado, las dos por no tener extensión
o por ser una ruta:

  - NOTICE seguía diciendo claude-sesiones en la primera línea.
  - .gitignore excluía "*.html" con una excepción para
    claude_sesiones/template.html, que después del renombre ya no apuntaba a
    nada. El template no se perdió porque los archivos versionados no los
    afecta .gitignore, pero cualquier `git add` futuro lo habría dejado
    afuera en silencio.

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>
