blob: 264c5296e8a40d4677d3f2c4be4c67d0034881d7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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
|