SpyBara
Go Premium

permissions.md 2026-09-11 23:01 UTC to 2026-09-12 03:02 UTC

This page contains 8 additions and 4 deletions.

2026
Wed 9 22:58 Thu 10 23:00 Sat 12 03:02 Mon 14 22:58 Fri 18 23:58 Tue 22 23:59 Fri 25 23:58

Konfigurasi izin

Kontrol apa yang dapat diakses Claude Code dan lakukan dengan aturan izin terperinci, mode, dan kebijakan terkelola.

Claude Code mendukung izin terperinci sehingga Anda dapat menentukan dengan tepat apa yang diizinkan dilakukan oleh agen dan apa yang tidak. Pengaturan izin dapat diperiksa ke dalam kontrol versi dan didistribusikan ke semua pengembang di organisasi Anda, serta disesuaikan oleh pengembang individual.

Sistem izin

Claude Code menggunakan sistem izin berjenjang untuk menyeimbangkan kekuatan dan keamanan. Tabel menunjukkan, untuk setiap jenis alat, apakah mode Manual meminta persetujuan sebelum tindakan dijalankan. Mode izin lainnya mengubah mana dari ini yang meminta Anda; dalam mode otomatis pengklasifikasi meninjau tindakan alih-alih Anda, dan bagaimana pengklasifikasi mengevaluasi tindakan mencantumkan mana yang dilihatnya.

Jenis alat Contoh Persetujuan diperlukan Perilaku "Ya, dan jangan tanya lagi"
Hanya baca Pembacaan file, Grep Tidak, dalam direktori kerja dan direktori tambahan T/A
Perintah Bash Eksekusi shell Ya, kecuali serangkaian perintah hanya baca yang tertanam Secara permanen per repositori dan perintah
Modifikasi file Edit/tulis file Ya Hingga akhir sesi
Pengambilan web WebFetch Ya, kecuali serangkaian domain dokumentasi yang telah disetujui sebelumnya Secara permanen per repositori dan domain
Pencarian web WebSearch Ya Secara permanen per repositori

Ketika Anda memilih "Ya, dan jangan tanya lagi" dan persetujuan disimpan secara permanen, seperti untuk perintah Bash atau domain WebFetch, Claude Code menyimpan aturan ke .claude/settings.local.json di akar repositori git, diselesaikan melalui worktrees ke checkout utama. Aturan berlaku untuk sesi masa depan di mana pun dalam repositori itu, termasuk sesi yang dimulai di subdirektori dan di worktrees. Persetujuan modifikasi file tidak disimpan ke file: seperti yang ditunjukkan tabel, itu berlangsung hingga sesi berakhir. Dalam beberapa kasus, seperti di luar repositori git atau di Windows, Claude Code tidak menggunakan akar repositori; Tempat Claude Code mencari setiap file mencantumkan kasus-kasus itu dan tempat itu menyimpan aturan sebagai gantinya.

Sebelum v2.1.211, Claude Code selalu menyimpan aturan di direktori awal, jadi persetujuan yang diberikan di worktree atau subdirektori tidak berlaku untuk sisa repositori. Aturan yang disimpan versi sebelumnya di subdirektori atau worktree masih berlaku untuk sesi yang dimulai di sana.

Kadang-kadang prompt izin hanya menawarkan persetujuan satu kali, tanpa opsi "jangan tanya lagi" dan tanpa opsi untuk mengizinkan tindakan untuk sisa sesi. Claude Code menawarkan opsi-opsi itu hanya ketika prompt dapat menunjukkan kepada Anda semua yang akan mereka izinkan, jadi aturan yang Anda simpan dari prompt mencakup hanya apa yang dinamai opsinya.

Ketika direktori tempat Anda memulai Claude Code adalah apa yang membuat label opsi terlalu panjang, Claude Code mempersingkatnya dalam label, mengganti direktori home Anda dengan ~ dan kemudian akhir jalur dengan …, dan menyimpan opsi. Anda masih menyimpan aturan yang sama. Claude Code menghilangkan opsi dalam tiga kasus:

  • Perintah atau edit: terlalu besar untuk ditampilkan sepenuhnya.
  • Perintah atau jalur yang akan dicakup aturan: label tidak dapat menampung semuanya.
  • Direktori awal terlalu panjang, tidak dipersingkat: berisi karakter yang tidak dapat ditampilkan Claude Code dengan aman, atau bahkan awalnya tidak sesuai.

Setujui tindakan sekali, atau tambahkan aturan sendiri di /permissions.

Tambahkan komentar ketika Anda menjawab prompt izin

Anda dapat melampirkan catatan kepada Claude ketika Anda menyetujui atau menolak satu tindakan. Pada sebagian besar prompt izin, termasuk Bash, PowerShell, file, dan prompt alat MCP, pindah ke Ya atau Tidak dan tekan Tab untuk membuka bidang komentar pada opsi itu. Prompt WebFetch dan browser tidak menawarkan bidang. Opsi yang mengizinkan tindakan untuk sisa sesi atau menyimpan aturan juga tidak mengambil satu.

Dengan bidang terbuka, ketik komentar dan kemudian tekan salah satu kunci ini:

  • Enter: mengirimkan jawaban Anda dengan komentar terlampir. Jika Anda membiarkan bidang kosong, Claude Code mengirimkan jawaban tanpa komentar.
  • Tab: menutup bidang tanpa menjawab. Claude Code menyimpan teks yang Anda ketik dan masih mengirimkannya jika Anda menjawab dengan opsi itu.
  • Shift+Tab: pada prompt file, seperti prompt Edit atau Write, menutup bidang sama seperti Tab. Sebelum v2.1.235, menekan Shift+Tab di dalam bidang malah memilih opsi yang mengizinkan tindakan untuk sisa sesi, jadi Claude Code menyetujui tindakan untuk sisa sesi dan membuang komentar.

Claude Code mengirimkan komentar secara berbeda tergantung pada cara Anda menjawab:

  • Ya: Claude Code menjalankan tindakan, kemudian mengirimkan komentar Anda ke Claude setelah hasilnya.
  • Tidak: Claude Code mengirimkan komentar Anda ke Claude sebagai alasan penolakan, dan Claude terus bekerja. Jika Anda memilih Tidak tanpa komentar pada prompt dari percakapan utama, Claude Code menghentikan giliran.

Kelola izin

Anda dapat melihat dan mengelola izin alat Claude Code dengan /permissions. Dialog ini mencantumkan semua aturan izin dan file settings.json tempat setiap aturan berasal. Anda dapat membuka dialog saat Claude sedang bekerja: ketika Anda menambah atau menghapus aturan, Claude Code menerapkan perubahan mulai dari panggilan alat Claude berikutnya dalam giliran yang sama. Sebelum v2.1.234, Claude Code mengantrikan perintah hingga giliran selesai.

  • Aturan Allow memungkinkan Claude Code menggunakan alat yang ditentukan tanpa persetujuan manual.
  • Aturan Ask meminta konfirmasi setiap kali Claude Code mencoba menggunakan alat yang ditentukan.
  • Aturan Deny mencegah Claude Code menggunakan alat yang ditentukan.

Aturan dievaluasi secara berurutan: deny, kemudian ask, kemudian allow. Kecocokan pertama dalam urutan tersebut menentukan hasilnya, dan spesifisitas aturan tidak mengubah urutan.

Aturan deny yang luas seperti Bash(aws *) memblokir setiap panggilan yang cocok, termasuk panggilan yang juga cocok dengan aturan allow yang lebih sempit seperti Bash(aws s3 ls), jadi aturan deny tidak dapat membawa pengecualian daftar izin. Prioritas yang sama berlaku antara ask dan allow: aturan ask yang cocok meminta konfirmasi bahkan ketika aturan allow yang lebih spesifik juga cocok dengan panggilan yang sama.

Aturan deny berperilaku berbeda tergantung pada apakah mereka menamai alat atau membatasi pola dalam satu alat. Nama alat biasa seperti Bash menghapus alat dari konteks Claude sepenuhnya, jadi Claude tidak pernah melihatnya. Penghapusan nama biasa berlaku untuk setiap alat kecuali EndConversation: aturan deny tidak dapat menghapusnya saat alat lain tetap ada, dan aturan ask tidak pernah memintanya. Aturan yang dibatasi seperti Bash(rm *) membiarkan alat tersedia dan memblokir panggilan yang cocok ketika Claude mencoba menggunakannya.

Ketika mode auto tersedia untuk sesi Anda, dialog juga mencakup aturan pengklasifikasi mode auto. Pilih tab Auto mode untuk melihatnya.

Mode izin

Claude Code mendukung beberapa mode izin yang mengontrol bagaimana alat disetujui. Lihat Permission modes untuk mengetahui kapan menggunakan masing-masing. Untuk mengubah mode yang dimulai sesi, atur defaultMode dalam file pengaturan Anda. Mode mana yang dimulai sesi mencakup default bawaan untuk setiap paket dan apa yang dibaca ekstensi VS Code.

