یک توسعه‌دهنده متوجه شد که یک جستجوی پنهان npx حدود ۱۰ ثانیه به هر چرخه (turn) در Claude Code اضافه می‌کند، و جایگزین کردن آن جستجو با یک نصب سراسری (global install)، از زمان هر تعامل ۶ ثانیه کم کرد.

چرا تأخیر اهمیت داشت

Claude Code در یک monorepo با ده‌ها کامپوننت پیمایش می‌کند، نمادها (symbols) را ایندکس می‌کند، رونوشت‌ها را در Postgres ذخیره می‌کند و گزارش‌های خطا را ارسال می‌کند. جریان کاری تا زمانی که پاسخ‌های مدل شروع به کند شدن نکنند، روان به نظر می‌رسد. سپس یک بررسی سلامت (health check) چندین ناکارآمدی و یک فراخوانی شبکه پرهزینه را آشکار کرد.

آنچه بررسی سلامت آشکار کرد

  • نصب‌های تکراری – یک لانچر بومی (native launcher) و یک نسخه قدیمی npm-global همزمان وجود داشتند. حذف نسخه قدیمی، یک جستجوی مسیر غیرضروری را از بین برد.
  • فایل عامل (agent) خراب – فایلی بدون توضیحات، نام یک فایل معتبر را تکرار می‌کرد و باعث می‌شد Claude Code آن را نادیده بگیرد. حذف ورودی خراب، این سردرگمی را برطرف کرد.
  • افزونه‌های استفاده نشده – یک پلاگین و یک سرور MCP که هرگز اجرا نمی‌شدند، غیرفعال شدند تا ردپای زمان اجرا (runtime footprint) کاهش یابد.
  • فایل‌های حجیم “CLAUDE.md” – این فایل‌ها اطلاعاتی را که از قبل در کد وجود داشت (مثلاً دستورات ساخت یا build commands) تکرار می‌کردند و حجم داده‌های ارسالی به مدل را افزایش می‌دادند. با کوچک کردن آن‌ها، فقط بافت (context) ضروری باقی ماند.

این پاکسازی‌ها کمک کردند، اما بزرگترین دستاورد مربوط به Stop hook بود که پس از هر پاسخ مدل اجرا می‌شود.

مالیات پنهان npx

Stop hook شش دستور مجزا را اجرا می‌کند که هر کدام با npx -y شروع می‌شوند. پرچم -y npx را مجبور می‌کند تا قبل از اجرای دستور، npm registry را برای یافتن نسخه جدیدتر بررسی کند که باعث ایجاد یک درخواست شبکه می‌شود. هر جستجو به‌طور متوسط ۱.۶ ثانیه زمان می‌برد، بنابراین شش فراخوانی، حدود ۱۰ ثانیه به هر چرخه اضافه می‌کرد. در عمل، تأخیر کلی این هوک ۱۲ ثانیه اندازه‌گیری شد، با جهش‌های گاه‌وبیگاه تا ۱۱۳ ثانیه در زمان بروز اختلال در شبکه.

راه حل ساده

جایگزین کردن فراخوانی‌های npx با یک باینری (binary) که به‌صورت سراسری (globally) نصب شده است، جستجوی رجیستری را حذف کرد:

  • قبل: npx -y @invariance/gps ← ۱.۶ ثانیه برای هر فراخوانی
  • بعد: gps (نصب شده به‌صورت سراسری) ← ۰.۷ ثانیه برای هر فراخوانی

این تغییر زمان اجرای Stop hook را تقریباً ۶ ثانیه در هر چرخه کاهش داد و جهش‌های بزرگ ناشی از بررسی از راه دور را از بین برد.

آنچه باید در آینده زیر نظر داشت

  • زمان‌بندی هوک (Hook timing) – هر هوک سفارشی را مجهز به ابزار اندازه‌گیری کنید تا تأخیر را پیش از آنکه به کاربران آسیب برساند، شناسایی کنید.
  • بهداشت وابستگی‌ها (Dependency hygiene) – به‌طور منظم نصب‌های تکراری و افزونه‌های استفاده نشده را حذف کنید.
  • فایل‌های پیکربندی – فایل “CLAUDE.md” را سبک نگه دارید؛ فقط اطلاعاتی را ارائه دهید که مدل نمی‌تواند آن‌ها را استنباط کند.

درس ساده است: اتوماسیون می‌تواند زیرساخت‌های پرهزینه را پنهان کند. یک بررسی سلامت سریع می‌تواند فراخوانی‌های پنهان شبکه را که یک دستیار هوش مصنوعی روان را به یک دستیار کند تبدیل می‌کند، آشکار سازد.

نکته کلیدی: وقتی Claude Code کند به نظر می‌رسد، زمان اجرای هوک‌ها را اندازه‌گیری کنید و هرگونه جستجوی npx را حذف کنید؛ یک نصب سراسری (global install) می‌تواند چندین ثانیه از هر چرخه بکاهد و جریان توسعه شما را روان نگه دارد.