مهار کردنِ عامل26 از 37
این تمرین اختیاری است، برای خوانندههایی که کمی پایتون بلدند.
در درس «[هوکها: قاعدههایی که همیشه اجرا میشوند](hooks-rules-that-always-run)» هوکی دیدید که جلوی rm -rf را میگیرد، و در درس «[اجازه گرفتن](asking-permission)» قاعدههایی مثل allow npm run test * و deny git push * را دیدید. اینجا قلبِ هوکی را مینویسید که این قاعدهها را روی هر فرمانِ پوستهای که عامل میخواهد اجرا کند اعمال میکند.
## ورودی
اول قاعدهها، هر کدام در یک خط: deny (رد) یا allow (اجازه)، یک فاصله، و بعد یک الگو. بعد خطی با ---. بعد فرمانهایی که عامل میخواهد اجرا کند، هر کدام در یک خط:
``text
deny rm -rf *
deny git push *
allow git *
allow npm run test *
---
git status
git push origin main
ls -la
`
در یک الگو، * جای هر تعداد نویسه را میگیرد، حتی هیچ. بقیهی نویسهها باید دقیقاً جور باشند، و الگو باید با **کلِ** فرمان جور باشد، از اولین نویسه تا آخرین. تابعِ matches(pattern, command) از پیش برایتان نوشته شده و دقیقاً همین کار را میکند.
## کارِ شما
تابعِ decide(command, rules) را بنویسید. این تابع همانطور کار میکند که قاعدههای Claude Code کار میکنند:
1. اول قاعدههای رد را بررسی کنید، به همان ترتیبی که نوشته شدهاند. اولین قاعدهای که جور باشد جلوی فرمان را **میگیرد** (BLOCK)، هر چه قاعدههای اجازه بگویند.
2. اگر هیچ قاعدهی ردی جور نبود، قاعدههای اجازه را به ترتیب بررسی کنید. اولین قاعدهای که جور باشد فرمان را **مجاز میکند** (ALLOW).
3. اگر هیچ قاعدهای جور نبود، عامل باید از شما **بپرسد** (ASK).
تابع نتیجه و قاعدهای را که تصمیم گرفته برمیگرداند. بقیهی برنامه برای هر فرمان یک خط چاپ میکند:
`text
ALLOW git status (allow git *)
BLOCK git push origin main (deny git push *)
ASK ls -la (no rule)
`
به یک نکتهی غافلگیرکننده دقت کنید: قاعدهی deny rm -rf * جلوی sudo rm -rf /tmp/x را **نمیگیرد**، چون الگو باید از آغازِ فرمان جور باشد و این فرمان با sudo شروع میشود. (echo rm -rf /` هم، که فقط متنی چاپ میکند، رد نمیشود، و درست هم همین است.) از الگوهای ساده راحت میشود رد شد، و این یکی از دلیلهایی است که عاملهای واقعی قاعدهها و هوکها را با هم به کار میبرند، و یک محیطِ ایزوله را هم زیرِ آنها.
ورود برای امتحان این تمرین.