sem: دیف گیت که به جای خط، توابع رو نشونت میده
خلاصهٔ کاملتر
ایدهٔ اصلی sem اینه که دیفِ معمولی گیت بهت میگه «این خطها عوض شدن»، ولی sem میگه «این تابع اضافه شد، اون یکی تغییر کرد، این یکی حذف شد». یعنی به جای نگاه کردن به خطها، تغییرات رو در سطح موجودیتهای کد (تابع، کلاس، متد، تایپ) نشونت میده. مثلاً همون کامیتی که گیت بهصورت چند خط اضافه و حذف نشونت میده، sem خلاصه میکنه به «۳ موجودیت توی ۱ فایل تغییر کرد».
این ابزار شش دستور داره که همهشون توی هر مخزن گیت و بدون هیچ کانفیگی کار میکنن. دستور sem diff تغییرات رو در سطح موجودیت با تشخیص تغییرِ نام و هایلایت کلمهبهکلمه نشون میده. sem blame بهجای خط، برای هر تابع یا کلاس میگه آخرین کامیتی که بهش دست زده کدوم بوده. sem log هم تاریخچهٔ گیت رو فقط برای یه موجودیت خاص نشون میده — یعنی هر کامیتی که یه تابع مشخص رو لمس کرده.
جالبترین دستور شاید sem impact باشه که گراف وابستگی بینفایلی رو میسازه و میگه چه موجودیتهایی به یه تابع وابستهان و کدوم تستها تحت تأثیر قرار میگیرن. مثلاً نشون میده یه تابع به چی وابستهست، کجاها استفاده میشه و چند موجودیت بهصورت زنجیرهای ازش متأثر میشن — همون چیزی که موقع تغییر دادن کد همیشه نگرانشی.
دو تا دستور دیگه هم بهطور خاص به کار هوش مصنوعی میان. sem entities همهٔ توابع، کلاسها، متدها و تایپهای زیر یه مسیر رو با بازهٔ خطوطشون لیست میکنه. sem context هم یه پنجرهٔ کانتکستِ بودجهبندیشده بر اساس توکن میسازه: خودِ موجودیت، وابستگیها و وابستههاش رو جوری جمع میکنه که توی پرامپتِ هر مدل زبانی جا شه.
همین کاربردِ AI نقطهٔ فروش مهمشه. توی صفحه ادعا شده که ایجنتهای هوش مصنوعی وقتی خروجی sem رو میگیرن ۲.۳ برابر دقیقتر از دیفِ خطخام عمل میکنن، و یه بنچمارک هم براش گذاشتن. همهٔ دستورها هم فلگ --json رو پشتیبانی میکنن تا خروجی ماشینخوان بدن و راحت به ابزارهای دیگه وصل شن.
از نظر پوشش، sem یه باینری واحده که از ۲۶ زبان برنامهنویسی (از TypeScript و Python و Go و Rust گرفته تا PHP و Swift و Zig) و ۵ فرمت داده مثل JSON و YAML و TOML پشتیبانی میکنه. ادعا شده یه دیف معمولی حدود ۸ میلیثانیه طول میکشه و تا الان بیش از ۴۰۰۰ بار دانلود شده. نصبش هم با Homebrew یا cargo انجام میشه و با یه دستور setup میتونه جوری تنظیم شه که از این به بعد هر git diff تبدیل به sem diff بشه.
نکات کلیدی:
- sem یه لایهٔ معنایی روی گیت میذاره و تغییرات رو در سطح تابع و کلاس نشون میده، نه خط
- شش دستور داره: diff، blame، impact، log، entities و context
- دستور impact گراف وابستگی میسازه و میگه تغییر یه تابع چی رو میشکنه
- دستور context کانتکستِ توکنبندیشده برای پرامپت مدلهای زبانی تولید میکنه
- از ۲۶ زبان پشتیبانی میکنه، خروجی JSON میده و بدون کانفیگ توی هر مخزن گیت کار میکنه