Mode Deskripsi
default Meminta izin pada penggunaan pertama setiap alat. Berlabel Manual di CLI, ekstensi VS Code dan JetBrains, dan aplikasi desktop, dan Claude Code menerima manual sebagai alias. Label dan alias memerlukan Claude Code v2.1.200 atau lebih baru. Label aplikasi desktop tidak bergantung pada versi CLI Anda
acceptEdits Secara otomatis menerima edit file dan perintah sistem file umum seperti mkdir, touch, mv, dan cp untuk jalur di direktori kerja atau additionalDirectories
plan Claude membaca file dan menjalankan perintah shell hanya-baca untuk menjelajahi tetapi tidak mengedit file sumber Anda; dengan mode auto tersedia, perintah yang disetujui classifier juga berjalan. Berlabel Plan di CLI dan ekstensi VS Code
auto Secara otomatis menyetujui panggilan alat dengan pemeriksaan keamanan latar belakang yang memverifikasi tindakan selaras dengan permintaan Anda
dontAsk Secara otomatis menolak setiap panggilan yang sebaliknya akan meminta; pembacaan file di direktori kerja Anda dan tindakan lain yang tidak memerlukan persetujuan masih berjalan, begitu juga dengan alat yang telah disetujui sebelumnya melalui /permissions atau aturan permissions.allow. AskUserQuestion, alat MCP yang ditandai requiresUserInteraction, dan alat konektor organisasi Anda atur ke ask dalam sesi di mana pengaturan itu mencapai Claude Code ditolak bahkan jika Anda telah mengizinkannya
bypassPermissions Melewati prompt izin, kecuali untuk tindakan yang tidak ada mode auto-approve

Untuk mencegah mode bypassPermissions atau auto digunakan, atur permissions.disableBypassPermissionsMode atau permissions.disableAutoMode ke "disable" dalam file pengaturan apa pun. Ini paling berguna dalam pengaturan terkelola di mana mereka tidak dapat ditimpa.

Sintaks aturan izin

Aturan izin mengikuti format Tool atau Tool(specifier). Tanda kurung di dalam specifier bersifat literal, jadi perintah atau jalur yang mengandungnya tidak memerlukan escaping.

Cocokkan semua penggunaan alat

Untuk mencocokkan semua penggunaan alat, gunakan hanya nama alat tanpa tanda kurung:

Aturan Efek
Bash Mencocokkan semua perintah Bash
WebFetch Mencocokkan semua permintaan pengambilan web
Read Mencocokkan semua pembacaan file

Bash(*) setara dengan Bash dan mencocokkan semua perintah Bash. Sebagai aturan penolakan, kedua bentuk menghapus alat dari konteks Claude.

Gunakan specifier untuk kontrol terperinci

Tambahkan specifier dalam tanda kurung untuk mencocokkan penggunaan alat tertentu:

Aturan Efek
Bash(npm run build) Mencocokkan perintah yang tepat npm run build
Read(./.env) Mencocokkan pembacaan file .env di direktori saat ini
WebFetch(domain:example.com) Mencocokkan permintaan pengambilan ke example.com

Cocokkan berdasarkan parameter input

Aturan penolakan dan tanya dapat mencocokkan parameter input tingkat atas pada alat apa pun yang dibangun dengan Tool(param:value).

Untuk mencocokkan parameter pada alat MCP, berikan aturan penolakan dengan --disallowedTools. Ketika Claude Code memuat file pengaturan, aturan mcp__ apa pun yang memiliki tanda kurung akan dilewati. Claude Code mencantumkan aturan yang dilewati dalam dialog pengaturan tidak valid ketika sesi interaktif dimulai, dan dalam output claude doctor.

Aturan parameter cocok ketika Claude memanggil alat dengan parameter tersebut diatur ke nilai yang tepat. Aturan izin untuk satu nilai parameter tidak akan menetapkan bahwa panggilan aman secara keseluruhan, jadi aturan izin terus menggunakan sintaks specifier masing-masing alat. Ini berfungsi untuk parameter skalar apa pun yang diterima alat:

Aturan Cocok
Agent(model:opus) Panggilan Agent yang meminta tingkat model Opus
Agent(isolation:worktree) Panggilan Agent yang meminta git worktree
Bash(run_in_background:true) Panggilan Bash yang berjalan di latar belakang

Pencocokan parameter mengikuti aturan ini:

  • Nama parameter harus berupa bidang langsung dari input alat, seperti model pada alat Agent. Bidang yang bersarang di dalam objek atau array tidak dapat dicocokkan
  • Setiap aturan menamai satu parameter. Untuk membatasi pada model dan isolation, tulis dua aturan, Agent(model:opus) dan Agent(isolation:worktree), daripada menggabungkannya dalam satu aturan
  • Nilai mendukung * sebagai wildcard yang mencocokkan urutan karakter apa pun, jadi Agent(isolation:*) mencocokkan nilai isolasi eksplisit apa pun. Tanpa * pencocokan bersifat tepat
  • Parameter yang dihilangkan model tidak pernah dicocokkan, jadi Agent(model:*) tidak mencocokkan panggilan yang membiarkan model tidak diatur
  • Nilai dibandingkan dengan input literal yang dikirim Claude, sebelum normalisasi apa pun. Agent(model:opus) mencocokkan alias opus tetapi bukan ID model lengkap. Jalankan dengan --verbose untuk melihat nama dan nilai parameter yang tepat dalam setiap panggilan alat
  • Spasi di sekitar titik dua diabaikan

Anda tidak dapat mencocokkan bidang konten utama alat dengan cara ini: command untuk Bash dan PowerShell, file_path untuk Read, Edit, dan Write, path untuk Grep dan Glob, notebook_path untuk NotebookEdit, dan url untuk WebFetch. Aturan seperti Bash(command:rm *) dapat dilewati oleh perintah gabungan, jadi Claude Code mengabaikannya dan mengeluarkan peringatan startup. Gunakan Bash(rm *), Read(./path), atau WebFetch(domain:host) sebagai gantinya.

Pola wildcard

* dalam aturan Bash mencocokkan teks apa pun, termasuk spasi, jadi satu aturan mencakup keluarga perintah. Aturan tanpa * mencocokkan satu perintah yang tepat.

Tulis perintah yang ingin Anda jalankan Claude tanpa bertanya, dan ganti bagian yang bervariasi dengan *. Dengan konfigurasi ini, Claude Code menjalankan skrip npm dan git commit tanpa bertanya dan menolak perintah yang dimulai dengan git push. Push yang ditulis dengan cara lain, seperti git -C . push, tidak cocok; lihat apa yang tidak cocok dengan aturan Bash.

{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git commit *)"
    ],
    "deny": [
      "Bash(git push *)"
    ]
  }
}

* dapat berada di mana saja dalam aturan: di awal, di tengah, atau di akhir. Setiap baris menunjukkan aturan, perintah yang cocok, dan perintah terdekat yang tidak cocok:

Anda tulis Cocok Tidak cocok
Bash(npm run build) npm run build npm run build --watch
Bash(npm run *) npm run build, npm run test --watch, npm run npm install
Bash(git log * main) git log --oneline main, git log -5 main, git log --output=<file> main git log main, git push origin main
Bash(git * main) git merge main, git push origin main, git -c core.fsmonitor=<script> diff main git log
Bash(* --version) node --version, bash -c 'echo hi' --version node -v
Bash(ls *) ls -la, ls lsof
Bash(ls*) ls -la, lsof
Bash(* --help *) npm --help x npm --help

Tiga aturan pencocokan menghasilkan baris-baris tersebut:

  • * mewakili teks apa pun yang ada di tempatnya. Dalam Bash(git * main), itu mewakili subperintah, jadi Claude Code mencocokkan setiap subperintah git dan setiap opsi sebelumnya. Itu termasuk -c, yang membuat git menjalankan program yang Anda beri nama. Dalam Bash(* --version), * mewakili program, jadi program apa pun cocok.
  • * di akhir, dengan spasi sebelumnya, juga mencocokkan perintah telanjang. Bash(ls *) mencocokkan ls, dan Bash(git log *) mencocokkan git log. Itu hanya berlaku ketika * trailing adalah satu-satunya wildcard aturan: Bash(* --help *) mencocokkan npm --help x tetapi bukan npm --help.
  • Spasi sebelum * trailing adalah bagian dari aturan. Bash(ls *) memerlukan spasi setelah ls, jadi lsof tidak cocok. Bash(ls*) tidak memiliki spasi, jadi itu juga mencocokkan lsof.

Akhiran :* adalah cara setara untuk menulis wildcard trailing, jadi Bash(ls:*) mencocokkan perintah yang sama dengan Bash(ls *).

Dialog izin menulis bentuk yang dipisahkan spasi ketika Anda memilih "Ya, jangan tanya lagi" untuk awalan perintah. Bentuk :* hanya dikenali di akhir pola. Dalam pola seperti Bash(git:* push), titik dua diperlakukan sebagai karakter literal dan tidak akan mencocokkan perintah git.

