بررسی پاراگرافهای طولانی تولیدشده توسط هوش مصنوعی برای یافتن یک سؤال کلیدی، روزانه یک ساعت از بهرهوری برنامهنویسان را میبلعد. برای حل این مشکل، IndieCoreDev پلاگین رایگان و متنباز ask-first را برای Claude Code منتشر کرد تا مدل را مجبور کند بهجای نوشتن سؤال در قالب متن، از کارتهای تعاملی ترمینال استفاده کند. این ابزار تحت لایسنس MIT منتشر شده است.
بیشتر عاملهای کدنویسی، اطلاعات، فرضها و درخواستهای کاربر را با وزن بصری یکسانی نمایش میدهند. در خروجی استاندارد ترمینال، یک نقطه تصمیم حیاتی دقیقاً شبیه به یک بهروزرسانی وضعیت ساده به نظر میرسد. در متنهای ساده، سه مورد متفاوت — یعنی آنچه یافته شده (اطلاعات)، آنچه فرض شده (تصمیمی که مدل برای کاربر گرفته) و آنچه واقعاً مورد نیاز است (مانع یا Blocker) — همگی از یک فونت، پاراگراف و لحن مشترک استفاده میکنند. طبق گزارش توسعهدهنده این ابزار، این فقدان سلسلهمراتب بصری منجر به «سؤالات نادیده گرفته شده» میشود؛ جایی که برنامهنویس پاسخی مبهم میدهد چون سؤال اصلی در پاراگراف چهارم گم شده است و در نتیجه، یک دور گفتگو بیهوده برای شفافسازی صورت میگیرد تا آنچه باید از ابتدا به طور واضح پرسیده میشد، مشخص شود.
برای کسانی که انگلیسی زبان اولشان نیست، این مشکل با دایره لغات پیچیده مدلهای جدید تشدید میشود. نویسنده اشاره میکند که انگلیسی زبان اول او نیست و هر کلمه دشوار یا نادر، دو بار هزینه دارد: یک بار برای خواندن آن و بار دوم برای اطمینان از اینکه درست خوانده شده است. وقتی این اتفاق در طول یک روز تکرار شود، با یک اتلاف وقت واقعی روبرو هستیم، نه صرفاً شکایتی درباره سبک نوشتاری. اکثر افرادی که از عاملهای کدنویسی استفاده میکنند، به زبانی غیر از زبان مادری خود مطالعه میکنند. درخواستهایی مثل «پاسخهای کوتاهتر بده» یا «از کلمات سادهتر استفاده کن» از طریق پرامپت، معمولاً فقط برای سه دور گفتگو اثر دارند و سپس با رشد بستر (Context) گفتگو، این دستورالعملها کمرنگ میشوند و کاربر مجبور است در هر جلسه همان درخواستها را دوباره تایپ کند. علت ریشهای این است که یک پاسخ متنی ساده، «شکل» یا ساختار مشخصی ندارد؛ هیچ چیزی طول آن را محدود نمیکند و هیچ مرزی بین یک حقیقت و یک سؤال وجود ندارد، بنابراین در هر نوبت، تصمیمگیری بر عهده قضاوت مدل است.
سازوکار: مهارتها در برابر قلابها
پلاگین ask-first منطق خود را بین دو مکانیسم متمایز تقسیم میکند: مهارتهای عامل (Agent Skills) و قلابها (Hooks). این تفکیک، هسته اصلی قابلیت اطمینان این پلاگین است و تعامل را از یک «درخواست زبانی» به یک «محدودیت مهندسی نرمافزار» تبدیل میکند. Claude Code پیش از این ابزار AskUserQuestion را داشت که کارتی با لیستی از گزینهها و قابلیت پیمایش توسط کلیدهای جهتنما در ترمینال میسازد؛ این پلاگین صرفاً کلود را مجبور میکند در هر موقعیت ممکن از این ابزار استفاده کند.
- مهارتهای عامل (Agent Skills): اینها دستورالعملهای Markdown (به طور خاص فایل
SKILL.md) هستند که در بستر مدل بارگذاری میشوند. آنها قضاوت مدل را در مورد سلیقه، لحن و نحوه فرمولبندی یک توصیه هدایت میکنند. اما چون اینها مواردی هستند که کلود «انتخاب میکند» از آنها استفاده کند، در جلسات طولانی مستعد «انحراف» (Drift) هستند. نویسنده دریافت که حتی سه بار بازنویسی یک قانون، کمتر از آخرین بازنویسی اثرگذار بود، زیرا مدل به مرور از آنها عبور میکرد. قضاوت، «شکل» مشخصی برای بررسی ندارد، بنابراین باید به عنوان یک مهارت باقی بماند. - قلابها (Hooks): اینها اسکریپتهای Node.js رویداد-محور هستند که مستقل از مدل اجرا میشوند. قلابها مانند لایههای نظارتی عمل میکنند که میتوانند یک فراخوانی ابزار را رد کنند یا اگر خروجی مدل «شکل» خاصی را نداشته باشد، نوبت پاسخ را مسدود کنند. قلابها نامرئی هستند و صرفاً اجرا میشوند؛ آنها به موافقت مدل با کاربر وابسته نیستند. این فرآیند شبیه به یک سیستم Build در برنامهنویسی است: توسعهدهنده کد AI را دستی بررسی نمیکند، بلکه سیستم Build این کار را انجام میدهد. یک قلاب میتواند شکل خروجی را بررسی کرده و قانون را در اولین تلاش اصلاح کند، حتی اگر مدل فعالانه سعی در شکستن آن قانون داشته باشد.
قوانین سختگیرانه اجرا
این پلاگین پنج قانون اصلی را پیاده میکند تا کاربر هرگز مجبور به شکار سؤال در متن نباشد. نویسنده «سؤال در قالب نثر» را به عنوان یک «باگ» توصیف میکند:
- ممنوعیت سؤال در متن: هر سؤالی باید در کارت باشد، هرگز در نثر نباشد. اگر قلاب سؤالی را در متن تشخیص دهد، نوبت پاسخ مسدود میشود تا مدل آن را به کارت تبدیل کند. قلابها علامتهای سؤال داخل کد، نوبتهایی که قبلاً از کارت استفاده کردهاند و زبانهای گزارشدهی (مانند «پروفایلر به من خواهد گفت زمان کجا صرف میشود») را نادیده میگیرند. قلاب هرگز ورودیهایی را که نمیتواند بخواند، مسدود نمیکند.
- محدودیت تکسؤالی: کارتها در هر لحظه فقط میتوانند شامل یک سؤال باشند. دستهبندی سؤالات (Batching) برای جلوگیری از خستگی کاربر ممنوع است.
- اولویت با پیشنهاد: اولین گزینه در یک کارت باید پیشنهاد خودِ هوش مصنوعی باشد و صراحتاً به عنوان «پیشنهادی» علامتگذاری شود. این کار باعث میشود کاربر مجبور نباشد برای انتخاب از بین سه گزینه خنثی، تبدیل به متخصص شود؛ بلکه مدل (که کد را خوانده) برنده را پیشنهاد میدهد و کاربر در صورت نیاز آن را رد میکند.
- قضاوت هدفمحور: اگر درخواست کاربر مبهم باشد، مدل باید هدف را بپرسد و هر گزینه را در برابر آن هدف بسنجد. برای مثال، اگر گفته شود «این اسکریپت را سریعتر کن»، پلاگین کلود را مجبور میکند ابتدا اندازهگیری کند و سپس بپرسد که منظور از «سریعتر»، اجرای CI است که نباید متوقف شود یا اجرای محلی سریعتر؛ زیرا این دو نیاز به کدهای متفاوتی دارند.
- جداسازی اطلاعات: اطلاعات صرف بهصورت متن عادی باقی میمانند، اما تصمیمات در رابط کاربری ایزوله میشوند. این تضمین میکند اطلاعاتی که یک بار خوانده شده و نیازی به اقدام ندارند، وزن بصری یکسانی با تصمیمات مسدودکننده (Blocking Decisions) نداشته باشند.
نقشهبرداری اجرای قوانین
برای اطمینان از رعایت این قوانین، پلاگین آنها را بر اساس اینکه آیا قانون مربوط به «قضاوت» است یا «شکل قابل بررسی»، به مهارت یا قلاب اختصاص میدهد:
- یک سؤال در هر کارت: توسط قلاب اجرا میشود. درخواست پیش از رسم کارت رد میشود.
- پیشنهاد اول/علامتگذاری شده: توسط قلاب اجرا میشود. درخواست رد شده و قلاب دقیقاً اشاره میکند که پیشنهاد در کجا غایب بود.
- عدم وجود سؤال در نثر: توسط قلاب اجرا میشود. نوبت پاسخ کاملاً مسدود میشود تا سؤال به کارت تبدیل شود.
- فقط سؤالات در کارت باشند: توسط متن مهارت (Skill text) اجرا میشود.
- پرسیدن هدف و قضاوت بر اساس آن: توسط متن مهارت (Skill text) اجرا میشود.
مقایسه: متن در برابر کارت
برای نمایش تفاوت، نویسنده سناریویی درباره کد زمانبندی شامل schedule-rule.mjs (تقویم)، schedule.mjs (تخصیصدهنده) و build.mjs (دروازه) ارائه میدهد.
در حالت متنی (Prose)، عامل ممکن است ۶۰ کلمه درباره تقویم و تخصیصدهنده بنویسد و سپس بپرسد که آیا کاربر یک فلگ در frontmatter، یک ردیف در دفتر کل (ledger track) یا انتقال پست به اولین روز آزاد را ترجیح میدهد. کاربر باید کل بلوک را بخواند تا نقطه تصمیم را بیابد.
اما در حالت کارت، همان اطلاعات به صورت یک پرسش موجز نمایش داده میشود: «پستهای تاریخگذشته که در انتظار هستند، چه شوند؟» و سپس لیستی شمارهدار:
۱. skip: در frontmatter (پیشنهادی) — یک خط در خود پست. تقویم روز را بازمیگرداند.
۲. ثبت در دفتر کل — پستها دستنخورده میمانند اما دلیل در جای دیگری ذخیره میشود.
۳. انتقال به اولین روز آزاد — فیلد جدیدی اضافه نمیشود اما تاریخی که شما انتخاب کردید بیصدا جابجا میشود.
این تغییر، تعامل را به یک نگاه و یک فشار کلید با استفاده از کلیدهای جهتنما کاهش میدهد.
تأثیر واقعی در عیبیابی
در یک مورد تست مستند شده، توسعهدهنده از این پلاگین برای مدیریت سه صفحهای استفاده کرد که Search Console ادعا میکرد خزش (crawl) نشدهاند. بدون پلاگین، عامل احتمالاً سه ویرایش ظاهری پیشنهاد میداد که هیچ تغییری ایجاد نمیکرد.
در عوض، فرآیند اجباریِ پرسشگری باعث شد عامل ابتدا بررسی کند که آیا این یافته درست است یا خیر. مدل کشف کرد که هر سه صفحه قبلاً از هر صفحهای در سایت لینک شدهاند و لینکهای ورودی آنها دقیقاً با صفحات مشابه ایندکس شده مطابقت دارد. علت واقعی یک باگ در کد Watcher خودِ توسعهدهنده بود: واچر در اولین اجرا، دوره مهلت ۱۴ روزه را نادیده میگرفت چون فرض میکرد URLهای sitemap قدیمیتر از خودِ واچر هستند. از آنجایی که سایت ۷ روزه و واچر ۲ روزه بود، دوره مهلت دور زده شد. کارت تعاملی نهایی پیشنهاد داد که این موارد به عنوان «wontfix» (بدون نیاز به اصلاح) بسته شوند تا دوره مهلت به طور طبیعی اعمال شود؛ راهکاری که در یک تبادل متنی استاندارد احتمالاً گم میشد.
نصب و امنیت
کاربران میتوانند پلاگین را از طریق مارکتپلیس Claude Code با دستورات زیر نصب کنند:/plugin marketplace add IndieCoreDev/ask-first/plugin install ask-first@ask-first
ریاستارت کردن Claude Code ضروری است زیرا مهارتها فقط در ابتدای جلسه خوانده میشوند. نویسنده هشدار میدهد که دستور /reload-plugins مهارتها را بارگذاری نمیکند و گزارش ۰ مهارت میدهد، که میتواند منجر به این باور غلط شود که پلاگین خراب است. این مشکل خاص برای نویسنده ۲۰ دقیقه عیبیابی هزینه داشت. اگر ریاستارت مشکل را حل نکرد، کاربران باید دستور claude plugin validate را روی پوشه پلاگین و ریشه مارکتپلیس اجرا کنند تا مشکل شناسایی شود.
در مورد امنیت، پلاگین شامل دو اسکریپت Node غیر-minified (تقریباً ۵۰ و ۱۱۰ خط) بدون هیچ وابستگی (dependency) است:
- اسکریپت اول سؤال در انتظار را از
stdinمیخواند. - اسکریپت دوم متن جلسه را از مسیری که Claude Code ارسال میکند میخواند تا سؤالات متنی را بررسی کند.
هیچکدام از اسکریپتها فایلی نمینویسند، فرآیندهای خارجی را شروع نمیکنند یا درخواست شبکهای ارسال نمیکنند. هیچ دادهای از ماشین محلی خارج نمیشود. نویسنده کاربران را تشویق میکند پیش از نصب هر پلاگینی که دارای قلاب (Hook) است، اسکریپتها را بخوانند.
درسهای توسعهدهنده و تلههای فنی
IndieCoreDev متوجه چندین تضاد بین مستندات رسمی و رفتار واقعی باینری Claude Code شد:
- قلابهای پرامپت (Prompt Hooks): مستندات رسمی برای تصمیمات قضاوتمحور، «قلابهای پرامپت» (ارزیابیهای LLM) را توصیه میکنند. اما نویسنده دریافت که اینها هرگز اجرا نمیشوند. جستجوی (grep) در مارکتپلیس رسمی نشان داد از بین ۲۹۱ پلاگین، حتی یکی هم قلاب پرامپت نداشت. بازنویسی قانون به صورت یک اسکریپت ساده که مستقیماً متن را بررسی میکرد، بسیار مؤثرتر بود.
- خطاهای Manifest: دو فیلد مستند شده در manifest یعنی
$schemaوdisplayNameتوسط CLI به جای هشدار، به عنوان خطا (Error) رد میشوند. پیروی از مستندات باعث میشد پلاگین در بررسیclaude plugin validate(که برای ارسال به مارکتپلیس الزامی است) شکست بخورد.
نویسنده پیشنهاد میکند هر توسعهدهندهای که پلاگین میسازد، پیش از اعتماد به مستندات، دستور claude plugin validate را روی پوشه پلاگین و ریشه مارکتپلیس اجرا کند. او هشدار میدهد که به باینری اعتماد کنید، نه مستندات.
آینده و نگهداری
پلاگین در حال حاضر در نسخه 0.6.0 است و در گیتهاب تحت لایسنس MIT در دسترس است و نیازی به حساب کاربری، تلهمتری یا پیکربندی ندارد. این ابزار شامل ۲۲ تست است که CI در هر Push آنها را اجرا میکند. معیار اضافه کردن یک قانون جدید این است که باید ثابت شود در یک جلسه واقعی، قوانین قبلی نادیده گرفته شدهاند.
این پلاگین در حال حاضر برای Claude Cowork تست نشده و فقط برای Claude Code ادعا شده است. نویسنده به طور خاص به دنبال گزارشهای «مسدودسازیهای اشتباه» (False Blocks) است — مواردی که قلاب پاسخی را متوقف کرده که در واقع سؤالی نبوده است — زیرا این تنها حالت شکست است که توسط تستهای موجود قابل شناسایی نیست. او بیان میکند پلاگینی که مانع کار شود، حذف خواهد شد و او ترجیح میدهد یک قانون را تسهیل کند تا اینکه از آن دفاع کند.
گام بعدی شما
- اگر از Claude Code استفاده میکنید، این پلاگین را نصب کنید تا از خستگی شناختی ناشی از خواندن متون طولانی رها شوید.
- در هنگام نصب، حتماً برنامه را ریاستارت کنید؛ دستور
/reload-pluginsمهارتها را بارگذاری نمیکند. - اسکریپتهای Node پلاگین را پیش از نصب بخوانید تا از عدم دسترسی به شبکه مطمئن شوید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو