
এই প্রকল্পটি কী করে
AI Coding Assistant Data Extraction একাধিক কোডিং অ্যাসিস্ট্যান্টে স্থানীয়ভাবে সংরক্ষিত আপনার কথোপকথন সংগ্রহ করে এবং সেগুলোকে একটি সামঞ্জস্যপূর্ণ JSONL ফরম্যাটে লিখে রাখে। চ্যাটের ইতিহাসের ব্যাকআপ নেওয়া, ব্যক্তিগত বিশ্লেষণ করা, ফাইন-টিউনিং ডেটা প্রস্তুত করা অথবা কোনো অ্যাপ্লিকেশন তার স্থানীয় ডেটাবেস মুছে ফেলার আগে কথোপকথন সংরক্ষণ করার জন্য এটি উপযোগী।
টুলকিটটি macOS, Linux এবং Windows-এ স্টোরেজের অবস্থান স্বয়ংক্রিয়ভাবে শনাক্ত করে। তৃতীয় পক্ষের Python নির্ভরতা ছাড়াই এটি JSONL ফাইল, JSON সেশন ফাইল, Markdown ট্রান্সক্রিপ্ট, SQLite ডেটাবেস এবং নেস্টেড JSON স্টোরেজ ট্রি পড়তে পারে।
সমর্থিত উৎস
প্রকল্পটি বর্তমানে নিচের টুলগুলো সমর্থন করে:
- Claude Code:
~/.claude/projects/-এর অধীনে থাকা JSONL সেশন ফাইল। - Codex CLI:
~/.codex/sessions/-এর অধীনে থাকা JSONL রোলআউট ফাইল। - Cursor: গ্লোবাল ও ওয়ার্কস্পেস স্টোরেজে থাকা SQLite
state.vscdbফাইল। - Windsurf: সর্বোচ্চ সম্ভাব্য নির্ভুলতার হিউরিস্টিক পদ্ধতিতে পার্স করা SQLite স্টোরেজ।
- Trae: সর্বোচ্চ সম্ভাব্য নির্ভুলতার হিউরিস্টিক পদ্ধতিতে পার্স করা SQLite ও JSONL স্টোরেজ।
- Continue:
~/.continue/sessions/-এ থাকা JSON ফাইল। - Gemini CLI:
~/.gemini/tmp/-এর অধীনে থাকা JSON চ্যাট ফাইল। - OpenCode: JSON সেশন, মেসেজ এবং পার্ট ট্রি।
- Cline এবং Roo Code: এডিটর এক্সটেনশন দ্বারা সংরক্ষিত JSON টাস্ক ফোল্ডার।
- Aider: প্রকল্প ডিরেক্টরির ভেতরে
.aider.chat.history.mdনামে থাকা Markdown ট্রান্সক্রিপ্ট।
ইনস্টলেশন ও সেটআপ
রিপোজিটরিটি ক্লোন বা ডাউনলোড করুন, তারপর প্রকল্পের রুট থেকে এর স্ক্রিপ্ট চালান। এক্সট্রাক্টরটি কেবল Python-এর স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে। Python 3.9 বা পরবর্তী সংস্করণ প্রয়োজন, তবে Python 3.10 বা পরবর্তী সংস্করণ ব্যবহারের পরামর্শ দেওয়া হয়।
python --version
মূল এক্সট্রাক্টরের জন্য ভার্চুয়াল এনভায়রনমেন্ট বা নির্ভরতা ইনস্টল করার প্রয়োজন নেই। এক্সট্রাকশনের আগে নিশ্চিত করুন যে সংশ্লিষ্ট AI কোডিং টুলগুলো ওই মেশিনে ব্যবহার করা হয়েছে, যাতে স্থানীয় কথোপকথন ফাইল বা ডেটাবেস থাকে।
প্রথম এক্সট্রাকশন চালান
ইন্টার্যাক্টিভ ওয়ার্কফ্লোর জন্য কোনো আর্গুমেন্ট ছাড়াই মূল স্ক্রিপ্ট চালান। এটি একটি সংখ্যাযুক্ত মেনু দেখাবে, যেখানে আপনি এক্সট্রাক্ট করার উৎস বেছে নিতে পারবেন।
python extract.py
কোনো প্রম্পট ছাড়াই সব সমর্থিত উৎস থেকে এক্সট্রাক্ট করতে --all ব্যবহার করুন।
python extract.py --all
কমা দিয়ে আলাদা করা তালিকা ব্যবহার করে নির্দিষ্ট উৎসও নির্বাচন করতে পারেন। উৎসের আইডিগুলো রিপোজিটরির সোর্স টেবিলে অথবা --list ব্যবহার করে দেখা যায়।
python extract.py --sources cursor,claude_code,aider
কোনো কথোপকথন এক্সট্রাক্ট না করে কোন কোন ইনস্টলেশন শনাক্ত হয়েছে তা দেখতে চালান:
python extract.py --list
যেসব সিস্টেমে এটি উপলভ্য, সেখানে অন্তর্ভুক্ত শেল শর্টকাটটি সব উৎস থেকে একসঙ্গে এক্সট্রাকশন চালায়:
./extract_all.sh
আউটপুট ও অনুসন্ধানের পথ বেছে নিন
ডিফল্টভাবে টাইমস্ট্যাম্পযুক্ত JSONL ফাইল ./extracted_data-তে লেখা হয়। অন্য গন্তব্য বেছে নিতে --output-dir ব্যবহার করুন।
python extract.py --all --output-dir ./chat-backup
বেশিরভাগ টুলের অ্যাপ্লিকেশন-ডেটা ডিরেক্টরি নির্দিষ্ট হওয়ায় এক্সট্রাক্টরটি সাধারণ অপারেটিং-সিস্টেমের অবস্থানগুলোতে স্বয়ংক্রিয়ভাবে অনুসন্ধান করে। Aider ভিন্ন: এটি কেন্দ্রীয় অ্যাপ্লিকেশন-ডেটা ফোল্ডার ব্যবহার না করে প্রতিটি প্রকল্প ডিরেক্টরির ভেতরে একটি Markdown ট্রান্সক্রিপ্ট সংরক্ষণ করে।
আপনার প্রকল্প বা অ্যাপ্লিকেশন ডেটা প্রচলিত অবস্থানের বাইরে থাকলে এক বা একাধিক --search-path অপশন ব্যবহার করুন।
python extract.py --sources aider \
--search-path ~/client-work \
--search-path /mnt/data/repos
সমর্থিত অন্যান্য টুলের অপ্রচলিত ইনস্টলেশনের ক্ষেত্রেও অতিরিক্ত অনুসন্ধান-পথ উপযোগী।
কথোপকথন এক ফাইলে মার্জ করুন
ডিফল্টভাবে নির্বাচিত প্রতিটি উৎসের জন্য আলাদা টাইমস্ট্যাম্পযুক্ত আউটপুট ফাইল তৈরি হয়। সব এক্সট্রাক্ট করা কথোপকথন all_conversations.jsonl-এ যুক্ত করতে --merge যোগ করুন।
python extract.py --all --merge
একটি সাধারণ আউটপুট ডিরেক্টরিতে এ ধরনের ফাইল থাকতে পারে:
extracted_data/
├── claude_code_conversations_20260816_143022.jsonl
├── cursor_conversations_20260816_143022.jsonl
├── aider_conversations_20260816_143022.jsonl
├── cline_conversations_20260816_143022.jsonl
└── all_conversations.jsonl
স্বাভাবিকীকৃত ফরম্যাট বুঝুন
আউটপুট ফাইলের প্রতিটি লাইন একটি কথোপকথন উপস্থাপন করে। সাধারণ কাঠামোতে একটি messages অ্যারে, একটি source শনাক্তকারী এবং একটি session_id থাকে। অন্যান্য ফিল্ড মূল টুলটি কী রেকর্ড করেছে তার ওপর নির্ভর করে।
{
"messages": [
{
"role": "user",
"content": "How do I fix this TypeScript error?",
"code_context": [
{
"file": "/Users/you/project/index.ts",
"code": "const x: string = 123;"
}
],
"timestamp": "2026-01-16T14:30:22Z"
},
{
"role": "assistant",
"content": "The error occurs because a number is assigned to a string type.",
"tool_use": [
{
"name": "edit_file",
"input": {"path": "src/index.ts"}
}
],
"timestamp": "2026-01-16T14:30:25Z"
}
],
"source": "cursor-composer",
"session_id": "c1a2b3...",
"project_path": "/Users/you/project",
"name": "TypeScript Type Error Fix",
"created_at": 1705414222000
}
উৎসে সংরক্ষিত থাকলে code_context, টোকেন ব্যবহার, প্রকল্পের পথ, টাইমস্ট্যাম্প, টুল কল এবং ডিফের মতো ফিল্ড অন্তর্ভুক্ত হয়। যেসব ফিল্ডের ওপর আপনি ধারাবাহিকভাবে নির্ভর করতে পারেন সেগুলো হলো messages, source এবং session_id।
এক্সট্রাকশন কীভাবে কাজ করে
- প্রোগ্রামটি অপারেটিং সিস্টেম শনাক্ত করে এবং সম্ভাব্য ডেটা রুটগুলোর একটি তালিকা তৈরি করে। এর মধ্যে
Application Support,.config,.local/share,%APPDATA%এবং%LOCALAPPDATA%-এর মতো অবস্থান অন্তর্ভুক্ত থাকে। - প্রতিটি সোর্স তার পরিচিত ফোল্ডার ও ফাইলের নামের জন্য ওই রুটগুলো অনুসন্ধান করে।
- উপযুক্ত রিডার JSONL, JSON, SQLite, Markdown অথবা নেস্টেড JSON স্টোরেজ লোড করে।
- এক্সট্র্যাক্টর আবিষ্কৃত রেকর্ডগুলোকে অভিন্ন মেসেজ স্কিমায় স্বাভাবিকীকরণ করে।
- টাইমস্ট্যাম্পযুক্ত JSONL ফাইল আউটপুট ডিরেক্টরিতে লেখা হয়।
SQLite ডেটাবেসগুলো শুধু-পাঠ্য হিসেবে খোলা হয়, যা চলমান এডিটরকে ব্লক করা এড়াতে সহায়তা করে। রিডারগুলোও বিচ্ছিন্নভাবে কাজ করে, তাই কোনো নষ্ট বা লক করা ফাইল পুরো এক্সট্র্যাকশন বন্ধ না করে আংশিক ফলাফল তৈরি করে।
অনথিভুক্ত স্টোরেজ ফরম্যাট পরিচালনা করুন
Cursor, Windsurf এবং Trae স্থিতিশীল স্টোরেজ স্কিমা প্রকাশ করে না। Cursor-এর এক্সট্র্যাক্টর স্পষ্টভাবে কয়েকটি পরিচিত কাঠামো পরিচালনা করে, যার মধ্যে রয়েছে workspace ItemTable চ্যাট, inline composer ডেটা এবং বিভক্ত bubbleId composer ডেটা।
Windsurf এবং Trae extractors/common.py-তে একটি সাধারণ হিউরিস্টিক ব্যবহার করে। এটি চ্যাট-সম্পর্কিত কী অনুসন্ধান করে এবং পার্স করা JSON পরিদর্শন করে এমন অবজেক্ট খুঁজে বের করে, যেগুলো role ও text-সমৃদ্ধ মেসেজ জোড়ার মতো দেখতে। এটি ইচ্ছাকৃতভাবেই সর্বোত্তম প্রচেষ্টা-ভিত্তিক। ভবিষ্যতে কোনো অ্যাপ্লিকেশন আপডেটে স্টোরেজের কাঠামো বদলে গেলে সংশ্লিষ্ট KEY_HINTS মানগুলো আপডেট করার প্রয়োজন হতে পারে।
প্রশিক্ষণ ডেটার জন্য আউটপুট ব্যবহার করুন
স্বাভাবিকীকৃত JSONL ফাইলগুলো Hugging Face datasets লাইব্রেরি দিয়ে লোড করা যায়। নিচের উদাহরণটি সব এক্সট্র্যাক্ট করা ফাইল লোড করে, assistant মেসেজ থাকা কথোপকথনগুলো রাখে এবং একটি টোকেনাইজারের chat template দিয়ে সেগুলো ফরম্যাট করে।
from datasets import load_dataset
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"])
)
def format_chat(example):
return {
"text": tokenizer.apply_chat_template(
example["messages"],
tokenize=False
)
}
dataset = dataset.map(format_chat)
আপনার মডেলের প্রয়োজন অনুযায়ী রেকর্ডগুলো আরও পরিদর্শন ও রূপান্তর করুন। বিভিন্ন সোর্সে ভিন্ন ঐচ্ছিক ফিল্ড থাকতে পারে, তাই প্রশিক্ষণ পাইপলাইনগুলোর প্রধান নির্ভরতা হওয়া উচিত অভিন্ন মেসেজ কাঠামো।
নতুন সোর্স দিয়ে এক্সট্র্যাক্টর সম্প্রসারণ করুন
প্রতিটি সোর্স এক্সট্র্যাক্টর ছোট একটি দুই-ফাংশন ইন্টারফেস অনুসরণ করে। সহজ সূচনা হিসেবে continue_ext.py কপি করুন।
DISPLAY_NAME = "My Tool"
SOURCE_ID = "my_tool"
def find_installations(extra_paths: list[Path] | None = None) -> list[Path]:
"""স্ক্যান করার উপযোগী ডিরেক্টরি বা ফাইল ফেরত দিন।"""
def extract(installations: list[Path]) -> list[dict]:
"""স্বাভাবিকীকৃত কথোপকথন ডিকশনারি ফেরত দিন।"""
মডিউল তৈরি করার পর extract.py-এর REGISTRY তালিকায় সেটি নিবন্ধন করুন। শেয়ার করা রিডার এবং সাধারণ হিউরিস্টিকগুলো extractors/common.py-তে পাওয়া যায়।
সংবেদনশীল কথোপকথনের ডেটা সুরক্ষিত রাখুন
স্থানীয় চ্যাট ইতিহাসে API কী, মালিকানাধীন কোড, ব্যক্তিগত পাথ, ক্লায়েন্টের তথ্য এবং টুল ইনপুট থাকতে পারে। এক্সট্র্যাক্ট করা ফাইল শেয়ার করার বা প্রশিক্ষণে ব্যবহারের আগে সেগুলো পর্যালোচনা করুন।
- সিক্রেটের জন্য আউটপুট স্ক্যান করুন।
code_contextএবংtool_useফিল্ডগুলো সতর্কতার সঙ্গে পর্যালোচনা করুন।- কোনো পাবলিক রিপোজিটরিতে
extracted_data/কমিট করবেন না। - সংবেদনশীল ব্যাকআপ এনক্রিপ্ট করা স্টোরেজে রাখুন।
pip install detect-secrets --break-system-packages
detect-secrets scan extracted_data/*.jsonl
প্রকল্পটি .gitignore-এ extracted_data/ অন্তর্ভুক্ত করে, তবে কিছু প্রকাশ করার আগে আপনার রিপোজিটরি ও ব্যাকআপ ব্যবস্থাগুলো যাচাই করা উচিত।
সমস্যা সমাধান
কোনো ইনস্টলেশন পাওয়া যায়নি
টুলটি ইনস্টল করা নাও থাকতে পারে, এতে কোনো সংরক্ষিত চ্যাট ইতিহাস নাও থাকতে পারে, অথবা এটি অপ্রচলিত কোনো অবস্থান ব্যবহার করতে পারে। প্রথমে --list চালান, তারপর --search-path দিয়ে সংশ্লিষ্ট ডিরেক্টরি দিন। সোর্স এক্সট্র্যাক্টরের SEARCH_DIRS বা APP_DIR_NAMES কনস্ট্যান্টও পরিদর্শন করতে পারেন।
Cursor বা Windsurf লক করা ডেটাবেসের প্রতিবেদন দেয়
এক্সট্র্যাক্টরগুলো শুধু-পাঠ্য SQLite সংযোগ ব্যবহার করে, তাই সাধারণত চলমান অ্যাপ্লিকেশন এক্সট্র্যাকশন আটকে দেবে না। ত্রুটি চলতে থাকলে অ্যাপ্লিকেশনটি বন্ধ করে আবার এক্সট্র্যাকশন চালান।
Windsurf বা Trae শূন্য কথোপকথন তৈরি করে
--list দিয়ে নিশ্চিত করুন যে অ্যাপ্লিকেশন ডিরেক্টরি পাওয়া গেছে। ডিরেক্টরি পাওয়া গেলেও কোনো চ্যাট এক্সট্র্যাক্ট না হলে সংশ্লিষ্ট state.vscdb কী পরিদর্শন করুন এবং উপযুক্ত এক্সট্র্যাক্টরের KEY_HINTS-এ মিলে যাওয়া প্যাটার্ন যোগ করুন।
উপসংহার
AI Coding Assistant Data Extraction অনেক স্টোরেজ ফরম্যাট ও অপারেটিং সিস্টেমজুড়ে স্থানীয় কোডিং কথোপকথন সংরক্ষণ ও স্বাভাবিকীকরণের জন্য নির্ভরতা-মুক্ত একটি উপায় দেয়। python extract.py --list দিয়ে শুরু করুন, প্রয়োজনীয় সোর্স নির্বাচন করুন, সংবেদনশীল তথ্যের জন্য তৈরি হওয়া JSONL পর্যালোচনা করুন, তারপর ব্যাকআপ, বিশ্লেষণ অথবা সতর্কতার সঙ্গে প্রস্তুত করা প্রশিক্ষণ কর্মপ্রবাহে স্বাভাবিকীকৃত রেকর্ড ব্যবহার করুন।
এই টুলকিটটি আপনার নিজের মেশিনে ইনস্টল করা AI টুলের ডেটার জন্য তৈরি। ডেটা এক্সট্র্যাক্ট করার অধিকার থাকা, সংবেদনশীল তথ্য সুরক্ষিত রাখা, প্রতিটি টুলের শর্ত মেনে চলা এবং ফলাফল শেয়ার বা প্রশিক্ষণে ব্যবহারের আগে সিক্রেট স্ক্যান করার দায়িত্ব আপনার।
