ممکن است Claude Code در استدلال درباره کد عالی باشد، اما همیشه مانند انسانی محتاط مکث نمیکند و به پیامدها نمیاندیشد. دقیقاً همین شکاف است که قلابها برای پر کردن آن ساخته شدهاند.
اینها دستورات پوسته، نقاط پایانی HTTP یا حتی درخواستهای LLM هستند که در نقاط مشخصی از چرخه حیات Claude Code، مثلاً درست پیش از فراخوانی ابزار یا بلافاصله پس از پایان آن، بهطور خودکار اجرا میشوند. از آنجا که قلابها اسکریپتهای قطعیاند، نه پیشنهادهایی در یک درخواست، هر بار به یک شکل عمل میکنند؛ نه آنگونه که Claude تصور میکند باید عمل کنند.
مسدود کردن دستورات مخرب پیش از اجرا
چون rm -rf یک ویژگی شخصیتی نیست

بدیهیترین و شاید مهمترین قلاب، محافظ PreToolUse برای ابزار Bash است که پیش از اجرا، هر دستور را اسکن میکند و مانع اجرای هر دستور مخربی میشود؛ مواردی مانند rm -rf، ابزارهای دیسک مانند dd یا mkfs، یا الگوی curl-pipe-to-shell که اسکریپتی را کورکورانه دانلود و اجرا میکند.
قلاب، دستور پیشنهادی را از stdin بهصورت JSON میخواند، آن را با فهرستی از عبارتهای منظم بررسی میکند و در صورت تطابق، با کد ۲ خارج میشود. این کد خروج به Claude میگوید عمل را مسدود کند و دلیل را از طریق stderr به آن بازمیگرداند تا بفهمد چرا متوقف شده است و بهجای تلاش کورکورانه دوباره، اقدام جایگزینی پیشنهاد دهد.
#!/bin/bash
command=$(cat | jq -r '.tool_input.command')
[[ "$command" =~ rm\ -rf|dd\ if=|mkfs\. ]] && echo "Blocked: destructive command" >&2 && exit 2
exit 0
محافظت از محیطها و اسرار
چون Claude واقعاً میخواهد فایل .env شما را «اصلاح» کند

یکی دیگر از قلابهای مفید، ابزارهای Edit و Write را هدف میگیرد تا مانع دسترسی Claude به فایلهای .env یا هر مسیر حاوی اسرار و اعتبارنامهها شود. اهمیت این موضوع بیش از چیزی است که به نظر میرسد؛ زیرا Claude هنگام رفع اشکال پیکربندی، ممکن است بخواهد فایل محیط را «اصلاح» کند. این دقیقاً همان نوع ویرایشی است که نباید، بهویژه بدون نظارت، به هوش مصنوعی سپرد.
قلاب مسیر فایلی را که قرار است در آن نوشته شود بررسی میکند و اگر با الگوی محافظتشده مطابقت داشته باشد، با کد ۲ خارج میشود و ویرایش را قاطعانه رد میکند. بقیه فرایند نیز دقیقاً مانند آنچه بالاتر توضیح داده شد عمل میکند.
#!/bin/bash
path=$(cat | jq -r '.tool_input.file_path')
[[ "$path" =~ \.env|secrets|credentials ]] && echo "Blocked: protected file" >&2 && exit 2
exit 0
متوقف کردن ارسال اجباری و دیگر فجایع Git
تاریخچه تا زمانی مقدس است که Claude خلافش را تصمیم نگیرد





خطاهای Git از دردناکترین اشتباهات ترمینالاند، زیرا میتوانند تاریخچه مشترک را بازنویسی کنند. قلابی با تطبیقگر Bash میتواند بهطور مشخص git push --force یا هر ارسالی به مقصد main یا master را شناسایی و پیش از اجرا مسدود کند.
حتی میتوانید یک گام فراتر بروید و git reset –hard را نیز مسدود کنید، زیرا این دستور بیسروصدا کارهای کامیتنشده را بدون راهی برای بازگردانی نابود میکند. این کار میتواند از تباه شدن یک بعدازظهر جلوگیری کند؛ زمانی که Claude پاک کردن فایلهای کامیتنشده را سریعترین راه برای مرتب کردن یک دایرکتوری کاری آشفته میداند.
#!/bin/bash
command=$(cat | jq -r '.tool_input.command')
[[ "$command" =~ push\ --force|push\ .*\ main|reset\ --hard ]] && echo "Blocked: dangerous git command" >&2 && exit 2
exit 0
مسدود کردن عملیات بیپروا در پایگاه داده
DROP TABLE هرگز نباید اشتباهی رخ دهد

