Istoric sesiuni Claude Code, transcripturi și cum le păstrezi
Claude Code păstrează istoricul sesiunilor ca fișiere JSONL și le șterge implicit după 30 de zile. Vezi unde sunt, cum schimbi cleanupPeriodDays, cum repari un resume stricat și cum arhivezi tot.

Pentru istoric sesiuni Claude Code, uită-te la fișierele JSONL din ~/.claude/projects/<project>/<session-id>.jsonl. Claude Code le șterge după ce depășesc cleanupPeriodDays, care este implicit 30. Mărește valoarea în settings.json, oglindește folderul într-o arhivă append-only ca să nu pierzi nimic la curățare și repară transcripturile stricate, cu backup înainte, când claude --resume nu merge.
Unde își păstrează Claude Code istoricul sesiunilor?
Implicit, Claude Code scrie fiecare sesiune în propriul fișier JSONL. În calea de mai sus, <project> este calea directorului tău de lucru, cu fiecare caracter non-alfanumeric înlocuit cu o liniuță, iar ~ este folderul tău home. Fiecare linie este un obiect JSON pentru un mesaj, o folosire de unealtă sau o intrare de metadate. Tot ce trece printr-o unealtă ajunge în fișier ca text simplu: conținut de fișiere, ieșiri de comenzi, text lipit. Dacă vrei să muți tot arborele, variabila de mediu CLAUDE_CONFIG_DIR schimbă rădăcina.
| Cale sub ~/.claude/ | Conține | Se șterge la curățarea după vârstă? |
|---|---|---|
| projects/<project>/<session>.jsonl | Transcriptul complet al conversației | Da |
| projects/<project>/<session>/subagents/ | Transcripturile subagenților | Da, odată cu sesiunea părinte |
| projects/<project>/<session>/tool-results/ | Ieșiri mari de unelte, salvate în fișiere separate | Da |
| file-history/<session>/ | Copii ale fișierelor dinaintea editării, pentru checkpoint-uri | Da |
| history.jsonl | Fiecare prompt scris de tine, cu oră și proiect | Nu |
O avertizare înainte să construiești ceva pe aceste fișiere: Anthropic documentează formatul intrărilor ca intern pentru Claude Code și spune că se schimbă între versiuni, deci uneltele care citesc direct transcripturile se pot strica la o actualizare. Pentru acces stabil, documentația indică /export și câmpul de intrare transcript_path, pe care îl primește un hook SessionEnd. Detaliile sunt pe pagina Anthropic despre gestionarea sesiunilor.
De ce dispar sesiunile vechi din Claude Code?
Claude Code rulează o curățare de retenție. Șterge fișierele din tabelul de mai sus după ce depășesc cleanupPeriodDays. Valoarea implicită este 30 de zile, iar minimul este 1. Curățarea elimină și fișierele de plan, jurnalele de debug pe sesiune, cache-urile de conținut lipit și rapoartele scrise de /insights, iar lista completă e în referința directorului .claude. Nimic nu anunță ștergerea. Afli când încerci să reiei o sesiune din luna trecută, iar Claude Code răspunde This session's saved conversation is no longer on disk.
Curățarea este sărită în două cazuri: la o rulare claude -p --bare și când Claude Code nu poate stabili în siguranță perioada de retenție, de exemplu dacă un fișier de setări nu poate fi parsat. În afara acestor cazuri, consideră că tot ce e mai vechi decât setarea a dispărut.
Cum schimbi cleanupPeriodDays?
Adaugă cheia în fișierul tău de setări de utilizator, ~/.claude/settings.json, ca să se aplice tuturor proiectelor:
{
"cleanupPeriodDays": 365
}
Alege un număr de zile care se potrivește cu cât istoric vrei. Valoarea 0 nu oprește curățarea: dă o eroare de validare. După salvare, rulează /status. Dacă setarea sau fișierul au o eroare, Claude Code afișează acolo un avertisment și pune curățarea în pauză până o repari.
Gândește-te la compromis înainte să pui un număr foarte mare. Transcripturile sunt copii în text simplu ale tuturor lucrurilor pe care Claude Code le-a citit sau rulat, deci pot include secrete apărute în ieșirile comenzilor. O retenție mai lungă înseamnă că acele copii trăiesc mai mult. Rulează claude purge ca să ștergi transcripturile și starea unui proiect mai devreme decât ar face-o curățarea.
De ce eșuează claude --resume la unele sesiuni?
Când ți se pare că claude code resume nu merge, cauza este de obicei una dintre acestea:
| Ce vezi | Cauză probabilă | Ce faci |
|---|---|---|
| No conversation found with session ID | ID-ul nu corespunde niciunui transcript stocat | Verifică ID-ul sau deschide claude --resume și apasă Ctrl+A ca să vezi toate proiectele |
| Failed to resume the conversation | Transcript corupt sau lipsă, ori o problemă de sistem de fișiere | Confirmă că fișierul .jsonl există și poate fi citit, apoi repară-l (mai jos) |
| Eroare EBADF pe Windows | Antivirus sau software de blocare a fișierelor care atinge transcriptul | Repornește Claude Code și verifică dacă antivirusul scanează folderul ~/.claude |
| This session's saved conversation is no longer on disk | Curățarea de retenție l-a șters | Restaurează-l dintr-o arhivă |
| API Error 400 despre blocuri de thinking | Un bloc de thinking gol în mesajele salvate | Repară transcriptul |
Ultimul rând vine din README-ul Claude Session Guard. Claude Code scrie un răspuns al asistentului ca mai multe linii de transcript care au același message.id și le îmbină la reluare. Dacă oricare dintre ele conține un bloc de thinking cu textul gol sau doar spații, reluarea sesiunii se oprește cu each thinking block must contain non-whitespace thinking. O a doua cauză este amestecarea copiilor: Anthropic notează că reluarea aceleiași sesiuni în două terminale, fără fork, întrețese mesajele ambelor în același transcript. Folosește /branch sau --fork-session când vrei o a doua linie de lucru.
Două trucuri de reluare ajută aici. claude --resume <session-id> merge din orice director, pentru că Claude Code caută întâi în proiectul curent, apoi în toate celelalte proiecte de pe mașină. Iar claude --resume acceptă și calea absolută a unui transcript .jsonl, așa deschizi o copie arhivată.
Cum păstrezi o arhivă permanentă a transcripturilor Claude Code?
Un cleanupPeriodDays mai mare doar amână pierderea. O arhivă o elimină. Claude Session Guard este un plugin Claude Code cu licență MIT, scris doar cu biblioteca standard Python 3, care ține o oglindă append-only a fiecărui transcript, inclusiv a celor de subagenți și workflow-uri. Îl pui la punct în trei pași:
- Instalează pluginul din Claude Code:
/plugin marketplace add FiredMosquito831/claude-session-guard /plugin install claude-session-guard@claude-session-guard - Construiește o dată arhiva inițială și baza de date de utilizare. README-ul spune că durează câteva minute pe un istoric mare:
sh "$CLAUDE_PLUGIN_ROOT/scripts/run.sh" session_archive sync --full sh "$CLAUDE_PLUGIN_ROOT/scripts/run.sh" usage_db build sh "$CLAUDE_PLUGIN_ROOT/scripts/run.sh" usage_db export - Lasă-l în pace. Hook-urile țin arhiva la zi. O verifici oricând cu
session_archive verify, care răspunde dacă ceva îți mănâncă datele de sesiune, iarsession_archive restorepune la loc sesiunile pierdute.
Arhiva stă în ~/.claude/session-archive/, cu arborele oglindit transcripts/, un fișier SQLite usage.db, un usage-ledger.jsonl append-only și un folder reports/ cu fișiere CSV. Este o copie reală, deci crește odată cu istoricul și poate ajunge la câțiva GB. Pluginul evită intenționat hardlink-urile, pentru că un hardlink împarte spațiul cu fișierul viu, iar o trunchiere ar distruge ambele copii.
Poți face o variantă proprie cu un hook SessionEnd sau cu o copiere programată a lui ~/.claude/projects. Atenție la două capcane. O suprascriere simplă înlocuiește un fișier bun din arhivă cu unul trunchiat din folderul viu, iar o copie doar a fișierelor .jsonl de la primul nivel pierde folderele subagents/.
Cum repari în siguranță un transcript corupt?
Rescrierea unui transcript e riscantă, pentru că Claude Code poate adăuga în același fișier chiar atunci. Orice unealtă de reparare ar trebui să respecte aceste reguli. Ele corespund proprietăților de siguranță pe care README-ul Claude Session Guard le listează pentru pasul jsonl_repair:
- Fă mai întâi un backup complet. Pluginul nu oferă nicio cale de a-l sări.
- Oferă un dry run care raportează problemele și nu scrie nimic.
- Sari peste transcripturile active sau scrise recent, pentru că rescrierea unui fișier sub ochii celui care scrie în el îl trunchiază.
- Oprește rescrierea dacă fișierul s-a schimbat între scanare și scriere.
- Înlocuiește fișierul atomic: scrie un fișier temporar, fă fsync, apoi redenumește-l peste original.
- Arhivează fiecare linie eliminată înainte de rescriere și renunță la rescriere dacă arhivarea eșuează.
R="sh $CLAUDE_PLUGIN_ROOT/scripts/run.sh"
$R jsonl_repair --all --dry-run # JSONL malformat, doar raport
$R api_repair scan # transcripturi respinse de API la reluare, doar raport
$R api_repair fix <session-id> # repară o sesiune
$R api_repair fix --all # repară tot ce se poate
jsonl_repair păstrează liniile neparsabile exact cum sunt și elimină doar duplicatele exacte și liniile formate numai din caractere de control, toate recuperabile din backups/sessions/removed-lines-archive.jsonl. api_repair țintește blocul de thinking gol: îl elimină (sau întreaga linie, dacă blocul era tot ce conținea), reface lanțul parentUuid și arhivează ce a scos. Rulează la SessionEnd, singurul moment în care se știe sigur că nimeni nu scrie în transcript, iar o trecere la SessionStart prinde ce a scăpat.
Cum analizezi consumul de tokenuri Claude Code pe model, în timp?
Analiza consumului de tokenuri Claude Code are nevoie de un depozit care supraviețuiește curățării. Claude Session Guard citește arhiva sa în SQLite, un rând per eveniment de utilizare, și exportă agregări CSV pe oră, zi, săptămână și lună, fiecare cu detaliu pe model, plus sessions.csv, models.csv și un fișier cu ferestrele rulante de 5 ore ale Claude.
$R usage_db stats # totaluri generale
$R usage_db daily 30 # ultimele 30 de zile
$R usage_db models # tokeni și cost pe model
$R usage_db sessions 40 # cronologia sesiunilor
$R usage_db sql "SELECT name FROM sqlite_master WHERE type='view'" # listează view-urile
La numărat greșesc cele mai multe scripturi. Claude Code împarte un răspuns al asistentului pe mai multe linii (thinking, text, fiecare apel de unealtă) și repetă același obiect usage pe fiecare, deci suma pe linii numără în plus. În reconcilierea din README, 729.912 linii de transcript s-au redus la 339.927 de mesaje logice, iar o sumă naivă pe linii a ieșit de 2,03 ori totalul real. Pluginul deduplică de două ori, pe linie și pe mesaj, și păstrează rândul cu cel mai mare total de tokeni, pentru că obiectul de utilizare crește pe măsură ce răspunsul curge.
Costul cere încă un pas, pentru că Claude Code nu înregistrează o sumă în dolari în transcripturi. Pluginul o calculează din numărul de tokeni și din tarifele din tabelul model_pricing, în USD per milion de tokeni, cu coloane separate pentru scrieri în cache de 5 minute și de 1 oră și pentru citiri din cache. Un model fără rând costă 0. Asta semnalează lipsa unui tarif: modelele din planuri gratuite și cele de la terți trecute printr-un proxy apar așa până adaugi tarife. Coloanele de cache contează aici, cum arată ghidul nostru despre prompt caching. În interiorul unei sesiuni, /usage dă o estimare la preț de listă doar pentru acea sesiune. Unealta open source ccusage este un bun însoțitor. Conform README-ului Session Guard, citește folderul viu ~/.claude/projects, deci ce a șters curățarea lipsește din rapoartele ei. Folosește-le pe amândouă. Dacă treci Claude Code printr-un gateway precum My Claude Code, jurnalul lui de cereri înregistrează costul fiecărei cereri, pe partea gateway-ului.
Cum se leagă Danube Labs de asta?
Danube Labs este un studio de software și AI condus de fondator, în București. A construit Claude Session Guard și l-a publicat ca open source, iar codul e pe GitHub. Aceleași obiceiuri, backup înainte de rescriere, scrieri atomice și cifre care se reconciliază, intră în automatizările pe care le facem pentru clienți. Dacă ai un flux de lucru care merită o asemenea grijă, programează un apel introductiv gratuit.
Întrebări frecvente
- Unde stochează Claude Code istoricul conversațiilor?
- În fișiere JSONL la ~/.claude/projects/<project>/<session-id>.jsonl, câte unul pe sesiune, unde <project> este calea directorului tău de lucru cu caracterele non-alfanumerice înlocuite prin liniuțe. Transcripturile subagenților stau într-un subfolder numit după sesiune. Prompturile scrise de tine sunt logate și în ~/.claude/history.jsonl, pe care curățarea după vârstă nu îl șterge.
- Cât timp păstrează Claude Code sesiunile?
- Implicit 30 de zile. Claude Code șterge transcripturile și fișierele de sesiune asociate după ce depășesc cleanupPeriodDays, care este implicit 30 și are minimul 1. Valoarea 0 dă o eroare de validare. Schimbă setarea în settings.json și folosește o arhivă, de exemplu Claude Session Guard, dacă vrei ca istoricul să depășească acea setare.
- Cum opresc Claude Code să șteargă sesiunile vechi?
- Mărește cleanupPeriodDays în ~/.claude/settings.json, de exemplu la 365, apoi verifică /status pentru avertismente de setări. Pentru o copie permanentă, ține o oglindă append-only a lui ~/.claude/projects, exact ce face Claude Session Guard. Transcripturile sunt text simplu și pot conține secrete din ieșirile comenzilor, deci o retenție mai lungă înseamnă și o expunere mai lungă.
- De ce nu merge claude --resume?
- Cauzele frecvente sunt un transcript șters, un ID de sesiune greșit, un fișier de transcript corupt, un antivirus care încurcă fișierul pe Windows și un bloc de thinking gol care face API-ul să întoarcă eroarea 400 la reluare. Verifică dacă fișierul .jsonl există, apasă Ctrl+A în selector ca să lărgești lista și repară transcriptul, cu backup, înainte să încerci din nou.
- Pot relua o sesiune Claude Code dintr-un alt folder?
- Da. claude --resume <session-id> merge din orice director: Claude Code caută întâi în proiectul curent și în worktree-urile lui, apoi în toate celelalte proiecte de pe mașină. Îi poți da lui claude --resume și calea absolută a unui fișier de transcript, de exemplu o copie arhivată. Opțiunea claude --continue este cea legată de directorul curent.
- Cum văd consumul de tokenuri Claude Code pe model?
- În interiorul unei sesiuni, /usage arată tokenii și un cost estimat la preț de listă, pe model, pentru acea sesiune. Pentru istoric, construiește un depozit din transcripturile tale. Claude Session Guard ține o bază SQLite și scrie agregări CSV pe oră, zi, săptămână și lună, cu detaliu pe model, deduplicate astfel încât fiecare răspuns să fie numărat o singură dată.


