Come estrarre tutta la cronologia chat AI da Cursor, Claude e Windsurf
Se hai scritto attivamente codice con assistenti AI nell'ultimo anno o due, gigabyte di contesto nascosto si sono accumulati sul tuo disco. Questo include centinaia di conversazioni, sessioni di debug, diff generate, modifiche e snippet di contesto. Il problema è che ogni strumento nasconde questi dati nei propri angoli. Cursor memorizza la cronologia in database SQLite, Claude Code scrive file JSONL di sessione separati, e Continue e Gemini CLI conservano tutto in cartelle di sistema profonde.
Il repository ai-data-extraction dello sviluppatore 0xSero risolve un problema semplice: trova tutti i database locali degli assistenti, li analizza ed esporta un dataset pulito in un formato JSONL unificato.
Perché estrarre questi dati
Il motivo principale è il fine-tuning dei tuoi modelli. Quando gli sviluppatori ottimizzano modelli aperti come Qwen2.5-Coder o DeepSeek-Coder per il loro stack, i dataset sintetici spesso non bastano. Le tue conversazioni reali con un assistente contengono dati unici: come esattamente formuli i task, quali errori correggi, quali file passi nel contesto, e quali opzioni di modifica accetti effettivamente.
Il secondo motivo è più pratico: semplice backup e ricerca locale. Trovare una sessione di tre mesi fa nell'interfaccia di Cursor o Trae può essere difficile, specialmente se il progetto è chiuso o migrato.
Cosa può fare la raccolta di script
Il progetto è una raccolta di piccoli script Python. Un dettaglio interessante: non ci sono dipendenze esterne. Hai solo bisogno di Python 3.6+ standard, e gli script usano i moduli built-in sqlite3, json, pathlib e os.
Il set supporta otto strumenti popolari:
- Cursor (incluse versioni di chat più vecchie, Composer v1 e v2 con tabelle
cursorDiskKV) - Claude Code e Claude Desktop
- Windsurf
- Trae
- Continue
- OpenCode (la versione desktop Tauri e CLI)
- Google Gemini CLI
- Codex
Gli script rilevano automaticamente il sistema operativo (macOS, Linux o Windows), individuano le directory di lavoro degli editor ed estraggono la cronologia strutturata.
Come funziona il formato di esportazione
Ogni riga nel file JSONL risultante è una sessione completa separata. Gli script non estraggono testo raw ma uno snapshot completo del contesto:
{
"messages": [
{
"role": "user",
"content": "Как исправить эту ошибку типизации в TypeScript?",
"code_context": [
{
"file": "/Users/user/project/src/index.ts",
"code": "const x: string = 123;",
"range": {
"selectionStartLineNumber": 10,
"positionLineNumber": 10
}
}
],
"timestamp": "2025-01-16T14:30:22.123Z"
},
{
"role": "assistant",
"content": "Ошибка возникает из-за присвоения числа переменной строкового типа...",
"suggested_diffs": [],
"model": "claude-sonnet-4-5",
"timestamp": "2025-01-16T14:30:25.456Z"
}
],
"source": "cursor-composer",
"name": "TypeScript Type Error Fix",
"created_at": 1705414222000
}
Include le chiamate di sistema degli strumenti, i risultati dell'esecuzione dei comandi, le diff applicate e i metadati specifici del modello.
Avvio rapido
Clona il repository ed esegui lo script desiderato:
git clone https://github.com/0xSero/ai-data-extraction.git
cd ai-data-extraction
# Выгрузить только Cursor
python3 extract_cursor.py
# Или вытащить данные сразу со всех установленных инструментов
./extract_all.sh
Tutti i risultati finiranno nella cartella extracted_data/ come file separati con timestamp.
Puoi unire tutto in un singolo file con un comando di sistema:
cat extracted_data/*.jsonl > all_conversations.jsonl
Preparazione per l'addestramento tramite Unsloth
Dopo l'esportazione, il dataset può essere facilmente alimentato a librerie di fine-tuning. Ad esempio, la combinazione di datasets di Hugging Face e Unsloth recepisce questo JSONL direttamente:
from datasets import load_dataset
from unsloth import FastLanguageModel
# Загружаем собранные сессии
dataset = load_dataset('json', data_files='extracted_data/*.jsonl', split='train')
# Оставляем только сессии с ответами ассистента
dataset = dataset.filter(lambda x: any(m['role'] == 'assistant' for m in x['messages']))
model, tokenizer = FastLanguageModel.from_pretrained(
"unsloth/qwen2.5-coder-7b-instruct",
max_seq_length=4096,
load_in_4bit=True,
)
def format_chat(example):
return {
'text': tokenizer.apply_chat_template(
example['messages'],
tokenize=False
)
}
dataset = dataset.map(format_chat)
Sicurezza e considerazioni
Prima di inviare il dataset risultante al cloud o a un server esterno, controlla il suo contenuto. La tua cronologia delle conversazioni conterrà inevitabilmente frammenti di codice privato, percorsi della home directory e a volte chiavi API dimenticate.
L'autore del progetto consiglia di far passare i file attraverso un rilevatore di secret:
pip install detect-secrets
detect-secrets scan extracted_data/*.jsonl
Se il database dell'editor è bloccato durante l'esportazione (situazione comune con SQLite quando Cursor è aperto), chiudi semplicemente l'editor prima di eseguire lo script.
A chi sarà utile questo repository
Il progetto è utile per ingegneri ML che raccolgono dati per modelli di codice locali e sviluppatori che vogliono preservare un archivio del loro lavoro AI nel caso cambino editor. Il codice degli script è semplice e aperto, rendendo facile estenderlo per qualsiasi plugin raro o fork personalizzato di VS Code.
Progetti correlati