Wildcard nama alat

Aturan penolakan dan tanya juga menerima pola glob dalam posisi nama alat. Pola harus cocok dengan nama alat lengkap: "*" cocok dengan setiap alat, dan "mcp__*" cocok dengan setiap alat MCP di semua server. Alat yang cocok dengan aturan penolakan nama telanjang dihapus dari konteks Claude, sama seperti nama alat telanjang, termasuk pengecualian EndConversation: penolakan glob tidak dapat menghapusnya sementara alat lain tetap ada, dan tanya glob tidak pernah memintanya. Konfigurasi ini menolak setiap alat MCP:

{
  "permissions": {
    "deny": [
      "mcp__*"
    ]
  }
}

Aturan izin menerima glob nama alat hanya setelah awalan literal mcp__<server>__. Segmen server harus bebas glob sehingga aturan menamai server spesifik yang Anda konfigurasi. mcp__puppeteer__* cocok dengan setiap alat dari server puppeteer, dan mcp__github__get_* cocok dengan alat get_ miliknya. Glob izin yang tidak berlabuh seperti "*", "B*", atau "mcp__*" dilewati dengan peringatan dan tidak secara otomatis menyetujui apa pun.

Aturan penolakan atau tanya yang nama alatnya tidak cocok dengan alat yang dikenal menghasilkan peringatan startup untuk menangkap kesalahan ketik. Nama alat yang berisi _ atau * dikecualikan dari pemeriksaan.

Label yang ditampilkan untuk alat dalam transkrip dan dialog izin dapat berbeda dari nama kanoniknya. Misalnya, alat yang diberi label Stop Task dalam transkrip memiliki nama kanonik TaskStop. Aturan izin dan pencocokan hook tidak cocok dengan label, jadi aturan yang ditulis sebagai Stop Task tidak cocok. Untuk aturan penolakan dan tanya, peringatan startup di atas menangkap ketidaksesuaian. Gunakan nama kanonik yang tercantum dalam referensi alat.

Aturan izin khusus alat

Bash

Aturan Bash mencocokkan seluruh teks perintah, dengan * mewakili teks apa pun. Pola wildcard menunjukkan perintah mana yang cocok dengan setiap bentuk aturan dan di mana menempatkan *. Sisa bagian ini mencakup cara Claude Code mencocokkan perintah gabungan dan pembungkus, apa yang tidak dicocokkan aturan, perintah hanya baca, dan pengalihan.

Perintah gabungan

Aturan deny dan ask berlaku ketika subperintah apa pun mencocokkannya, termasuk perintah yang bersarang di dalam subshell, substitusi perintah, atau badan alur kontrol seperti loop for. Aturan ask seperti Bash(git clean *) masih meminta Anda untuk cd /tmp && git clean -f atau echo "$(git clean -f)", bahkan dalam mode auto.

Ketika && atau || tidak memiliki apa pun setelahnya, seperti dalam npm test &&, Claude Code memperlakukan perintah sebagai tidak dapat diurai dan tidak membaginya menjadi subperintah untuk pencocokan aturan allow, jadi aturan seperti Bash(npm *) tidak menyetujuinya.

Ketika Anda menyetujui perintah gabungan dengan "Ya, jangan tanya lagi", Claude Code menyimpan aturan terpisah untuk setiap subperintah yang memerlukan persetujuan, bukan satu aturan untuk string gabungan lengkap. Misalnya, menyetujui git status && npm test menyimpan aturan untuk npm test, jadi invokasi npm test di masa depan dikenali terlepas dari apa yang mendahului &&. Subperintah seperti cd ke subdirektori menghasilkan aturan Read mereka sendiri untuk jalur itu. Hingga 5 aturan dapat disimpan untuk satu perintah gabungan.

Pembungkus

Sebelum mencocokkan aturan Bash, Claude Code menghilangkan serangkaian pembungkus tetap, jadi aturan seperti Bash(npm test *) juga mencocokkan timeout 30 npm test. Pembungkus yang dihilangkan adalah timeout, time, nice, nohup, dan stdbuf, ditambah shell builtin command dan builtin, dan noglob zsh. Masing-masing menjalankan argumennya sebagai perintah aktual. Dua bentuk terkait tidak dihilangkan: bentuk query command -v, yang mencari perintah daripada menjalankannya, dan nocorrect zsh.

Claude Code juga menghilangkan penugasan terkemuka variabel lingkungan yang dikenal aman, jadi Bash(npm test *) mencocokkan NODE_ENV=test npm test. Aturan allow tidak akan mencocokkan melampaui penugasan variabel apa pun yang lain. Aturan deny atau ask mencocokkan melampaui penugasan terkemuka apa pun, jadi Bash(rm *) dalam deny masih mencocokkan FOO=bar rm -rf tmp/.

xargs telanjang juga dihilangkan, jadi Bash(grep *) mencocokkan xargs grep pattern. Penghilangan hanya berlaku ketika xargs tidak memiliki flag: invokasi seperti xargs -n1 grep pattern dicocokkan sebagai perintah xargs, jadi aturan yang ditulis untuk perintah inner tidak mencakupnya.

Daftar pembungkus ini bawaan dan tidak dapat dikonfigurasi. Pelari lingkungan pengembangan seperti direnv exec, devbox run, mise exec, npx, dan docker exec tidak ada dalam daftar. Karena alat ini menjalankan argumen mereka sebagai perintah, aturan seperti Bash(devbox run *) mencocokkan apa pun yang datang setelah run, termasuk devbox run rm -rf .. Untuk menyetujui pekerjaan di dalam pelari lingkungan, tulis aturan spesifik yang mencakup baik pelari maupun perintah inner, seperti Bash(devbox run npm test). Tambahkan satu aturan per perintah inner yang ingin Anda izinkan.

Pembungkus exec seperti watch, setsid, ionice, dan flock tidak dapat disetujui otomatis oleh aturan awalan seperti Bash(watch *), jadi dalam mode Manual mereka selalu meminta. Hal yang sama berlaku untuk find dengan -exec atau -delete: aturan Bash(find *) tidak mencakup bentuk ini. Untuk menyetujui invokasi spesifik, tulis aturan pencocokan tepat untuk string perintah lengkap.

Apa yang tidak dicocokkan aturan Bash

Aturan Bash mencocokkan teks perintah yang ditulis Claude, setelah Claude Code membagi perintah gabungan dan menghilangkan pembungkus. Aturan tidak mencocokkan program yang sama yang dipanggil dalam bentuk berbeda, jadi aturan deny atau ask mencakup invokasi yang biasanya dihasilkan Claude dan bukan batas keamanan di sekitar program. Aturan ini dalam deny atau ask menghentikan bentuk pertama dan bukan yang lain:

Aturan Menghentikan Tidak menghentikan
Bash(curl *) curl https://example.com /usr/bin/curl https://example.com, sh -c 'curl https://example.com'
Bash(rm *) rm -rf build/ /bin/rm -rf build/, bash -c 'rm -rf build/'
Bash(git push *) git push origin main git -C . push origin main, git -c push.default=current push origin main, git 'push' origin main

Aturan lain Anda dan mode izin memutuskan perintah di kolom terakhir.

Untuk penegakan sistem file dan jaringan yang tidak bergantung pada teks perintah, gunakan sandboxing. Untuk memeriksa teks perintah lengkap dengan logika Anda sendiri sebelum dijalankan, gunakan hook PreToolUse.

Perintah hanya baca

Claude Code mengenali serangkaian perintah Bash bawaan sebagai hanya baca dan menjalankannya tanpa prompt izin di setiap mode, kecuali untuk jalur yang dijaga oleh permissions.blockReadsOutsideWorkingDirectories. Serangkaian ini mencakup ls, cat, echo, pwd, head, tail, grep, find, wc, which, diff, stat, du, cd, dan bentuk hanya baca dari git. Serangkaian ini tidak dapat dikonfigurasi; untuk memerlukan prompt untuk salah satu perintah ini, tambahkan aturan ask atau deny untuk itu.

Pengalihan seperti ls > out.txt menambahkan pemeriksaan pada target. Lihat Pengalihan.

