aboutsummaryrefslogtreecommitdiffstats
path: root/build.sh
diff options
context:
space:
mode:
authorElvis Claros Castro <elvis@claros.ar>2026-08-16 19:57:17 -0300
committerElvis Claros Castro <elvis@claros.ar>2026-08-16 19:57:17 -0300
commitbd3ca3a04fcd8d882d23deeb3f3a0d6f04b3f93f (patch)
treea9e0dd65940de54c8f956befe9d86b80350bde2e /build.sh
parentda1c60458b0d28e84739475491a3f2d61ed8eff8 (diff)
downloadclaude-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-xbuild.sh47
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