← Artículos

Borrar el historial de Claude Code sin romper los permisos

· 7 min de lectura

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.

Dónde está el historial de Claude Code

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.

Paso 1: mira el tamaño y los permisos

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

Paso 2: léelo sin abrirlo entero

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.

Paso 3: busca claves de API dentro

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.

Paso 4: haz la copia antes de tocar nada

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í.

Paso 5: limpia, en la forma que necesites

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

El error que abre tu historial al resto del equipo

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

Qué NO borra esto

Tres cosas, para que no te quedes con una idea falsa de limpieza.

  1. Los transcripts completos siguen ahí. El historial es solo el índice de tus prompts. Las conversaciones enteras viven en ~/.claude/projects, un archivo por sesión. En mi máquina son 906 archivos y 4,5 GB, contra los 442 KB del historial. Mídelo tú con du -sh ~/.claude/projects.
  2. El comando /clear no toca este archivo. Limpia el contexto de la conversación en curso; el historial se sigue escribiendo igual.
  3. Pierdes la flecha arriba. Este es el costo real de vaciarlo entero y casi nadie lo menciona: ese archivo es lo que te devuelve el prompt largo que escribiste hace tres semanas. Por eso las opciones por proyecto y por fecha del paso 5 son mejores que vaciarlo del todo.

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.

Preguntas frecuentes

¿Cómo borro el historial de Claude Code?
Primero haz una copia con cp del archivo ~/.claude/history.jsonl, y luego vacíalo redirigiendo la salida vacía sobre él con dos puntos, espacio y el operador de redirección. Ese método conserva el archivo y sus permisos 600 originales. Si prefieres no perderlo todo, puedes filtrar solo un proyecto o quedarte con los últimos treinta días usando jq.
¿Por qué no debo usar mv para limpiar el historial?
Porque mv no reescribe el contenido: sustituye el archivo entero por el temporal, y el temporal nació en /tmp con los permisos por defecto del sistema. Lo comprobé en mi máquina: el archivo pasaba de -rw------- a -rw-r--r--, o sea de privado a legible por cualquier otra cuenta del equipo. Usa cat temporal mayor que original, que escribe dentro del archivo existente y no toca sus permisos.
¿Cómo sé si dejé una clave de API en el historial de Claude Code?
Pasa el campo display por grep con un patrón de credenciales conocidas y cuenta las coincidencias en vez de imprimirlas, usando la opción -c de grep. Los prefijos que conviene buscar son sk-ant-, sk-, AIza y los tokens de GitHub que empiezan por gh. Si el resultado es distinto de cero, lo primero es rotar esa clave en el panel del proveedor, no borrar la línea.
¿Borrar el historial borra también mis conversaciones con Claude Code?
No. El historial es solo el índice de los prompts que escribiste. Las conversaciones completas se guardan aparte, en la carpeta ~/.claude/projects, con un archivo por sesión. En mi máquina eso eran 906 archivos y 4,5 GB, frente a los 442 KB del historial. Vaciar el historial no toca ni un byte de esa carpeta.
¿Qué pierdo si vacío el historial de Claude Code?
Pierdes la navegación con la flecha arriba dentro de Claude Code. Ese archivo es lo que te devuelve un prompt largo que escribiste semanas atrás y no recuerdas cómo formulaste. Es un costo real y por eso suele convenir más filtrar por proyecto o quedarse con los últimos treinta días que vaciarlo entero.

Fuentes

MÁQUINA IA

La comunidad donde dejas de usar IA y empiezas a dirigirla.

Entrar a la comunidad →