Pola glob yang tidak dikutip diizinkan untuk perintah yang setiap flagnya hanya baca, jadi ls *.ts dan wc -l src/*.py berjalan tanpa prompt.

Dalam mode Manual, perintah dari serangkaian ini masih meminta dalam kasus ini:

  • Glob yang tidak dikutip untuk perintah dengan flag yang mampu menulis: perintah dengan flag yang mampu menulis atau exec, seperti find, sort, sed, dan git, meminta ketika glob yang tidak dikutip ada, karena glob dapat berkembang menjadi flag seperti -delete.
  • docker yang menunjuk ke daemon lain: bentuk hanya baca dari docker meminta ketika perintah membawa flag yang memilih daemon berbeda, seperti -H, --context, atau --url dan --connection Podman.
  • file dengan flag pembuka jalur: file meminta ketika melewatkan -m/--magic-file atau -f/--files-from, karena flag tersebut membuat file membuka jalur yang dinamai dalam nilai flag.
  • Jalur jaringan di Windows: perintah yang argumennya mencakup jalur jaringan (UNC), seperti \\server\share\file, meminta karena mengakses jalur jaringan dapat mengirim kredensial Windows Anda ke host yang dinamainya. Pemeriksaan yang sama berlaku untuk perintah alat PowerShell.
  • Perintah yang analisisnya tidak dapat diurai: ketika Claude Code tidak dapat sepenuhnya mengurai perintah, itu meminta persetujuan daripada memperlakukan perintah sebagai hanya baca. Perintah yang lebih panjang dari 10.000 karakter selalu meminta karena melebihi apa yang dianalisis.

cd ke jalur di dalam direktori kerja Anda atau direktori tambahan juga hanya baca, dan perintah gabungan seperti cd packages/api && ls berjalan tanpa prompt ketika setiap bagian memenuhi syarat sendiri. Kombinasi ini meminta bahkan ketika setiap bagian hanya baca:

  • cd dengan git: meminta ketika cd berubah ke direktori yang berbeda, karena menjalankan git di direktori baru dapat menjalankan hook direktori itu. cd yang targetnya diselesaikan ke direktori kerja saat ini adalah no-op dan tidak memicu prompt.
  • cd dengan pengalihan: meminta ketika Claude Code tidak dapat menentukan direktori mana target pengalihan diselesaikan setelah cd berjalan. Perintah yang satu-satunya target pengalihan adalah /dev/null, seperti cd app; grep -r pattern . 2>/dev/null, tidak meminta, karena /dev/null tidak bergantung pada direktori kerja.

Pengalihan

Ketika perintah mengalihkan output atau input, Claude Code memeriksa target pengalihan terhadap aturan file Anda seolah-olah Claude menulis atau membaca file itu secara langsung:

  • Pengalihan output: untuk > file, >> file, atau 2> file, pemeriksaan mencakup aturan allow dan deny Edit Anda, jalur yang dilindungi, dan direktori kerja. Aturan seperti Bash(git commit *) memungkinkan perintah, bukan target. Target yang dimulai dengan ~ atau berisi karakter glob memerlukan persetujuan Anda.
  • Pengalihan input: untuk < file, pemeriksaan mencakup aturan allow dan deny Read Anda dan direktori kerja. Target di luar direktori kerja memerlukan persetujuan Anda kecuali aturan allow mencakupnya. Target yang berisi pola glob, atau jalur relatif yang mengikuti cd dalam perintah yang sama, memerlukan persetujuan Anda bahkan ketika aturan allow mencakupnya. Claude Code memeriksa target input dalam v2.1.257 dan lebih baru.

Target tanpa file di belakangnya tidak diperiksa: /dev/null, bentuk file-descriptor seperti 2>&1 dan <&3, dan here-docs dan here-strings.

PowerShell

Aturan izin PowerShell menggunakan bentuk yang sama dengan aturan Bash. Wildcard dengan * mencocokkan di posisi mana pun, akhiran :* setara dengan trailing *, dan PowerShell telanjang atau PowerShell(*) mencocokkan setiap perintah. Konfigurasi ini memungkinkan perintah Get-ChildItem dan git commit sambil memblokir Remove-Item:

{
  "permissions": {
    "allow": [
      "PowerShell(Get-ChildItem *)",
      "PowerShell(git commit *)"
    ],
    "deny": [
      "PowerShell(Remove-Item *)"
    ]
  }
}

Alias umum dikanonikalisasi sebelum pencocokan. Aturan yang ditulis untuk nama cmdlet juga mencocokkan aliasnya, jadi PowerShell(Get-ChildItem *) mencocokkan gci, ls, dan dir juga. Pencocokan tidak peka huruf besar-kecil.

Claude Code mengurai AST PowerShell dan memeriksa setiap perintah dalam perintah gabungan secara independen. Operator pipeline |, pemisah pernyataan ;, dan pada PowerShell 7+ operator rantai && dan || membagi perintah gabungan menjadi subperintah. Aturan harus mencocokkan setiap subperintah agar perintah gabungan diizinkan.

Read dan Edit

Untuk memblokir alat file Claude dari membaca file atau direktori, tambahkan aturan deny Read untuk jalurnya, seperti Read(./.env) atau Read(./secrets/**); Exclude sensitive files memiliki contoh siap tempel.

Aturan Edit berlaku untuk semua alat bawaan yang mengedit file. Claude membuat upaya terbaik untuk menerapkan aturan Read ke semua alat bawaan yang membaca file seperti Grep dan Glob, ke penyebutan @file dalam prompt Anda, dan ke seleksi dan konteks file terbuka yang IDE yang terhubung bagikan dengan Claude.

Aturan deny Read juga memblokir alat Edit dan Write pada jalur yang sama, termasuk membuat file baru di sana. NotebookEdit tidak tercakup, jadi tambahkan aturan deny Edit untuk jalur yang tidak boleh diubah alat apa pun. Pemeriksaan memerlukan Claude Code v2.1.208 atau lebih baru pada edit, dan v2.1.228 atau lebih baru pada write.

Claude Code memeriksa izin file terhadap aturan Edit(path) dan Read(path) saja. Jika Anda menulis aturan jalur untuk Write, NotebookEdit, Glob, atau alat MultiEdit warisan sebagai gantinya, Claude Code menerima aturan tetapi tidak pernah berkonsultasi dengannya, dan memperingatkan saat startup, kecuali untuk aturan Glob yang dilewatkan dalam --allowedTools. Gunakan Edit(docs/**) sebagai pengganti Write(docs/**), NotebookEdit(docs/**), atau MultiEdit(docs/**), dan Read(docs/**) sebagai pengganti Glob(docs/**). Claude Code tidak memperingatkan tentang aturan nama alat tanpa jalur, seperti aturan deny untuk Write; itu mencocokkan aturan itu di tingkat alat di mana-mana. Memerlukan Claude Code v2.1.210 atau lebih baru.

Aturan Read dan Edit keduanya menggunakan sintaks pola gitignore dengan empat jenis pola yang berbeda; untuk pola direktori segmen tunggal, kedalaman pencocokan juga bergantung pada jenis aturan, dijelaskan nanti di bagian ini:

Pola Arti Contoh Cocok
//path Jalur absolut dari akar sistem file Read(//Users/alice/secrets/**) /Users/alice/secrets/**
~/path Jalur dari direktori home Read(~/Documents/*.pdf) /Users/alice/Documents/*.pdf
/path Jalur relatif terhadap sumber pengaturan Edit(/src/**/*.ts) <primary working directory>/src/**/*.ts dalam pengaturan proyek
path atau ./path Jalur relatif terhadap direktori saat ini Read(*.env) <cwd>/*.env

Pola /path berlabuh di direktori yang terkait dengan sumber pengaturan yang mendefinisikannya, jadi aturan yang sama mencocokkan lokasi berbeda tergantung di mana Anda menempatkannya:

Aturan didefinisikan dalam /path diselesaikan ke
Pengaturan proyek di .claude/settings.json <primary working directory>/path
Pengaturan lokal di .claude/settings.local.json <primary working directory>/path
Pengaturan pengguna di ~/.claude/settings.json ~/.claude/path
File yang dilewatkan dengan --settings <file> <directory of file>/path
Flag CLI atau aturan sesi <primary working directory>/path

Aturan yang Anda tambahkan melalui /permissions mengikuti baris untuk file pengaturan yang Anda simpan.

Aturan pengaturan lokal berlabuh di primary working directory sesi, bukan di akar repositori tempat Claude Code menyimpan file dalam v2.1.211 dan lebih baru. Dalam sesi yang dimulai di akar repositori, dua direktori sama; dalam sesi worktree, aturan bersama seperti Edit(/src/**) mencocokkan direktori src/ worktree itu sendiri.

Aturan deny seperti Read(/secrets/**) dalam pengaturan pengguna memblokir ~/.claude/secrets/**, bukan direktori secrets dalam proyek Anda. Untuk menulis aturan dalam pengaturan pengguna yang berlaku di dalam setiap proyek, gunakan jalur absolut // atau jalur relatif home ~/ sebagai gantinya.

Di Windows, jalur dinormalisasi ke bentuk POSIX sebelum pencocokan. C:\Users\alice menjadi /c/Users/alice, jadi gunakan //c/**/.env untuk mencocokkan file .env di mana pun di drive itu. Untuk mencocokkan di semua drive, gunakan //**/.env.

Contoh:

  • Edit(/docs/**): edit di <primary working directory>/docs/, bukan /docs/ atau <primary working directory>/.claude/docs/
  • Read(~/.zshrc): membaca .zshrc direktori home Anda
  • Edit(//tmp/scratch.txt): edit jalur absolut /tmp/scratch.txt
  • Read(src/**): sebagai aturan allow, membaca dari <current-directory>/src/ saja; sebagai aturan deny atau ask, mencocokkan direktori src di kedalaman apa pun di bawah direktori saat ini

Aturan hanya mencocokkan file di bawah jangkarannya; dalam batas itu, kedalaman pencocokan bergantung pada bentuk pola dan, untuk pola direktori segmen tunggal, jenis aturan, dijelaskan di bawah. Nama file telanjang mengikuti semantik gitignore dan mencocokkan di kedalaman apa pun, jadi Read(.env) dan Read(**/.env) setara:

