diff options
| author | Elvis Claros Castro <elvis@claros.ar> | 2026-08-16 19:57:17 -0300 |
|---|---|---|
| committer | Elvis Claros Castro <elvis@claros.ar> | 2026-08-16 19:57:17 -0300 |
| commit | bd3ca3a04fcd8d882d23deeb3f3a0d6f04b3f93f (patch) | |
| tree | a9e0dd65940de54c8f956befe9d86b80350bde2e /build.sh | |
| parent | da1c60458b0d28e84739475491a3f2d61ed8eff8 (diff) | |
| download | claude-logbook-bd3ca3a04fcd8d882d23deeb3f3a0d6f04b3f93f.tar.gz claude-logbook-bd3ca3a04fcd8d882d23deeb3f3a0d6f04b3f93f.zip | |
Preparar el proyecto para publicarlo
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 <meta charset>: 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 & o < 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
Diffstat (limited to 'build.sh')
| -rwxr-xr-x | build.sh | 47 |
1 files changed, 0 insertions, 47 deletions
diff --git a/build.sh b/build.sh deleted file mode 100755 index 264c529..0000000 --- a/build.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash -# Genera sesiones.html a partir de los logs en ~/.claude/projects/ -# -# ./build.sh genera sesiones.html -# ./build.sh --open genera y abre en el navegador -# -# El HTML que sale es autocontenido: los datos y las transcripciones van -# embebidos adentro, no necesita red ni servidor. Se abre con doble clic. - -set -euo pipefail - -cd "$(dirname "$0")" - -# El CLI es la única implementación del parseo; el HTML consume su --json. -./claude-sesiones --json > data.json - -python3 - <<'PY' -import json - -template = open("template.html").read() -raw = open("data.json").read() - -# El payload vive dentro de un <script type="application/json">, que el parser -# de HTML corta en el primer "</script". Escapamos "</" como "<\/" — es un -# escape válido de JSON, así que JSON.parse lo devuelve intacto. -payload = raw.replace("</", "<\\/") - -# Ojo: no se puede verificar buscando __DATA__ en la salida. Estas mismas -# sesiones incluyen conversaciones sobre este script, así que el payload -# contiene el marcador como texto. Validamos el template antes de sustituir. -if template.count("__DATA__") != 1: - raise SystemExit("error: el template debe tener exactamente un __DATA__") - -html = template.replace("__DATA__", payload) - -open("sesiones.html", "w").write(html) - -s = json.loads(raw) -print(f"{len(s)} sesiones · " - f"{len({x['p'] for x in s})} proyectos · " - f"{sum(x['u'] for x in s)} mensajes · " - f"{sum(len(x['c']) for x in s)} bloques de transcripción → sesiones.html") -PY - -if [[ "${1:-}" == "--open" ]]; then - xdg-open sesiones.html >/dev/null 2>&1 & -fi |