diff options
| author | Elvis Claros Castro <elvis@claros.ar> | 2026-08-16 19:56:31 -0300 |
|---|---|---|
| committer | Elvis Claros Castro <elvis@claros.ar> | 2026-08-16 19:56:31 -0300 |
| commit | da1c60458b0d28e84739475491a3f2d61ed8eff8 (patch) | |
| tree | c9fda665784d70d2a3075d01f84f3ac6d49ab5bc /build.sh | |
| download | claude-logbook-da1c60458b0d28e84739475491a3f2d61ed8eff8.tar.gz claude-logbook-da1c60458b0d28e84739475491a3f2d61ed8eff8.zip | |
Estado inicial: el explorador como script único
Punto de partida antes de preparar el repo para publicarlo: el CLI en un
solo archivo, el template y el build.sh que los pega.
Los datos generados (data.json, sesiones.html) quedan fuera desde el primer
commit: son transcripciones completas de conversaciones privadas.
Claude-Session: https://claude.ai/code/session_01RmtZ9qBemrc9TncwVTG6ED
Diffstat (limited to 'build.sh')
| -rwxr-xr-x | build.sh | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..264c529 --- /dev/null +++ b/build.sh @@ -0,0 +1,47 @@ +#!/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 |