Aturan deny Memblokir Tidak memblokir
Read(.env) atau Read(**/.env) .env apa pun di atau di bawah direktori saat ini .env di direktori induk atau proyek lain
Read(//**/.env) .env apa pun di mana pun di sistem file tidak ada; aturan ini berlabuh di akar sistem file

Pola relatif dengan segmen direktori tunggal, seperti src/**, mencocokkan di kedalaman berbeda tergantung pada jenis aturan:

  • Aturan allow: Edit(src/**) mencocokkan hanya <cwd>/src dan file di bawahnya. Untuk memungkinkan nama direktori di kedalaman apa pun, tulis Edit(**/src/**).
  • Aturan deny dan ask: Read(secrets/**) mencocokkan direktori bernama secrets di kedalaman apa pun di bawah direktori saat ini, jadi aturan juga berlaku untuk salinan bersarang.

Setiap bentuk pola lainnya mencocokkan pada kedalaman yang sama di setiap jenis aturan: Edit(/src/**) dan Edit(src/components/**) mencocokkan hanya di lokasi berlabuhnya, sementara Edit(**/src/**) mencocokkan di kedalaman apa pun.

Contoh berikut menunjukkan setiap bentuk pola terhadap proyek dengan direktori src/ tingkat atas dan salinan bersarang di bawah vendor/:

<current-directory>/
├── src/
│   └── app.ts
└── vendor/
    └── pkg/
        └── src/
            └── lib.js
Aturan Cocok src/app.ts Cocok vendor/pkg/src/lib.js
Edit(src/**) sebagai aturan allow Ya Tidak
Edit(src/**) sebagai aturan deny atau ask Ya Ya
Edit(/src/**) dalam jenis aturan apa pun Ya Tidak
Edit(**/src/**) dalam jenis aturan apa pun Ya Ya

Ketika Anda menyetujui jalur file dengan "Ya, jangan tanya lagi", Claude Code menghindari karakter pola gitignore dalam jalur itu, seperti [, ], dan *, jadi aturan yang dihasilkan hanya mencocokkan jalur literal yang Anda setujui. Aturan yang Anda tulis sendiri tidak dihindari. Sebelum v2.1.202, Claude Code menyimpan jalur tanpa dihindari, jadi aturan yang dihasilkan untuk direktori bernama [2024-06] Reports dapat gagal mencocokkan jalurnya sendiri atau mencocokkan direktori saudara yang tidak diinginkan.

Anda tidak perlu menghindari tanda kurung dalam jalur, jadi Edit(./Finance (2024)/**) mencocokkan folder Finance (2024) seperti yang dieja.

Aturan deny atau ask yang jalurnya tidak dapat digunakan sebagai pola gitignore masih menjaga jalur yang tepat itu. Aturan allow dengan pola yang tidak dapat digunakan tidak menyetujui apa pun.

Ketika Claude mengakses symlink, aturan izin memeriksa dua jalur: symlink itu sendiri dan file yang diselesaikannya. Aturan allow dan deny memperlakukan pasangan itu secara berbeda: aturan allow kembali ke meminta Anda, sementara aturan deny memblokir sepenuhnya.

  • Aturan allow: berlaku hanya ketika jalur symlink dan targetnya mencocokkan. Symlink di dalam direktori yang diizinkan yang menunjuk ke luar masih meminta Anda.
  • Aturan deny: berlaku ketika jalur symlink atau targetnya mencocokkan. Symlink yang menunjuk ke file yang ditolak itu sendiri ditolak. Misalnya, dengan Read(./project/**) diizinkan dan Read(~/.ssh/**) ditolak, symlink di ./project/key menunjuk ke ~/.ssh/id_rsa diblokir: target gagal aturan allow dan mencocokkan aturan deny.

Pada macOS dan Linux, aturan deny atau ask yang ditulis melalui direktori yang disimlink dengan pola //, ~/, atau / juga berlaku di lokasi nyata direktori. Misalnya, di macOS, di mana /etc diselesaikan ke /private/etc, Read(//etc/**) juga memblokir /private/etc/hosts. Sebelum v2.1.268, aturan deny atau ask yang ditulis melalui direktori yang disimlink tidak berlaku untuk jalur yang diberikan oleh lokasi nyatanya.

Ketika alat membuka file yang disetujui, Claude Code mengkonfirmasi jalur masih diselesaikan ke lokasi yang pemeriksaan izin setujui.

Grep dan Glob mencari direktori yang argumen path diselesaikan ke. Claude Code menerapkan aturan deny Read ke direktori itu.

WebFetch

Aturan WebFetch menggunakan awalan domain: dan mencocokkan terhadap nama host dari URL yang diminta. Pencocokan tidak peka huruf besar-kecil, mendukung wildcard *, dan menghilangkan titik trailing dari aturan dan nama host sehingga example.com. dan example.com diperlakukan sama.

  • WebFetch(domain:example.com) mencocokkan permintaan ke example.com
  • WebFetch(domain:*.example.com) mencocokkan subdomain apa pun di kedalaman apa pun, seperti api.example.com atau a.b.example.com, tetapi bukan example.com itu sendiri
  • WebFetch(domain:*) mencocokkan setiap domain. Ini bukan sama dengan aturan WebFetch telanjang; lihat Allow or deny every fetch

Di posisi mana pun selain *. terkemuka atau * telanjang, wildcard mencocokkan hanya teks antara dua titik. WebFetch(domain:example.*) mencocokkan example.org, di mana * menjadi org, tetapi bukan example.evil.com, di mana * harus menjadi evil.com dan melintasi titik. Ini mencegah wildcard trailing dari mencocokkan domain yang dapat didaftarkan penyerang.

Wildcard dalam aturan WebFetch memerlukan Claude Code v2.1.172 atau lebih baru untuk mencocokkan fetch.

Allow atau deny setiap fetch

Aturan WebFetch telanjang adalah nama alat tanpa bagian domain:, seperti "deny": ["WebFetch"]. Keduanya dan WebFetch(domain:*) mencakup setiap URL, tetapi Claude Code menerapkannya secara berbeda, dan hanya bentuk domain: yang juga menambahkan domainnya ke allowed or denied domain list sandbox. Bagian itu mencantumkan bentuk wildcard yang sandbox hormati dan versi yang menambahkan * telanjang.

Setiap baris menunjukkan apa yang aturan lakukan dalam daftar allow dan dalam daftar deny:

Aturan Dalam allow Dalam deny
WebFetch Claude fetch tanpa meminta Anda. Tidak mengubah host mana yang perintah sandboxed dapat jangkau. Claude Code menghapus alat WebFetch, jadi Claude tidak dapat fetch sama sekali. Tidak mengubah host mana yang perintah sandboxed dapat jangkau.
WebFetch(domain:*) Claude fetch tanpa meminta Anda, dan perintah sandboxed dapat menjangkau host apa pun. Claude Code menyimpan alat dan menolak setiap fetch, dan perintah sandboxed tidak dapat menjangkau host apa pun.

Dua bentuk juga berbeda pada pembacaan artifacts, halaman yang alat Artifact terbitkan di claude.ai. Aturan deny atau ask WebFetch telanjang tidak berlaku untuk pembacaan tersebut. Aturan domain: yang mencakup claude.ai atau host konten *.claudeusercontent.com, seperti WebFetch(domain:claude.ai) atau WebFetch(domain:*), menolak setiap pembacaan atau meminta sebelumnya. Aturan Artifact melakukan hal yang sama.

Ketika aturan memblokir pembacaan, penolakan menamai aturan. Sebelum v2.1.268, aturan deny WebFetch telanjang memblokir setiap pembacaan artifact, dan aturan ask telanjang meminta sebelum setiap pembacaan.

Untuk membiarkan Claude fetch dengan bebas sambil menjaga allowlist sandbox seperti apa adanya, gunakan bentuk telanjang. settings.json ini melakukan itu:

{
  "permissions": {
    "allow": ["WebFetch"]
  }
}

Ketika Anda meminta Claude untuk fetch halaman, itu fetch tanpa prompt. Ketika Anda meminta itu menjalankan curl sandboxed terhadap host di luar allowlist sandbox, Claude Code masih meminta Anda untuk host itu, atau dalam mode auto mengirim permintaan ke classifier, karena aturan telanjang tidak menambahkan host ke allowlist.

MCP

Aturan MCP menggunakan nama server seperti yang dikonfigurasi di Claude Code, secara opsional diikuti oleh nama alat dari server itu.

  • mcp__puppeteer mencocokkan alat apa pun yang disediakan oleh server puppeteer
  • mcp__puppeteer__* menggunakan sintaks wildcard dan juga mencocokkan semua alat dari server puppeteer
  • mcp__puppeteer__puppeteer_navigate mencocokkan alat puppeteer_navigate yang disediakan oleh server puppeteer

Jika organisasi Anda telah menetapkan alat claude.ai connector ke ask dan pengaturan itu mencapai Claude Code dalam sesi Anda, aturan allow untuk alat itu tidak berlaku: Claude Code meminta pada setiap panggilan, bahkan dalam mode auto dan bypassPermissions. Dalam mode dontAsk, yang tidak pernah meminta, Claude Code menolak panggilan sebagai gantinya. Alat dari konektor yang Claude Code ambil sendiri muncul sebagai mcp__claude_ai_<server>__<tool>.

Dalam sesi Cowork di aplikasi Claude Desktop, Claude menjalankan perintah shell melalui alat mcp__workspace__bash Cowork daripada alat Bash bawaan, dan Cowork juga menyediakan mcp__workspace__web_fetch untuk web fetch. Claude Code juga menerapkan aturan deny yang menamai seluruh alat Bash atau WebFetch ke alat Cowork ini, jadi aturan deny Bash yang dikelola menghentikan Claude dari menjalankan perintah shell di Cowork. Ketika Claude Code memblokir panggilan seperti itu, pesan menamai alat Cowork: Permission to use mcp__workspace__bash has been denied. Aturan allow tidak terbawa: Claude Code tidak pernah menerapkan aturan Bash allow ke mcp__workspace__bash.

Agent (subagents)

Gunakan aturan Agent(AgentName) untuk mengontrol subagents mana yang dapat digunakan Claude:

  • Agent(Explore) mencocokkan subagent Explore
  • Agent(Plan) mencocokkan subagent Plan
  • Agent(my-custom-agent) mencocokkan subagent kustom bernama my-custom-agent

Tambahkan aturan ini ke array deny dalam pengaturan Anda atau gunakan flag CLI --disallowedTools untuk menonaktifkan agen tertentu. Untuk menonaktifkan agen Explore:

{
  "permissions": {
    "deny": ["Agent(Explore)"]
  }
}

Cd

Aturan Cd mengontrol direktori mana yang dapat dipindahkan oleh perintah /cd ke sesi. Cd bukan alat yang dapat dipanggil model: Claude tidak dapat memanggilnya, dan aturan hanya berlaku ketika Anda menjalankan /cd sendiri.

Aturan deny Cd telanjang menonaktifkan /cd sepenuhnya. Aturan deny Cd(<path-pattern>) memblokir target yang mencocokkan. Aturan deny memeriksa setiap ejaan target, termasuk setiap lompatan symlink yang diselesaikannya, jadi aturan yang ditulis untuk satu jalur juga memblokir target yang diselesaikan ke itu.

Menambahkan aturan allow Cd apa pun beralih /cd ke mode allowlist: direktori target yang diselesaikan harus mencocokkan salah satu aturan allow Anda, atau /cd menolak. Tanpa aturan Cd yang dikonfigurasi, /cd mempertahankan perilaku defaultnya dan meminta Anda untuk mempercayai direktori yang tidak dikenal.

Pola jalur berbagi jangkar //, ~/, dan / dari aturan Read dan Edit, tetapi pencocokan berlabuh ke seluruh jalur direktori daripada gaya gitignore. * mencocokkan tepat satu segmen jalur dan ** mencocokkan di seluruh segmen. Trailing /** juga mencocokkan akar yang dinamainya.

Aturan Cocok Tidak cocok
Cd(~/code/*) ~/code/app ~/code/app/src, ~/code
Cd(~/code/**) ~/code dan direktori apa pun di bawahnya direktori di luar ~/code
Cd(**/node_modules) direktori node_modules apa pun di kedalaman apa pun di bawah direktori saat ini node_modules/pkg

