تا حالا حلقهها را با حالت پیشفرض «Accept Edits» اجرا کردیم. ولی این حالت یک سوءتفاهم بزرگ دارد: فقط ویرایش فایلها را خودکار تأیید میکند و روی اجرای دستور Bash هیچ اثری ندارد. در Print Mode هم که راهی برای تأیید تعاملی نیست — پس هر درخواست Permission، حلقه را فلج میکند. در این درس سیستم Permission و بعد Sandbox بومی Claude Code را میسازیم.
Accept Edits دقیقاً چه میکند؟
در CLI تعاملی با Shift+Tab بین حالتها میچرخی. `Accept Edits` فقط ویرایش فایل را بدون پرسیدن قبول میکند — و چون کد را با Git ردیابی میکنی، این نسبتاً امن است: هر تغییر قابل بازبینی و Revert است.
Allow List و Deny List
برای اجرای خودکار دستورها، باید صریح در `.claude/settings.json` مجوز بدهی. فقط چیزهای داخل Allow List بدون پرسش اجرا میشوند:
{
"permissions": {
"allow": [
"Bash(npm install)",
"Bash(npm run *)",
"Bash(*--version)",
"Bash(gh --help *)"
],
"deny": [
"Bash(rm *)",
"Bash(git rm *)",
"Read(.env*)"
]
}
}این الگوها Glob اند و موقعیت و مرز کلمه مهم است:
مثال Deny مهم: `Read(.env*)` تا مدل هیچ فایل محیطی را نخواند. و یادت باشد: **Deny همیشه برنده است**، حتی اگر همان چیز در Allow List هم باشد.
چرا در حلقه، این دو لیست حیاتیترند؟
در شل تعاملی میتوانی دستی Allow بزنی؛ در Print Mode نمیتوانی. وقتی حلقه به یک Permission برنخورده در لیست میرسد، Tool Call در Print Mode «شکست میخورد» و مدل مجبور میشود دورش بزند. تست ساده:
# تعاملی: از تو اجازه میخواهد
claude "do a curl request to laracasts.com and show response headers"
# Print Mode: نمیتواند بپرسد، پس مستقیم شکست میخورد
claude -p "do a curl request to laracasts.com"Sandbox بومی
راه امنتر، Sandbox داخلی Claude Code است. با دستور `/sandbox` تنظیمش میکنی. پیشفرض روی No Sandbox است؛ آن را روی «Sandbox Bash tool with auto-allow» بگذار و در Overrides گزینه «Allow un-sandboxed fallback» را روشن کن — یعنی اگر دستوری بهخاطر محدودیت Sandbox شکست خورد، به سیستم Permission معمولی برگردد.
با روشن کردن همین Sandbox، از خستگی Permission خلاص میشوی: طراحیاش این است که Bash خودکار مجاز باشد، ولی مدل نتواند بیرون پوشه فعلی بنویسد یا به شبکه وصل شود. حتی اگر بخواهد `~/.bashrc` را دست بزند یا Home را پاک کند، خود OS اجازه نمیدهد.
تنظیم دقیق Sandbox
همهچیز در `sandbox` داخل `settings.json` تنظیم میشود:
{
"sandbox": {
"network": {
"allow": [{ "domain": "laracasts.com" }]
},
"filesystem": {
"allowWrite": ["fastlane"],
"denyWrite": [".github"],
"denyRead": ["**/.aws/**"]
},
"excludedCommands": ["docker"]
}
}- **شبکه:** پیشفرض همه اتصالهای خروجی بسته است — این ریسک Prompt Injection و Exfiltration را بهشدت کم میکند. دامنههای لازم را صریح Allow کن.
- **فایل:** خواندن کل سیستم پیشفرض باز است ولی نوشتن فقط در پوشه فعلی؛ میتوانی نوشتن جای خاصی را باز، `.github` را قفل، و خواندن Credential های AWS را Deny کنی.
- **Excluded Commands:** مثلاً Docker در Sandbox بومی کار نمیکند، پس مستثنایش کن.
به زبان ساده
Accept Edits فقط فایل را خودکار میکند، Bash را نه. در حلقه کسی نیست Allow بزند، پس باید از قبل Allow/Deny بنویسی یا Sandbox بومی را روشن کنی.
مثال واقعی
`curl laracasts.com` در شل تعاملی اجازه میخواهد؛ همان دستور با `-p` شکست میخورد. با Sandbox و Allow کردن دامنه، Bash راه میافتد ولی نوشتن بیرون پوشه و شبکهٔ آزاد هنوز بسته است.