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