Perluas izin dengan hook

Hook Claude Code memungkinkan Anda mendaftarkan perintah shell kustom yang mengevaluasi izin saat runtime. Ketika Claude Code membuat panggilan alat, hook PreToolUse berjalan sebelum prompt izin, untuk setiap alat kecuali EndConversation. Output hook dapat menolak panggilan alat, memaksa prompt, atau melewati prompt untuk membiarkan panggilan berlanjut.

Keputusan hook tidak melewati aturan izin. Claude Code mengevaluasi aturan deny dan ask terlepas dari apa yang dikembalikan hook PreToolUse: aturan deny yang cocok memblokir panggilan, dan aturan ask masih meminta bahkan ketika hook mengembalikan "allow" atau "ask". Ini mempertahankan prioritas deny-first yang dijelaskan dalam Kelola izin, termasuk aturan deny yang ditetapkan dalam pengaturan terkelola.

Alat MCP yang ditandai requiresUserInteraction juga masih meminta ketika hook mengembalikan "allow", begitu juga alat connector yang organisasi Anda atur ke ask dalam sesi di mana pengaturan tersebut mencapai Claude Code.

Hook pemblokiran juga memiliki prioritas atas aturan allow. Hook yang keluar dengan kode 2 menghentikan panggilan alat sebelum aturan izin dievaluasi, jadi blokir berlaku bahkan ketika aturan allow akan membiarkan panggilan berlanjut. Untuk menjalankan semua perintah Bash tanpa prompt kecuali untuk beberapa yang ingin Anda blokir, tambahkan "Bash" ke daftar allow Anda dan daftarkan hook PreToolUse yang menolak perintah tertentu itu. Lihat Block edits to protected files untuk skrip hook yang dapat Anda sesuaikan.

Direktori kerja

Secara default, Claude memiliki akses ke file di direktori tempat Anda meluncurkannya. Direktori tersebut adalah direktori kerja utama sesi sampai Anda memindahkan sesi dengan /cd. Anda dapat memperluas akses ini:

  • Saat startup: gunakan argumen CLI --add-dir <path>
  • Selama sesi: gunakan perintah /add-dir
  • Konfigurasi persisten: tambahkan ke additionalDirectories dalam file pengaturan

File di direktori tambahan mengikuti aturan izin yang sama dengan direktori kerja asli: mereka menjadi dapat dibaca tanpa prompt, dan izin edit file mengikuti mode izin saat ini.

Anda tidak dapat menambahkan sebagian besar jalur jaringan, seperti berbagi UNC \\server\share, sebagai direktori kerja, karena pencarian dapat menghubungi host yang dinamainya. Di Windows, petakan berbagi ke huruf drive sebagai gantinya dan teruskan drive dengan --add-dir saat peluncuran.

Atur permissions.blockReadsOutsideWorkingDirectories untuk membuat alat file menolak jalur yang dibatasi dalam setiap mode izin. Dalam mode otomatis, Claude Code menawarkan untuk mengaktifkannya pertama kali Claude membaca di luar direktori kerja.

Dalam sesi latar belakang di macOS, host sesi meminta akses ke folder yang dilindungi seperti ~/Desktop, ~/Documents, dan ~/Downloads secara terpisah dari terminal Anda ketika Claude perlu membaca atau menulis file di sana; jika pembacaan di sana gagal dengan Operation not permitted, lihat cara memberikan akses folder ke sesi latar belakang.

Memindahkan sesi ke direktori lain

Untuk memindahkan sesi ke direktori kerja utama yang berbeda, daripada menambahkan direktori bersama yang saat ini, jalankan /cd <path>. Claude Code menyimpan percakapan, memuat CLAUDE.md direktori baru, dan meminta Anda untuk mempercayai workspace jika Anda belum pernah bekerja di dalamnya sebelumnya. Setelahnya, Claude Code menemukan sesi yang dipindahkan ketika Anda menjalankan --resume dari direktori baru.

Segera setelah Anda memindahkan, Claude Code menerapkan konfigurasi proyek direktori baru:

  • Pengaturan proyeknya, termasuk aturan izin mereka dan hooks
  • Server .mcp.json miliknya, tunduk pada persetujuan server yang sama seperti saat startup, dan server MCP local-scope yang Anda daftarkan di dalamnya
  • plugins yang diaktifkan pengaturannya, skills miliknya, dan subagents miliknya
  • Nilai env miliknya, diterapkan di atas variabel lingkungan dari pengaturan direktori sebelumnya, yang tetap berlaku

Claude Code juga memutuskan sambungan proyek direktori sebelumnya dan server MCP local-scope, dan server dari plugins yang tidak lagi diaktifkan setelah perpindahan. Ini mengambil direktori tambahan dari pengaturan direktori baru alih-alih yang sebelumnya, dan menyimpan direktori yang Anda tambahkan dengan --add-dir atau /add-dir. Hooks yang diaktifkan perpindahan masih menerima ${CLAUDE_PROJECT_DIR} diatur ke akar proyek tempat sesi dimulai.

