برچسب، یادداشت چسبان، یادداشت آزاد و جستجو برای جلسههای Claude Code، در سایدبار. یادداشتها فقط برای خودت است و هیچوقت برای
Claude فرستاده نمیشود: افزونه فایلهای جلسه را فقط میخواند.
چه چیزهایی دارد
سایدبار «یادداشتها» (آیکون افزونه در نوار فعالیت) دو بخش روی هم دارد: بالا «یادداشت» و پایین
«فهرست». بار اول حدود ۶۰ و ۴۰ درصد جا میگیرند. مرزشان را میشود کشید و هر کدام را بست. در «یادداشت»
فقط فهرست یادداشتها اسکرول میخورد و برچسبها و کادر نوشتن همیشه دیده میشوند.
«یادداشت» ← زبانهٔ «این جلسه»: با فعال شدن هر زبانهٔ Claude Code، برچسبها و یادداشتهای همان جلسه
را نشان میدهد. اگر زبانهٔ دیگری فعال شود، آخرین جلسه کمرنگ میماند.
برچسب: بنویس و Enter بزن (چندتا را با ویرگول جدا کن)؛ با Backspace در کادر خالی، آخرین برچسب برداشته
میشود. برچسبهای قبلی پیشنهاد داده میشوند.
یادداشت: Ctrl+Enter ثبت میکند. @me و @claude رنگی میشوند و قابل جستجو هستند.
«نقل پیام Claude»: یکی از جوابهای Claude در همین جلسه را انتخاب میکنی و بالای یادداشت مینشیند.
پیشنویس هر جلسه جدا نگه داشته میشود. حذف یادداشت دو کلیک میخواهد.
«یادداشت» ← زبانهٔ «یادداشت آزاد»: یادداشتی که به هیچ زبانه، جلسه یا ایجنتی وصل نیست. همان
ویرایش، حذف، @me/@claude و جستجو را دارد. هر یادداشت آزاد برچسبهای خودش را دارد. برچسب را
زیر کادر نوشتن یا هنگام «ویرایش» اضافه کنید، با Enter یا ویرگول. متنی که در کادر برچسب مانده باشد با «ثبت»
یا «ذخیره» برچسب میشود. برچسبهای قبلی، چه از جلسهها چه از یادداشتهای آزاد، پیشنهاد داده میشوند. دکمهٔ «یادداشت آزاد تازه» بالای بخش، و همین دستور در
Command Palette، این زبانه را باز میکند و مکاننما را در کادر میگذارد. وقتی زبانهٔ Claude دیگری جلو
بیاید، بخش خودش به «این جلسه» برمیگردد. برگشتن به همان زبانهٔ قبلی یا رفتن به فایل این کار را نمیکند.
آرشیو: زیر هر یادداشت، چه یادداشت جلسه چه آزاد، «آرشیو» هست. یادداشت پاک نمیشود، فقط از فهرست
کنار میرود. چند ثانیه «برگردان» دیده میشود. زبانهٔ سوم «آرشیو» همهٔ آرشیوشدهها را از همهٔ جلسهها و
یادداشتهای آزاد یکجا نشان میدهد، آخرین آرشیوشده اول، با فیلتر «همه / این جلسه / آزاد». هر کارت میگوید
مال کدام جلسه است و کلیک روی عنوان آن جلسه را باز میکند. «بازگردانی» یادداشت را با همان متن، نقلقول و
برچسب به جای خودش برمیگرداند. ته فهرست هر زبانه «N یادداشت آرشیوشده» مستقیم به آرشیو همان دسته میرود.
ته «فهرست» هم «آرشیو» هست، و دستور «یادداشتهای آرشیوشده» در Command Palette. ✎ در نوار وضعیت، فهرست و
فهرست جلسههای Claude Code فقط یادداشتهای آرشیونشده را میشمارد. جستجو آرشیوشدهها را هم با نشان
«آرشیو» پیدا میکند.
«فهرست»: بالا «یادداشتهای آزاد» (کلیک، همان یادداشت را در بخش بالا نشان میدهد)، بعد برچسبها و زیر
هر برچسب جلسهها و یادداشتهای آزادی که آن را دارند. کلیک روی جلسه آن را باز میکند.
جلسههایی که یادداشت دارند ولی برچسب ندارند زیر «بدون برچسب» هستند، و جلسههای پوشههای دیگر Claude
(~/.claude و ~/.claude2 و …) زیر «پوشههای Claude دیگر».
نوار وضعیت: برچسبها و تعداد یادداشتهای جلسهٔ فعال. کلیکش سایدبار یادداشت را باز میکند.
جستجو (Ctrl+Alt+Shift+F):
#برچسب جلسهها و یادداشتهای آزادی که این برچسب را دارند (چند برچسب یعنی همه را داشته باشد)
@claude، @me یادداشتهایی که این را نام بردهاند
project:noor فقط جلسههای پروژهای که مسیرش این کلمه را دارد (یادداشت آزاد پروژه ندارد، پس کنار
گذاشته میشود)
هر متن دیگری در عنوان، برچسب، یادداشت و یادداشت آزاد، و در متن خود گفتگوها (پیامهای تو و جوابهای Claude، بدون
خروجی ابزارها و thinking) جستجو میشود. بزرگی و کوچکی حروف، نیمفاصله و ي/ك عربی فرقی نمیکنند.
برچسبها در فهرست جلسههای خود Claude Code: کنار عنوان هر جلسه، #برچسبها ✎تعداد نشان داده میشود.
برچسبها: Ctrl+Alt+Shift+T برای جلسهٔ فعال.
زبانه کدام جلسه است؟
VS Code از یک زبانهٔ Claude Code فقط عنوانش را میدهد، پس زبانه با عنوان جلسه جور میشود. اگر چند جلسه
همان عنوان را داشته باشند، بخش یادداشت یک بار میپرسد و جواب برای همان عنوان در همین workspace میماند. جلسهٔ تازه
تا اولین پیام عنوانی ندارد. دستور «این زبانه کدام جلسه است؟» انتخاب را دستی عوض میکند.
جلسهها از CLAUDE_CONFIG_DIR همین پنجره خوانده میشوند (همان که claude، claude2 و claude3 در
~/.bashrc میگذارند)، وگرنه از ~/.claude. تنظیم vahidCodeNotes.claudeConfigDir این را عوض میکند.
دادهها
~/.vahid-code-notes/notes.json: همهٔ برچسبها و یادداشتها، بر اساس شناسهٔ جلسه، و یادداشتهای آزاد
(هر کدام با tags خودش) زیر کلید free. یادداشت آرشیوشده فیلد archived (تاریخ آرشیو) دارد، برای همهٔ پنجرهها و پوشههای Claude در یک فایل. پنجرهای که هنوز 0.1.0 را اجرا میکند
کلید free را دست نمیزند و نگهش میدارد. هر تغییر زیر یک قفل (notes.lock) از روی خود فایل خوانده و با فایل موقت و
rename نوشته میشود؛ پنجرههای دیگر تغییر را فوری میبینند. فایلی که خوانا نباشد هیچوقت بازنویسی نمیشود.
~/.vahid-code-notes/index-*.json: نمایهٔ جلسههای هر پوشهٔ Claude. فایلهای jsonl فقط بزرگ میشوند،
پس هر بار فقط بایتهای تازه خوانده میشود: اولین بار برای ۱٫۳ گیگابایت حدود ۵ ثانیه، بعد چند میلیثانیه.
فهرست جلسههای Claude Code
هیچ افزونهای به صفحهٔ افزونهٔ دیگری راه ندارد. پس این افزونه یک بلوک کوچک (بین
/* VAHID-CODE-NOTES-START */ و END) به ته webview/index.js خود Claude Code اضافه میکند. آن بلوک
فقط فایل webview/vahid-code-notes.css را بار میکند و تا وقتی فهرست جلسهها روی صفحه است، هر ۳ ثانیه
دوباره بارش میکند. هر ردیف فهرست id="sessions-list-row-<sessionId>" دارد، پس خود CSS برچسبها را
میکشد (::after ردیف) و به هیچ عنصری از فهرست دست نمیزند.
هر نوشتن اول در فایل موقت انجام میشود و بعد جای فایل اصلی مینشیند. index.js وصلهشده باید پیش از
نوشتن parse شود؛ فایلی که همانطور که هست parse نشود دست نمیخورد.
فقط بلوک خود این افزونه برداشته یا عوض میشود. بلوک Vahid Code RTL سر جایش میماند. Vahid Code RTL
باید 1.3.2 یا بالاتر باشد. نسخههای قبلی هر بار این بلوک را پاک میکنند و دو افزونه مدام فایل را
بازنویسی میکنند و پیغام بارگذاری دوباره میدهند.
بعد از هر بهروزرسانی Claude Code خودکار دوباره اعمال میشود. نسخههای .obsolete دست نمیخورند.
برداشتن: دستور «برداشتن برچسبها از فهرست…»، یا تنظیم vahidCodeNotes.sessionsList.enabled، یا حذف
افزونه (uninstall.js). notes.json با حذف افزونه پاک نمیشود.
ساخت و آزمون
node scripts/test.js # notes.json با ۱۶ نویسندهٔ همزمان، نمایه و جستجو، وصلهٔ فهرست روی
# یک کپی از Claude Code نصبشده کنار Vahid Code RTL
python3 -I scripts/build-vsix.py # vahid-code-notes-<version>.vsix
code --install-extension vahid-code-notes-0.4.0.vsix