آموزش ازسرگیری نشست در Claude Code و دسترسی به تاریخچه
برای ازسرگیری نشست در Claude Code از دستور claude resume استفاده کنید. تمام تاریخچه گفتوگوها به صورت فایلهای متنی در دایرکتوری پروژه ذخیره میشوند و قابل بازیابی هستند.
نحوه ازسرگیری یک نشست Claude Code
برای ازسرگیری یک نشست Claude Code، دستور claude --continue را برای آخرین گفتوگو در دایرکتوری فعلی اجرا کنید، یا از claude --resume برای انتخاب یک گفتوگوی قدیمیتر از لیست استفاده نمایید. از داخل نشستی که در حال اجرا است، دستور /resume شما را بدون خروج از برنامه به گفتوگوی دیگری منتقل میکند. فرمهای کوتاه این دستورات -c و -r هستند.
claude --continue
claude --resume
claude --resume auth-refactorاگر نام نشست یا شناسه آن را میدانید، آن را به عنوان آرگومان وارد کنید تا Claude Code بدون نمایش لیست انتخاب، مستقیماً به همان نشست برود.
تمام موارد زیر با مستندات رسمی نشست تا اوت 2026 مطابقت دارد. Claude Code بهطور مکرر منتشر میشود و نام فلگها و میانبرهای صفحهکلید ممکن است بین نسخهها تغییر کنند؛ بنابراین اگر موردی در اینجا با آنچه در ترمینال خود میبینید متفاوت بود، claude --help و آن صفحه را به عنوان مرجع معتبر در نظر بگیرید.
نشست (session) دقیقاً چیست
یک نشست، یک گفتگوی ذخیرهشده است که به دایرکتوری پروژه متصل میشود. این نشست کل تاریخچه پیامها، شامل فراخوانی ابزارهایی که Claude انجام داده و نتایجی که آن فراخوانیها برگرداندهاند را در خود نگه میدارد. Claude Code این اطلاعات را در حین کار بهطور مداوم روی دیسک مینویسد (نه فقط یکبار در پایان کار)؛ بنابراین گفتگو با بستن ترمینال یا قطع اتصال SSH از بین نمیرود.
ازسرگیری (resuming) نشست، چیزی فراتر از متن را بازیابی میکند. تاریخچه گفتگو بهطور کامل بازمیگردد، به همراه مدلی که نشست از آن استفاده میکرد و زیرعاملی (subagent) که اگر از --agent استفاده کرده باشید، نشست با آن شروع شده بود. حالت مجوزها (permission mode) نیز بازمیگردد، با استثناهایی که برای امنیت اعمال شدهاند: حالت plan و حالت bypass-permissions هرگز بازیابی نمیشوند؛ بنابراین نشستی که در یکی از این حالتها بوده، در حالتی ازسرگرفته میشود که یک نشست جدید با آن شروع میشد.
برخی موارد بازنمیگردند، زیرا هنگام راهاندازی بهصورت flag ارسال شده بودند و بخشی از وضعیت ذخیرهشده نیستند. دایرکتوریهایی که با --add-dir اضافه شدهاند و گزینههایی مانند --mcp-config، --settings و --plugin-dir باید هنگام ادامهدادن session دوباره ارسال شوند. فایلهای تنظیماتی مانند settings.json هنگام راهاندازی دوباره خوانده میشوند؛ بنابراین هر چیزی که در آنها قرار دارد، نیازی به تکرار ندارد. اعتبارنامهها نیز در همین دسته قرار میگیرند: Claude Code هنگام راهاندازی و بر اساس login شما و محیط اجرایی، روش احراز هویت را تعیین میکند و آن را همراه conversation بازیابی نمیکند. بنابراین اگر در shell مربوط به VPS که session را در آن ادامه میدهید، یک ANTHROPIC_API_KEY اضافی وارد شده باشد، با خطای کلید API نامعتبر مواجه خواهید شد؛ حتی اگر session در آخرین اجرا بدون مشکل کار کرده باشد.
چرا تاریخچه نشستها در VPS اهمیت بیشتری دارد
این واقعیتی است که بسیاری را غافلگیر میکند. رونوشت (transcript) روی همان ماشینی نوشته میشود که عامل (agent) در آن اجرا شده است. این داده در حساب کاربری شما نگهداری نمیشود و با فضای ابری همگامسازی نمیگردد؛ بلکه فایلی روی دیسک همان دستگاه است.
بنابراین، نشستی که در یک پنجره tmux روی VPS خود رها کردهاید، در انتخابگر (picker) لپتاپ شما ظاهر نمیشود و نشستی که در لپتاپ دارید نیز در VPS دیده نخواهد شد. هیچ دادهای بین آنها جابهجا نمیشود. اگر به شیوهای کار میکنید که اکثر افراد هنگام اجرای Claude Code در tmux روی یک VPS انجام میدهند، سرور همان جایی است که تاریخچه واقعی گفتگوهای شما در آن انباشته میشود و انتخابگری که بهصورت محلی میبینید، مجموعه متفاوت و بسیار کوچکتری را نمایش میدهد.
همین جداسازی در رابطهای کاربری مختلف نیز صدق میکند. اپلیکیشن دسکتاپ و افزونه VS Code هر کدام تاریخچه نشستهای خاص خود را نگه میدارند و هیچکدام از آنها تاریخچه CLI نیستند. Claude Code در وب نیز تاریخچه مستقل خود را دارد. Cowork در جایگاه دورتری قرار میگیرد، زیرا بهجای سختافزاری که مالک آن هستید، درون یک sandbox متعلق به Anthropic اجرا میشود؛ بنابراین اگر در حال سنجش Cowork در برابر Claude Code هستید، محل ذخیره نهایی رونوشت بخشی از تصمیمگیری شماست.
در محدوده یک ماشین، جستجو گستردهتر از آن چیزی است که تصور میکنید. claude --resume <session-id> ابتدا در دایرکتوری پروژه فعلی و git worktreeهای آن جستجو میکند و سپس به سراغ تمام پروژههای دیگر روی همان ماشین میرود. عبارتی که باید به خاطر بسپارید این است: «روی همان ماشین». شناسه نشست (session ID) مربوط به یک میزبان دیگر به هیچ نتیجهای نمیرسد و Claude Code با No conversation found with session ID: <session-id> این موضوع را به شما اعلام میکند.
Claude Code تاریخچه نشستها را کجا ذخیره میکند
بهطور پیشفرض، رونوشتها در دایرکتوری پیکربندی Claude Code و در مسیری با فرمت ~/.claude/projects/<project>/<session-id>.jsonl قرار میگیرند.
<project> مسیر دایرکتوری کاری شماست که در آن تمام کاراکترهای غیر الفبایی با خط تیره جایگزین شدهاند؛ بنابراین نشستی که در /home/deploy/apps/api آغاز شود، در دایرکتوری با نام -home-deploy-apps-api ذخیره میگردد. اگر طول این نام تبدیلشده از 200 کاراکتر فراتر رود، Claude Code آن را کوتاه کرده و یک هش از مسیر کامل به آن اضافه میکند تا نام دایرکتوری در محدودیتهای سیستم فایل باقی بماند.
این فایل با فرمت JSONL است: هر خط شامل یک شیء JSON است که میتواند یک پیام، استفاده از ابزار یا یک ورودی متادیتا باشد. این فایل متنی خوانا است و خواندن آن مشکلی ندارد.
نوشتن یک تحلیلگر (parser) برای آن توصیه نمیشود. فرمت ورودیها برای Claude Code داخلی است و بین نسخهها تغییر میکند؛ بنابراین اسکریپتی که مستقیماً این فایلها را میخواند ممکن است با هر بهروزرسانی از کار بیفتد. مستندات خود Anthropic توصیه میکند که از /export یا رابطهای اسکریپتی مستندشده استفاده کنید، که دقیقاً به همین دلیل توصیه درستی است.
دو تنظیمات میتوانند این شرایط را تغییر دهند. CLAUDE_CONFIG_DIR کل دایرکتوری پیکربندی را جابهجا میکند که روشی برای انتقال رونوشتها به یک درایو جداگانه یا یک درایو رمزنگاریشده است. cleanupPeriodDays در settings.json مدت زمان نگهداری آنها را کنترل میکند که بهطور پیشفرض 30 روز است و حداقل آن 1 روز میباشد.
درون آن فایلهای رونوشت دقیقاً چه چیزی وجود دارد
تمام نتایج ابزارها ثبت میشوند؛ این یعنی یک رونوشت شامل محتوای فایلهایی است که Claude خوانده و خروجی دستوراتی است که Claude اجرا کرده است. صفحه استفاده از داده شرکت Anthropic این موضوع را بهوضوح بیان میکند: Claude Code رونوشتهای نشست را بهصورت متن ساده (plaintext) در مسیر ~/.claude/projects/ بهصورت محلی ذخیره میکند.
به معنای این موضوع روی یک سرور فکر کنید. اگر Claude یک فایل .env را خوانده باشد تا بفهمد چرا یک سرویس اجرا نمیشود، محتوای آن فایل اکنون در یک فایل JSONL در دایرکتوری home شما قرار دارد. اگر یک دستور، رشته اتصال (connection string) را چاپ کرده باشد، آن رشته نیز در آنجا موجود است. هیچ چیزی نشت نکرده است؛ رونوشت صرفاً آنچه رخ داده را ثبت کرده که دقیقاً هدف اصلی آن است و به همین دلیل است که باید آن را در مدل تهدید (threat model) خود لحاظ کنید.
- پشتیبانگیریها: یک نسخه پشتیبان ساده از
/homeیا/root، رونوشتهای شما را به هر جایی که پشتیبانها منتقل میشوند، کپی میکند. یک استثنا (exclusion) اضافه کنید یا بپذیرید که نسخههایی از پرامپتها و محتوای فایلهای شما اکنون در فضای ذخیرهسازی پشتیبان شما قرار دارند. - اسنپشاتها و ایمیجها: اسنپشات یک VPS که به هر دلیلی گرفته شده باشد، شامل کل دایرکتوری است. همین موضوع در مورد ایمیجی که برای ساخت سرور دوم از روی آن کلون میکنید نیز صدق میکند.
- سایر حسابهای کاربری روی سیستم: به جای فرض کردن اینکه دسترسیها محدود هستند، خودتان با استفاده از
ls -ld ~/.claude ~/.claude/projectsمجوزها را بررسی کنید. - آپلودهای عمدی: دستور
/feedbackتاریخچه گفتگو را بهصورت هدفمند برای Anthropic ارسال میکند و/bugو/shareنیز از همین مسیر گزارش میدهند. اینها مواردی هستند که شما انتخاب میکنید انجام دهید، بنابراین پیش از تأیید، بدانید با چه چیزی موافقت میکنید.
اگر ترجیح میدهید هیچ رونوشتی وجود نداشته باشد، CLAUDE_CODE_SKIP_PROMPT_HISTORY نوشتن رونوشت را متوقف میکند و --no-session-persistence آن را برای یک اجرای غیرتعاملی claude -p غیرفعال میسازد. پیش از تنظیم هر یک از این موارد، از پیامدهای آن آگاه باشید. رونوشتها همان چیزی هستند که قابلیت resume از آنها استفاده میکند، بنابراین نبود رونوشت به معنای عدم امکان resume است.
چگونه یک گفتگوی قدیمی را پیدا کنیم
انتخابگر (picker) را با claude --resume، یا از داخل یک نشست در حال اجرا با /resume باز کنید. هر ردیف، در صورت تعیین نام، نام نشست را نشان میدهد؛ در غیر این صورت، عنوانی تولیدشده نمایش داده میشود. همچنین زمان سپریشده از آخرین فعالیت، شاخه git و حجم فایل نیز در هر ردیف قابل مشاهده است.
این انتخابگر قابلیت جستجو دارد. برای فیلتر کردن لیست، / را فشار دهید یا بلافاصله شروع به تایپ کنید. میانبرهایی که دامنه جستجو را گسترش میدهند بسیار کاربردی هستند: Ctrl+A نشستهای تمام پروژههای موجود در این سیستم را نمایش میدهد، Ctrl+W تمام worktreeهای مخزن فعلی را نشان میدهد و Ctrl+B لیست را به شاخه فعلی git محدود میکند. برای پیشنمایش محتوای یک نشست پیش از انتخاب نهایی، Space را فشار دهید و برای تغییر نام مورد انتخابشده، از Ctrl+R استفاده کنید.
نامگذاری نشستها مدیریت این موارد را بسیار آسانتر میکند. با استفاده از claude -n auth-refactor یک نشست را نامگذاری کنید، یا در میانههای کار، زمانی که متوجه شدید گفتگو به یک پروژه جدی تبدیل شده است، دستور /rename auth-refactor را اجرا کنید. پس از آن، یک نشست نامگذاریشده مستقیماً از طریق shell قابل بازیابی است.
نشستهای بدون نام نیز یک عنوان تولیدشده دریافت میکنند که توسط یک درخواست پسزمینه به یک مدل کوچک و سریع، بر اساس خلاصه اولین prompt شما نوشته میشود. این عنوان به شما کمک میکند تا ردیف مورد نظر را در انتخابگر تشخیص دهید، اما به عنوان شناسه بازیابی عمل نمیکند. claude --resume <name> فقط با نامهایی که خودتان تعیین کردهاید مطابقت دارد.
جستجو در رونوشتها برای یافتن نشست مناسب
گاهی اوقات فقط یک عبارت را به خاطر میآورید و هیچ چیز دیگری در ذهن ندارید. از آنجا که رونوشتها متنی هستند، میتوانید در آنها جستجو کنید.
grep -rl "nftables" ~/.claude/projects/این دستور مسیر رونوشتهای منطبق را چاپ میکند. نام فایل بدون پسوند .jsonl همان شناسه نشست است و claude --resume <session-id> آن را میپذیرد. از grep استفاده کنید تا مشخص کنید به کدام نشست نیاز دارید، سپس آن را از سر بگیرید یا برای خواندن محتوا، آن را export کنید.
دو نکته مهم را در نظر داشته باشید. محتوا به صورت JSON-escaped است؛ بنابراین عبارتی که شامل کاراکترهای نقلقول باشد یا در خطوط مختلف شکسته شده باشد، ممکن است به عنوان یک رشته دقیق (literal string) مطابقت پیدا نکند. همچنین، وجود یک عبارت در نتایج ابزار به این معناست که Claude آن متن را دیده است، نه اینکه لزوماً کسی آن را تایپ کرده باشد.
خواندن و خروجی گرفتن از گفتگو
/export گفتگوی فعلی را به صورت متن ساده نمایش میدهد، بهطوری که پیامها و خروجی ابزارها بهجای فرمت JSON، به شکلی خوانا نوشته میشوند. بدون هیچ آرگومان، این دستور منویی را باز میکند که امکان کپی در کلیپبورد یا ذخیره در فایل را فراهم میسازد. با تعیین یک نام فایل، /export handover.txt مستقیماً در آن مسیر مینویسد. این روش مناسبی برای انتقال یک گفتگو از سرور به لپتاپ یا ضمیمه کردن آن به یک تیکت است.
برای هرگونه عملیات خودکار، از رابطهایی استفاده کنید که برای پایداری طراحی شدهاند. هوکها و دستورات خط وضعیت، یک فیلد transcript_path را به عنوان ورودی دریافت میکنند، بنابراین یک هوک SessionEnd میتواند هنگام پایان نشست، رونوشت آن را آرشیو کند. همچنین میتوانید بدون باز کردن یک نشست ذخیرهشده، از آن سوال بپرسید:
claude -p --resume <session-id> --output-format json "summarize what we changed" | jq -r '.result'این دستور یک پرامپت تکمیلی را به گفتگوی قدیمی ارسال کرده و خروجی را به صورت JSON ساختاریافته بازمیگرداند. این روش، مبنای بسیار بهتری نسبت به پارس کردن فرمت JSONL است که ممکن است در نسخه بعدی تغییر کند.
شروع تازه در برابر ادامه دادن
ادامه دادن یک نشست، کل تاریخچه را بازمیگرداند و هر درخواست بعدی، تمام این تاریخچه را با خود حمل میکند. ادامه دادن گفتگویی که دیروز چهار ساعت طول کشیده، امروز هزینهبر است و چگونگی افزایش مصرف توکن در یک نشست طولانی توضیح میدهد که این هزینه دقیقاً از کجا ناشی میشود.
Claude Code گاهی راه میانهای پیشنهاد میدهد. در طرحهای Pro یا Max، ادامه دادن نشستی که حدود یک ساعت غیرفعال بوده و بیش از 100,000 توکن دارد، پیش از ارسال اولین پیام شما، یک کادر گفتگو باز میکند. در آن زمان، کشِ پرامپت منقضی شده است، بنابراین فارغ از گزینهای که انتخاب میکنید، درخواست بعدی یک بار کل تاریخچه را دوباره پردازش میکند.
- گزینه Resume from summary بلافاصله یک فشردهسازی انجام میدهد، بنابراین درخواستهای بعدی بهجای کل تاریخچه، یک خلاصه را حمل میکنند. این کار هزینه هر درخواست را کاهش میدهد، اما آنچه در خلاصه حذف شده دیگر در دسترس نخواهد بود.
- گزینه Resume full session as-is گفتگو را بدون تغییر بارگذاری میکند و تمام جزئیات را با هزینهای به ازای هر درخواست که متناسب با حجم گفتگو افزایش مییابد، حفظ میکند.
گزینه سوم، نشست را بهطور کامل ادامه میدهد و از نمایش مجدد این کادر در دفعات بعدی جلوگیری میکند.
تصمیمگیری در این مورد سادهتر از آن است که به نظر میرسد. زمانی که موضوع بعدی که قصد تایپ آن را دارید به آنچه قبلاً گفته شده وابسته است، نشست را ادامه دهید. در غیر این صورت، کار را تازه شروع کنید. انحراف (Drift) در گفتگو زمانی که مراقب آن باشید بهراحتی قابل تشخیص است: مثلاً Claude به فایلی اشاره میکند که یک ساعت پیش حذف کردهاید، یا دوباره بر سر تصمیمی بحث میکند که در ابتدای نشست نهایی شده بود. این محتوای قدیمی (stale context) است و حمل کردن آن، همزمان هزینه توکن و دقت شما را کاهش میدهد.
اگر بخش مفید یک گفتگوی قدیمی، تصمیمی است که دوباره به آن نیاز خواهید داشت، برای حفظ آن به ادامه دادن نشست تکیه نکنید. آن را جایی یادداشت کنید که در دسترس تمام نشستها باشد؛ این دقیقاً همان کاری است که فایلهای حافظه Claude Code برای آن طراحی شدهاند.
دانستن در مورد /branch نیز در اینجا مفید است. این دستور گفتگو را تا نقطه فعلی کپی کرده و شما را به نسخه کپی منتقل میکند، در حالی که نسخه اصلی دستنخورده باقی میماند و همچنان در انتخابگر (picker) موجود است. از این قابلیت برای امتحان کردن یک رویکرد دوم بدون از دست دادن رویکرد اول استفاده کنید.
تفاوت resume با compaction و memory
این مفاهیم دائماً با هم اشتباه گرفته میشوند، در حالی که هر کدام مسائل متفاوتی را حل میکنند.
قابلیت resume مربوط به بازگرداندن یک گفتگو پس از خروج، راهاندازی مجدد سیستم یا تغییر وظیفه است. قابلیت compaction مربوط به پنجرهٔ context در یک گفتگوی فعال است: /compact محتوایی که Claude حمل میکند را با یک خلاصه جایگزین میکند تا درخواستهای بعدی توکنهای کمتری مصرف کنند. اگر مشکل شما پر شدن پنجرهٔ context است، compaction ابزار مناسب شماست و مدیریت پنجرهٔ context در Claude Code بهدرستی به آن پرداخته است.
قابلیت memory کاملاً متفاوت است. فایلهای CLAUDE.md و حافظهٔ خودکار (auto memory)، دستورالعملها و حقایقی را نگه میدارند که در ابتدای هر نشست بارگذاری میشوند؛ بنابراین اینها گفتگویی نیستند که به آن بازگردید. اینها مواردی هستند که یادداشت میکنید تا هرگز نیازی به بازگشت به یک گفتگوی خاص نداشته باشید.
اگر هدف شما اجرای همزمان دو گفتگو و هماهنگی بین آنهاست، این یک مکانیزم جداگانه است. نشستهای Claude Code میتوانند به یکدیگر پیام دهند در حالی که هر دو فعال هستند؛ این مسئله با فراخوانی نشست دیروز از روی دیسک متفاوت است.
FAQ
Claude Code تاریخچه نشستهای من را کجا ذخیره میکند؟
بهصورت پیشفرض در دایرکتوری پیکربندی شما، در ~/.claude/projects/<project>/<session-id>.jsonl، که در آن <project> مسیر دایرکتوری کاری است که کاراکترهای غیرالفبایی آن با خط تیره جایگزین شدهاند. هر فایل با فرمت JSONL است: یک شیء JSON در هر خط برای یک پیام، استفاده از ابزار، یا یک ورودی متادیتا. CLAUDE_CONFIG_DIR دایرکتوری پیکربندی را به مکان دیگری منتقل میکند و cleanupPeriodDays در settings.json تعیین میکند که رونوشتها تا چه مدت نگهداری شوند؛ مقدار پیشفرض 30 روز و حداقل آن 1 روز است.
چرا نمیتوانم نشست VPS خود را در انتخابگر (picker) روی لپتاپم ببینم؟
زیرا رونوشتها روی دیسک ماشینی که عامل (agent) در آن اجرا شده است نوشته میشوند و هیچ فرآیندی آنها را بین ماشینها همگامسازی نمیکند. مکالمهای که داخل tmux روی VPS خود داشتهاید، فقط روی همان VPS وجود دارد. آن را از طریق SSH در همانجا ادامه دهید، یا اگر به یک نسخه محلی نیاز دارید، /export را در آن اجرا کرده و فایل متنی را کپی کنید.
آیا میتوانم نشستی را که در دایرکتوری دیگری شروع کردهام، ادامه دهم؟
بله، اگر شناسه نشست (session ID) آن را داشته باشید. claude --resume <session-id> ابتدا در دایرکتوری پروژه فعلی و worktreeهای git آن جستجو میکند، سپس در تمام پروژههای دیگر روی همان ماشین. داخل انتخابگر، Ctrl+A لیست را به تمام پروژههای روی ماشین گسترش میدهد و Ctrl+W آن را به تمام worktreeهای مخزن فعلی تعمیم میدهد. اگر هیچ موردی پیدا نشود، Claude Code پیام No conversation found with session ID: <session-id> را گزارش میدهد.
آیا باید یک نشست قدیمی را ادامه دهم یا یک نشست جدید شروع کنم؟
زمانی که پیام بعدی شما به آنچه قبلاً در آن مکالمه گفته شده وابسته است، آن را ادامه دهید. زمانی که این وابستگی وجود ندارد، یک نشست جدید شروع کنید؛ زیرا ادامه دادن نشست، کل تاریخچه را بارگذاری میکند و هر درخواست بعدی آن را به همراه خواهد داشت. مراقب انحراف (drift) باشید: نشستی که مدام به فایلهایی ارجاع میدهد که قبلاً حذف کردهاید، حاوی context قدیمی است و این context در هر مرحله، هزینه توکن و دقت شما را کاهش میدهد.
آیا میتوانم از نوشتن رونوشتها روی دیسک توسط Claude Code جلوگیری کنم؟
بله. CLAUDE_CODE_SKIP_PROMPT_HISTORY نوشتن رونوشتها را متوقف میکند و --no-session-persistence آنها را برای یک اجرای غیرتعاملی claude -p سرکوب میکند. ابتدا پیامد آن را درک کنید، زیرا رونوشتها همان چیزی هستند که قابلیت ادامه نشست میخواند؛ بنابراین غیرفعال کردن آنها به این معنی است که --continue و --resume چیزی برای بارگذاری نخواهند داشت. اگر نگرانی شما محل قرارگیری فایلهاست و نه اصل وجود آنها، CLAUDE_CONFIG_DIR را به یک volume رمزگذاریشده اشاره دهید و cleanupPeriodDays را کاهش دهید.