Ketika direktori baru belum dipercaya, Claude Code mencantumkan dalam prompt kepercayaan aturan izin, direktori tambahan, hooks, dan perintah pembantu yang akan diaktifkan pengaturan direktori, sehingga Anda dapat meninjau sebelum menerima. Jika Anda menolak, sesi tetap berada di tempat asalnya. Sebelum v2.1.246, /cd tidak menerapkan pengaturan direktori baru, hooks, server MCP, atau skills sampai Anda melanjutkan sesi, dan prompt kepercayaannya tidak mencantumkan apa yang akan diaktifkan pengaturan direktori.

Batasi atau nonaktifkan target /cd dengan aturan izin Cd.

Direktori tambahan memberikan akses file, bukan konfigurasi

Menambahkan direktori memperluas tempat Claude dapat membaca dan mengedit file. Ini tidak membuat direktori itu akar konfigurasi penuh: sebagian besar konfigurasi .claude/ tidak ditemukan dari direktori tambahan, meskipun beberapa jenis dimuat sebagai pengecualian.

Pengecualian ini hanya berlaku untuk direktori yang ditambahkan dengan flag --add-dir atau perintah /add-dir, termasuk direktori yang ditambahkan Agent SDK melalui flag. Direktori yang tercantum dalam permissions.additionalDirectories dalam file pengaturan memberikan akses file saja dan tidak memuat konfigurasi apa pun di bawah ini.

additionalDirectories opsi Agent SDK dalam TypeScript dan add_dirs opsi dalam Python menerima pengecualian juga, meskipun opsi TypeScript berbagi namanya dengan kunci pengaturan. SDK melewatkan setiap entri ke Claude Code sebagai --add-dir, sehingga direktori tersebut berperilaku seperti direktori yang ditambahkan flag. Skills, perintah, dan subagents dari direktori yang ditambahkan flag apa pun dimuat melalui sumber pengaturan project, sehingga mereka tidak dimuat ketika Anda mengecualikan sumber itu dengan --setting-sources pada CLI atau settingSources dalam SDK, dan bare mode melewati perintah dan subagents di antara mereka.

Jenis konfigurasi berikut dimuat dari direktori --add-dir:

Konfigurasi Dimuat dari --add-dir
Skills di .claude/skills/ Ya, dengan live reload
File perintah di .claude/commands/ Ya, tanpa live reload. Ketika direktori yang ditambahkan dan proyek Anda keduanya mendefinisikan perintah dengan nama yang sama, Claude Code menjalankan perintah proyek Anda
Subagents di .claude/agents/ Ya, tanpa live reload
Settings di .claude/settings.json dan .claude/settings.local.json Kunci enabledPlugins dan extraKnownMarketplaces saja
File CLAUDE.md, .claude/rules/, dan CLAUDE.local.md Hanya ketika CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 diatur. CLAUDE.local.md juga memerlukan sumber pengaturan local, yang diaktifkan secara default

Untuk memuat skills, perintah, dan subagents dari subdirektori direktori kerja utama Anda di tengah sesi, jalankan /add-dir dengan jalur subdirektori tersebut. Claude Code memuat mereka untuk sisa sesi tanpa meminta Anda atau menambahkan direktori kerja, karena subdirektori sudah dapat dibaca. Ini memerlukan Claude Code v2.1.257 atau lebih baru.

Claude Code menemukan gaya output dari direktori kerja saat ini dan induknya, direktori pengguna Anda di ~/.claude/, dan pengaturan terkelola. Hooks dan kunci .claude/settings.json lainnya dimuat dari folder .claude/ direktori kerja saat ini tanpa fallback direktori induk, bersama dengan ~/.claude/settings.json pengguna Anda dan pengaturan terkelola. .claude/settings.local.json dimuat dari akar repositori git sebagai gantinya, bahkan ketika Anda memulai Claude Code dalam subdirektori, kecuali dalam kasus di mana Claude Code tidak menggunakan akar repositori, seperti di Windows; sebelum v2.1.211, itu juga dimuat hanya dari direktori kerja saat ini. Sesi Agent SDK memuat dari direktori kerja di semua versi.

Untuk berbagi konfigurasi itu di seluruh proyek, gunakan salah satu pendekatan ini:

  • Konfigurasi tingkat pengguna: tempatkan file di ~/.claude/agents/, ~/.claude/output-styles/, atau ~/.claude/settings.json untuk membuatnya tersedia di setiap proyek
  • Plugins: paket dan distribusikan konfigurasi sebagai plugin yang dapat diinstal tim
  • Luncurkan dari direktori konfigurasi: jalankan Claude Code dari direktori yang berisi konfigurasi .claude/ yang ingin Anda gunakan

Bagaimana izin berinteraksi dengan sandboxing

Izin dan sandboxing adalah lapisan keamanan pelengkap:

  • Izin mengontrol alat mana yang dapat digunakan Claude Code dan file atau domain mana yang dapat diaksesnya. Mereka berlaku untuk Bash, Read, Edit, WebFetch, MCP, dan setiap alat lainnya, kecuali bahwa aturan deny atau ask tidak dapat memblokir EndConversation sementara alat lain tetap ada.
  • Sandboxing menyediakan penegakan tingkat OS yang membatasi akses sistem file dan jaringan alat Bash. Ini hanya berlaku untuk perintah Bash dan proses anak mereka.

Gunakan keduanya untuk pertahanan berlapis, karena pembatasan sandbox masih berlaku bahkan jika injeksi prompt melewati pengambilan keputusan Claude. Jalur dan domain dari pengaturan sandbox dan aturan izin digabungkan ke dalam konfigurasi sandbox akhir.

Ketika Anda mengaktifkan sandboxing dan membiarkan autoAllowBashIfSandboxed pada default true, perintah Bash yang di-sandbox berjalan tanpa meminta bahkan jika izin Anda mencakup aturan ask Bash biasa, atau bentuk setara Bash(*): batas sandbox menggantikan prompt seluruh alat tersebut.

Dalam plan mode, Claude Code melewati substitusi ini. Tanpa aturan ask, perintah baca-saja bawaan masih berjalan tanpa meminta, dan perintah shell lainnya melalui alur izin reguler sementara Anda masih merencanakan; lihat plan mode untuk bagaimana Claude Code membatasi perintah di sana. Dengan aturan ask Bash biasa, setiap perintah Bash meminta, termasuk perintah baca-saja yang di-sandbox, sama seperti di luar sandboxing. Sebelum v2.1.212, substitusi diterapkan dalam plan mode juga.

Pemeriksaan ini masih berlaku:

  • Aturan ask yang dibatasi konten seperti Bash(git push *) masih memaksa prompt
  • Aturan deny eksplisit masih berlaku
  • Perintah rm atau rmdir yang menargetkan jalur kritis masih melalui alur izin reguler

Perintah yang tidak akan berjalan di-sandbox, seperti perintah yang dikecualikan, menghormati aturan ask Bash biasa seperti biasanya. Lihat sandbox modes untuk mengubah perilaku ini.

Pengaturan terkelola

Untuk organisasi yang memerlukan kontrol terpusat, administrator menerapkan pengaturan terkelola yang tidak dapat ditimpa oleh pengaturan pengguna dan proyek, kecuali untuk beberapa kunci yang sensitif terhadap keamanan. Menerapkan pengaturan terkelola mencakup mekanisme pengiriman, prioritas dalam tingkat terkelola, dan kunci yang hanya dapat diatur oleh pengaturan terkelola.

Salah satu kunci tersebut, allowManagedPermissionRulesOnly, membuat pengaturan terkelola menjadi satu-satunya sumber pengaturan untuk aturan izin. Entrinya mencantumkan setiap sumber yang kemudian diabaikan oleh Claude Code.

disableBypassPermissionsMode biasanya ditempatkan dalam pengaturan terkelola untuk memberlakukan kebijakan organisasi, tetapi berfungsi dari cakupan apa pun. Pengguna dapat mengaturnya dalam pengaturan mereka sendiri untuk mengunci diri mereka sendiri dari mode bypass.

Prioritas pengaturan

Aturan izin mengikuti prioritas pengaturan yang sama dengan semua pengaturan Claude Code lainnya, dengan pengaturan terkelola tertinggi: tidak ada tingkat lain, termasuk argumen baris perintah, yang dapat menimpa aturan izin terkelola.

Jika alat ditolak di tingkat mana pun, tidak ada tingkat lain yang dapat mengizinkannya. Misalnya, penolakan pengaturan terkelola tidak dapat ditimpa oleh --allowedTools, dan --disallowedTools dapat menambahkan pembatasan di luar apa yang ditentukan pengaturan terkelola.

Hal yang sama berlaku di seluruh cakupan pengaturan: jika pengaturan pengguna mengizinkan izin dan pengaturan proyek menolaknya, aturan penolakan memblokir izin tersebut. Kebalikannya juga benar: penolakan tingkat pengguna memblokir izin tingkat proyek, karena aturan penolakan dari cakupan apa pun dievaluasi sebelum aturan izin.

Host penyematan dapat menyediakan kebijakan terkelola tambahan melalui opsi SDK managedSettings, termasuk aturan izin allow kecuali admin menetapkan kunci allowManaged*Only; Deliver policy to Claude Desktop sessions mencakup kapan kebijakan embedder berlaku sepenuhnya.

