Knaph

مهار کردنِ عامل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 /` هم، که فقط متنی چاپ می‌کند، رد نمی‌شود، و درست هم همین است.) از الگوهای ساده راحت می‌شود رد شد، و این یکی از دلیل‌هایی است که عامل‌های واقعی قاعده‌ها و هوک‌ها را با هم به کار می‌برند، و یک محیطِ ایزوله را هم زیرِ آن‌ها.

ورود برای امتحان این تمرین.