Para borrar el historial de Claude Code haz una copia y luego vacía el archivo con dos puntos, espacio, mayor que y la ruta ~/.claude/history.jsonl. Ese archivo guarda todos tus prompts en texto plano. No uses mv para reemplazarlo: cambia los permisos de 600 a 644 y lo deja legible por otras cuentas del equipo.
Claude Code guarda cada mensaje que le escribes en un archivo de texto plano de tu disco, y ese archivo no se vacía nunca solo. En mi Mac llevaba 1.906 entradas acumuladas desde mayo, de siete proyectos distintos, y dentro había cinco líneas con una clave de API que yo mismo pegué en el prompt.
Esta es la guía para abrirlo, auditarlo y limpiarlo. Todos los comandos están probados en macOS 26.3 antes de escribirlos aquí, y el paso más importante es el último: la forma obvia de limpiar el archivo le abre los permisos a todo el equipo.
El archivo es este:
~/.claude/history.jsonl
Un JSON por línea. Cada línea guarda cinco campos: display (lo que escribiste), pastedContents (lo que pegaste dentro del prompt), project (la ruta desde la que abriste Claude Code), sessionId y timestamp en milisegundos.
Todos tus proyectos escriben en el mismo archivo. No hay uno por carpeta.
Vas a necesitar jq. En macOS ya viene: la versión de mi máquina es jq-1.7.1-apple, en /usr/bin/jq. Si al escribir which jq no te devuelve nada, instálalo con brew install jq en Mac o con apt install jq en Linux.
ls -lh ~/.claude/history.jsonl
Fíjate en dos cosas del resultado. El tamaño, que en mi caso eran 442 KB, y sobre todo la primera columna: tiene que decir -rw-------. Eso es 600, y significa que el archivo lo lee tu usuario y nadie más. Si ahí ves -rw-r--r--, alguien (probablemente tú, limpiándolo mal) ya le abrió la puerta al resto de cuentas del equipo. Al final del artículo está cómo pasa eso.
Ahora cuenta cuántos mensajes hay:
wc -l ~/.claude/history.jsonl
Nunca hagas cat de este archivo. Son cientos de miles de caracteres en una sola parrafada y no vas a leer nada útil. Saca solo lo que escribiste, de las últimas cinco entradas:
tail -n 5 ~/.claude/history.jsonl | jq -r '.display'
Y para ver desde qué carpetas has estado abriendo Claude Code, ordenado por cantidad:
jq -r '.project' ~/.claude/history.jsonl | sort | uniq -c | sort -rn
Este segundo comando es el que más sorprende. En mi máquina, 1.879 de las 1.906 entradas colgaban de mi carpeta de usuario, no de los proyectos: llevo meses abriendo Claude Code desde el sitio equivocado y el historial es la única prueba que lo dice.
Esta es la parte que justifica todo lo demás. El comando cuenta cuántas entradas contienen algo con formato de credencial, sin imprimir la credencial en pantalla:
jq -r '.display' ~/.claude/history.jsonl | grep -cE 'sk-ant-[A-Za-z0-9_-]{20,}|sk-[A-Za-z0-9]{32,}|AIza[A-Za-z0-9_-]{30,}|gh[pousr]_[A-Za-z0-9]{30,}'
Si te devuelve 0, respira. Si te devuelve otra cosa, ese número es cuántas veces pegaste una clave en el prompt. A mí me devolvió 5.
Lo primero no es borrar la línea: es rotar la clave. Una credencial que ya salió de su sitio no se invalida borrando el archivo donde quedó copiada; se invalida generando una nueva en el panel del proveedor. Borrar primero solo te quita la evidencia.
cp ~/.claude/history.jsonl ~/Desktop/history-$(date +%F).jsonl
Un segundo, 442 KB, y te ahorra el arrepentimiento. Si limpias de más, restauras desde ahí.
Hay tres, de la más suave a la más bruta.
Borrar solo un proyecto del historial y dejar lo demás intacto:
jq -c 'select(.project != "/ruta/al/proyecto")' ~/.claude/history.jsonl > /tmp/h.jsonl && cat /tmp/h.jsonl > ~/.claude/history.jsonl && rm /tmp/h.jsonl
Conservar solo los últimos 30 días y tirar lo viejo. El campo timestamp está en milisegundos, así que la fecha de corte se calcula primero:
CORTE=$(python3 -c 'import time; print(int((time.time()-30*86400)*1000))')
jq -c --argjson corte "$CORTE" 'select(.timestamp >= $corte)' ~/.claude/history.jsonl > /tmp/h.jsonl && cat /tmp/h.jsonl > ~/.claude/history.jsonl && rm /tmp/h.jsonl
En mi archivo esto dejaba 1.057 entradas de las 1.906. Casi la mitad tenía más de un mes.
Vaciarlo del todo, conservando el archivo y sus permisos:
: > ~/.claude/history.jsonl
Después de cualquiera de las tres, comprueba que sigue siendo válido:
wc -l ~/.claude/history.jsonl
Aquí está el detalle que no vas a encontrar en la documentación, y lo comprobé en mi propia máquina antes de escribirlo.
La forma natural de filtrar un archivo en la terminal es escribir el resultado en un temporal y moverlo encima del original:
grep -v algo ~/.claude/history.jsonl > /tmp/h.jsonl && mv /tmp/h.jsonl ~/.claude/history.jsonl
Ese mv funciona. Y te deja el archivo en -rw-r--r--.
Lo que hace mv no es reescribir el contenido: es reemplazar el archivo entero por el nuevo, y el nuevo nació en /tmp con los permisos por defecto de tu sistema. Los 600 originales se pierden en el camino. Acabas de convertir un archivo privado en uno legible por cualquier otra cuenta del equipo, justo en el comando con el que intentabas protegerte.
Por eso todos los comandos del paso 5 usan cat temporal > original en vez de mv: cat escribe dentro del archivo que ya existe y no toca sus permisos. Verificado en las dos direcciones: con mv el archivo terminaba en -rw-r--r--, con cat se quedaba en -rw-------.
Si ya lo hiciste alguna vez, se arregla en una línea:
chmod 600 ~/.claude/history.jsonl
Tres cosas, para que no te quedes con una idea falsa de limpieza.
Y la regla que evita tener que hacer esto: una clave no se pega en el prompt. Va en una variable de entorno o en un archivo que Claude lee cuando la necesita. El prompt se guarda; la variable de entorno, no.