Aturan izin proyek dan kepercayaan ruang kerja

Aturan permissions.allow dan entri permissions.additionalDirectories dalam .claude/settings.json proyek memberikan kemampuan, jadi Claude Code menerapkannya hanya setelah Anda menerima dialog kepercayaan ruang kerja untuk folder tersebut. Dialog mencantumkan aturan dan direktori yang akan diberikan folder sehingga Anda dapat meninjau terlebih dahulu. Aturan deny dan ask tidak terpengaruh, karena hanya membatasi.

Claude Code menyimpan kepercayaan yang Anda terima sesuai dengan tempat Anda memulainya:

  • Dalam repositori, Claude Code mengunci kepercayaan pada akar repositori git, jadi kepercayaan mencakup seluruh repositori kecuali repositori git apa pun yang bersarang di dalamnya, seperti submodul. Dalam worktree, ia menggunakan akar checkout utama, seperti yang dilakukannya untuk aturan yang disimpan.
  • Di luar repositori, Claude Code mengunci kepercayaan pada direktori tempat Anda memulainya, dan kepercayaan mencakup subdirektori apa pun dari direktori tersebut kecuali repositori git yang bersarang di dalamnya, seperti klon. Setiap subdirektori yang tercakup kemudian dihitung sebagai folder yang induknya Anda percayai.
  • Ketika Anda memulai di direktori home Anda, Claude Code menyimpan kepercayaan hanya untuk sesi saat ini dan tidak menulisnya ke disk; lihat catatan safeguard tambahan.

Claude Code menampilkan dialog kepercayaan hanya dalam sesi interaktif. Jalankan claude -p atau sesi SDK tidak pernah menampilkannya, dan mempercayai folder induk tidak dihitung untuk aturan ini, jadi Apa yang berjalan sebelum Anda mempercayai folder mengatakan konten repositori mana yang masih digunakan Claude Code dalam masing-masing dari dua situasi tersebut.

Ketika file pengaturan lokal Anda memerlukan kepercayaan

.claude/settings.local.json biasanya adalah file Anda sendiri, jadi Claude Code menerapkan aturan izin dan direktori tambahannya tanpa langkah kepercayaan. Ketika file dilacak dalam git, atau .claude adalah symlink, Claude Code memperlakukannya sebagai disediakan repositori sebagai gantinya dan menahan aturannya sampai Anda mempercayai folder.

Claude Code menjalankan git untuk membedakan keduanya, dan hanya menjalankan git setelah Anda telah mempercayai folder: Anda menerima dialog kepercayaan untuk itu atau untuk direktori induk yang kepercayaannya meluas ke itu, atau Anda berada dalam sesi -p atau SDK, yang dihitung sebagai diterima. Sampai saat itu, tempat Anda memulai Claude Code menentukan apa yang terjadi pada aturan file:

  • Di home konfigurasi Anda: Claude Code menerapkan .claude/settings.local.json folder tersebut segera tanpa menjalankan git. Home konfigurasi Anda adalah direktori home Anda, atau direktori yang subdirektori .claude Anda telah atur sebagai CLAUDE_CONFIG_DIR. Jika direktori CLAUDE_CONFIG_DIR tersebut berada di dalam repositori git dan Claude Code menyimpan pengaturan lokal Anda di akar repositori sebagai gantinya, ia menahan aturannya seperti di tempat lain.
  • Di tempat lain: Claude Code menahan aturan file seperti pengaturan proyek. Setelah pemeriksaan telah berjalan, Claude Code menerapkan aturan file yang tidak dilacak, atau file dalam direktori di luar repositori git apa pun, meskipun Anda belum mempercayai folder yang tepat itu.

Pada versi 2.1.196 hingga 2.1.199, Claude Code menahan aturan file di home konfigurasi Anda dan di luar repositori git juga, dan mencetak peringatan this workspace has not been trusted di sana. Sebelum v2.1.207, Claude Code menerapkan aturan file yang tidak dilacak sebelum Anda menerima dialog.

Apa yang berjalan sebelum Anda mempercayai folder

Setiap baris adalah satu jenis konten yang dapat disediakan repositori. Kolom adalah dua situasi di mana Anda belum mempercayai folder itu sendiri: Anda hanya mempercayai folder induk, atau Anda menjalankan claude -p atau SDK di sana, yang tidak pernah menampilkan dialog kepercayaan. Kolom folder induk tidak berlaku di dalam repositori bersarang: dalam sesi interaktif Claude Code menampilkan dialog kepercayaan untuk itu, dan jalankan claude -p atau SDK di sana mengikuti kolom claude -p.

Apa yang disediakan repositori Anda hanya mempercayai folder induk claude -p atau SDK, folder tidak pernah dipercaya
Hooks dalam file pengaturan, blok env dan perintah pembantu seperti apiKeyHelper, dan hooks skill proyek dan allowed-tools Digunakan Digunakan. Kepercayaan ruang kerja tidak pernah membatasi allowed-tools skill dalam sesi apa pun
Aturan permissions.allow dan additionalDirectories dalam .claude/settings.json Tidak digunakan sampai Anda menerima dialog kepercayaan, yang muncul lagi mencantumkannya Tidak digunakan. Claude Code mencetak peringatan this workspace has not been trusted ke stderr
Hooks frontmatter dalam subagent proyek, plugin @skills-dir proyek, dan entri extraKnownMarketplaces dari repositori atau direktori --add-dir Tidak digunakan, dan tidak ada dialog yang ditawarkan Tidak digunakan
mcpServers inline dalam frontmatter subagent dari repositori atau direktori --add-dir. Sebelum v2.1.238, Claude Code memuat server ini dalam kedua situasi Tidak digunakan, dan tidak ada dialog yang ditawarkan Tidak digunakan
Server dalam .mcp.json, termasuk yang disetujui repositori dalam pengaturannya sendiri Claude Code menanyakan Anda sebelum menghubungkannya. Persetujuan repositori itu sendiri tidak dihitung Terhubung tanpa bertanya, disetujui atau tidak. SDK memuat mereka hanya ketika settingSources mencakup pengaturan proyek. claude mcp list di folder yang sama masih melaporkan server seperti itu sebagai tertunda
headersHelper pada server dalam .mcp.json. Sebelum v2.1.238, Claude Code menjalankan pembantu dalam kedua situasi Tidak dijalankan sampai Anda menerima dialog kepercayaan, yang muncul lagi menamai tempat pembantu dideklarasikan. Claude Code menghubungkan server dengan headers statis saja sampai saat itu Tidak dijalankan. Claude Code menghubungkan server dengan headers statis saja dan mencetak baris headersHelper not run per server ke stderr

Untuk baris yang memerlukan folder yang tepat ini dipercaya, percayai dengan tangan: atur projects["<path>"].hasTrustDialogAccepted ke true dalam ~/.claude.json, di mana <path> adalah akar repositori, atau folder itu sendiri di luar repositori. Claude Code mencetak kunci yang tepat dalam baris log debug untuk hook subagent yang dilewati atau server MCP inline, dalam peringatan stderr untuk aturan izin yang dilewati, dan dalam baris headersHelper not run untuk pembantu yang dilewati.

Sebelum Anda menjalankan claude -p dalam repositori yang tidak Anda tulis, putuskan apa yang mungkin dijalankannya di mesin Anda:

  • Berikan --setting-sources user, atau atur settingSources SDK tanpa pengaturan proyek, jadi Claude Code tidak membaca file pengaturan proyek atau .mcp.json nya
  • Mulai dengan --bare jadi Claude Code tidak membaca hooks, skills, perintah khusus, subagents, plugins, atau server .mcp.json dari proyek. Blok env proyek dan pembantu seperti awsAuthRefresh dalam file pengaturannya masih berlaku, dan Claude Code membaca apiKeyHelper hanya dari --settings
  • Berikan --settings '{"disableAllHooks": true}' untuk mematikan hooks untuk jalankan itu. Menetapkannya dalam pengaturan pengguna Anda saja tidak cukup, karena pengaturan proyek repositori mengambil alih milik Anda dan dapat menetapkannya kembali ke false
  • Tambahkan entri disabledMcpjsonServers untuk menolak server .mcp.json berdasarkan nama dalam setiap jenis sesi

Contoh konfigurasi

Repositori ini mencakup konfigurasi pengaturan pemula untuk skenario penerapan umum. Gunakan ini sebagai titik awal dan sesuaikan dengan kebutuhan Anda.

Lihat juga

  • Semua pengaturan: setiap kunci pengaturan, termasuk kunci izin
  • Konfigurasi mode auto: beri tahu pengklasifikasi mode auto infrastruktur mana yang dipercaya organisasi Anda
  • Sandboxing: isolasi sistem file dan jaringan tingkat OS untuk perintah Bash
  • Authentication: atur akses pengguna ke Claude Code
  • Security: perlindungan keamanan dan praktik terbaik
  • Hooks: otomatisasi alur kerja dan perluas evaluasi izin