اگر روند کاری شما با پایگاه داده سروکار دارد، چه Postgres برای پروژهای شخصی باشد و چه سامانهای که خودتان میزبانی میکنید، به قلابی نیاز دارید که SQL مخرب را پیش از رسیدن به ترمینال شناسایی کند. الگوی PreToolUse در اینجا نیز یکسان است: دستور Bash را برای کلیدواژههایی مانند DROP TABLE یا TRUNCATE بررسی کنید و در صورت یافتن آنها، بهجای اجازه دادن به اجرای دستور، با دلیلی روشن مجوز را رد کنید.
از آنجا که Claude Code میتواند پاسخ JSON ساختاریافتهای با permissionDecision از نوع deny و توضیحی روشن بازگرداند، بازخوردی مفیدتر از یک کد خروج ساده دریافت میکنید. این کار کمک میکند Claude در تلاش بعدی مسیرش را اصلاح کند، نه اینکه فقط از مسدود شدن شکایت کند.
#!/bin/bash
command=$(cat | jq -r '.tool_input.command')
[[ "$command" =~ DROP\ TABLE|TRUNCATE ]] && echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"Destructive SQL detected"}}'
کنترل مدیر بسته و پیکربندی CI
اشتباهات کوچک سریعتر از اشتباهات بزرگ انباشته میشوند

اینجا کمتر با فاجعهای تمامعیار روبهرو هستیم و بیشتر با اشتباهات کوچکی سروکار داریم که روی هم انباشته میشوند؛ مانند اجرای npm install توسط Claude در پروژهای که استانداردش pnpm است، یا ویرایش lockfileای که نباید به آن دست بزند. یک قلاب PreToolUse میتواند وجود pnpm-lock.yaml را بررسی کند و هر دستور npm را که lockfile متعارضی ایجاد میکند مسدود سازد. در نتیجه، Claude هر بار به استفاده از ابزار درست هدایت میشود و لازم نیست امیدوار باشید قراردادهای پروژه را فقط از روی زمینه به خاطر بسپارد.
میتوانید همین ایده را برای مسدود کردن تغییرات فایلهای پیکربندی CI و حتی اسکریپتهای استقرار در محیط تولید گسترش دهید، مگر اینکه انسانی صراحتاً آنها را تأیید کند. این کار به فشرده ماندن زمینه نیز کمک میکند.
#!/bin/bash
command=$(cat | jq -r '.tool_input.command')
[[ -f pnpm-lock.yaml && "$command" =~ ^npm\ install ]] && echo "Blocked: use pnpm instead" >&2 && exit 2
exit 0
یک فایل JSON و Claude بالاخره خوشرفتار میشود
همه این قلابها در فایل settings.json در پوشهٔ .claude نگهداری میشوند؛ چه برای هر پروژه و چه در پوشهٔ خانه برای پوشش سراسری. آنها زیر آرایهٔ قلابهای PreToolUse و همراه با تطبیقگر ابزار مربوطه، معمولاً Bash، Edit یا Write، قرار میگیرند. چون قلابها صرفاً اسکریپتاند، میتوانید آنها را با Bash و jq یا، اگر منطق خواناتری میخواهید، با پایتون بنویسید و در مخزن ثبت کنید تا هر کسی که از کدپایه شما استفاده میکند، همان حفاظهای ایمنی را به ارث ببرد.
{
"hooks": {
"PreToolUse": [
{ "matcher": "Bash", "hooks": [{ "type": "command", "command": ".claude/hooks/block-destructive-bash.sh" }] },
{ "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": ".claude/hooks/protect-secrets.sh" }] }
]
}
}
با فعال شدن این قلابها، Claude Code دیگر ابزاری نیست که باید مدام مراقبش باشید. در عوض، ابزاری در اختیار دارید که میتوانید با خیال آسوده کنترل صفحهکلید را به آن بسپارید.
منبع: این مطلب ترجمه و بومیسازی مقالهای از MakeUseOf به قلم Yadullah Abidi است. مشاهده مقاله اصلی