SpyBara
Go Premium

Documentation 2026-05-08 22:00 UTC to 2026-05-09 04:57 UTC

20 files changed +1,303 −148. View all changes and history on the product overview
2026
Sun 31 06:39 Sat 30 06:23 Fri 29 06:38 Thu 28 06:37 Wed 27 06:42 Tue 26 06:33 Sun 24 06:25 Sat 23 06:18 Fri 22 06:33 Thu 21 06:36 Wed 20 06:35 Tue 19 06:34 Mon 18 23:59 Sun 17 01:01 Fri 15 22:58 Thu 14 17:02 Wed 13 23:01 Tue 12 22:57 Mon 11 23:00 Sun 10 23:03 Sat 9 04:57 Fri 8 22:00 Thu 7 22:59 Tue 5 23:00 Mon 4 22:58 Sat 2 18:14 Fri 1 18:19
Details

309 </Tab>309 </Tab>

310</Tabs>310</Tabs>

311 311 

312Untuk HTTP (non-streaming), gunakan `"type": "http"` sebagai gantinya.312Untuk transport HTTP yang dapat dialirkan, gunakan `"type": "http"` sebagai gantinya. Dalam file konfigurasi `.mcp.json` dan JSON lainnya, `"streamable-http"` diterima sebagai alias untuk `"http"`. Opsi `mcpServers` pemrograman hanya menerima `"http"`.

313 313 

314### Server MCP SDK314### Server MCP SDK

315 315 

agent-sdk/python.md +111 −109

Details

2294 2294 

2295```python theme={null}2295```python theme={null}

2296{2296{

2297 "description": str, # A short (3-5 word) description of the task2297 "description": str, # Deskripsi singkat tugas (3-5 kata)

2298 "prompt": str, # The task for the agent to perform2298 "prompt": str, # Tugas untuk dijalankan oleh agen

2299 "subagent_type": str, # The type of specialized agent to use2299 "subagent_type": str, # Jenis agen khusus yang digunakan

2300}2300}

2301```2301```

2302 2302 


2304 2304 

2305```python theme={null}2305```python theme={null}

2306{2306{

2307 "result": str, # Final result from the subagent2307 "result": str, # Hasil akhir dari subagen

2308 "usage": dict | None, # Token usage statistics2308 "usage": dict | None, # Statistik penggunaan token

2309 "total_cost_usd": float | None, # Estimated total cost in USD2309 "total_cost_usd": float | None, # Perkiraan biaya total dalam USD

2310 "duration_ms": int | None, # Execution duration in milliseconds2310 "duration_ms": int | None, # Durasi eksekusi dalam milidetik

2311}2311}

2312```2312```

2313 2313 


2321 2321 

2322```python theme={null}2322```python theme={null}

2323{2323{

2324 "questions": [ # Questions to ask the user (1-4 questions)2324 "questions": [ # Pertanyaan untuk ditanyakan kepada pengguna (1-4 pertanyaan)

2325 {2325 {

2326 "question": str, # The complete question to ask the user2326 "question": str, # Pertanyaan lengkap untuk ditanyakan kepada pengguna

2327 "header": str, # Very short label displayed as a chip/tag (max 12 chars)2327 "header": str, # Label sangat singkat ditampilkan sebagai chip/tag (maks 12 karakter)

2328 "options": [ # The available choices (2-4 options)2328 "options": [ # Pilihan yang tersedia (2-4 opsi)

2329 {2329 {

2330 "label": str, # Display text for this option (1-5 words)2330 "label": str, # Teks tampilan untuk opsi ini (1-5 kata)

2331 "description": str, # Explanation of what this option means2331 "description": str, # Penjelasan tentang arti opsi ini

2332 }2332 }

2333 ],2333 ],

2334 "multiSelect": bool, # Set to true to allow multiple selections2334 "multiSelect": bool, # Atur ke true untuk memungkinkan beberapa pilihan

2335 }2335 }

2336 ],2336 ],

2337 "answers": dict | None, # User answers populated by the permission system2337 "answers": dict[str, str | list[str]] | None,

2338 # Jawaban pengguna diisi oleh sistem izin. Jawaban multi-pilih

2339 # mungkin berupa daftar label atau string yang digabungkan dengan koma

2338}2340}

2339```2341```

2340 2342 


2342 2344 

2343```python theme={null}2345```python theme={null}

2344{2346{

2345 "questions": [ # The questions that were asked2347 "questions": [ # Pertanyaan yang diajukan

2346 {2348 {

2347 "question": str,2349 "question": str,

2348 "header": str,2350 "header": str,


2350 "multiSelect": bool,2352 "multiSelect": bool,

2351 }2353 }

2352 ],2354 ],

2353 "answers": dict[str, str], # Maps question text to answer string2355 "answers": dict[str, str], # Memetakan teks pertanyaan ke string jawaban

2354 # Multi-select answers are comma-separated2356 # Jawaban multi-pilih dipisahkan dengan koma

2355}2357}

2356```2358```

2357 2359 


2363 2365 

2364```python theme={null}2366```python theme={null}

2365{2367{

2366 "command": str, # The command to execute2368 "command": str, # Perintah yang akan dijalankan

2367 "timeout": int | None, # Optional timeout in milliseconds (max 600000)2369 "timeout": int | None, # Waktu tunggu opsional dalam milidetik (maks 600000)

2368 "description": str | None, # Clear, concise description (5-10 words)2370 "description": str | None, # Deskripsi jelas dan ringkas (5-10 kata)

2369 "run_in_background": bool | None, # Set to true to run in background2371 "run_in_background": bool | None, # Atur ke true untuk menjalankan di latar belakang

2370}2372}

2371```2373```

2372 2374 


2374 2376 

2375```python theme={null}2377```python theme={null}

2376{2378{

2377 "output": str, # Combined stdout and stderr output2379 "output": str, # Output stdout dan stderr gabungan

2378 "exitCode": int, # Exit code of the command2380 "exitCode": int, # Kode keluar perintah

2379 "killed": bool | None, # Whether command was killed due to timeout2381 "killed": bool | None, # Apakah perintah dibunuh karena waktu tunggu

2380 "shellId": str | None, # Shell ID for background processes2382 "shellId": str | None, # ID Shell untuk proses latar belakang

2381}2383}

2382```2384```

2383 2385 


2391 2393 

2392```python theme={null}2394```python theme={null}

2393{2395{

2394 "command": str, # Shell script; each stdout line is an event, exit ends the watch2396 "command": str, # Skrip shell; setiap baris stdout adalah event, keluar mengakhiri pengawasan

2395 "description": str, # Short description shown in notifications2397 "description": str, # Deskripsi singkat ditampilkan dalam notifikasi

2396 "timeout_ms": int | None, # Kill after this deadline (default 300000, max 3600000)2398 "timeout_ms": int | None, # Bunuh setelah batas waktu ini (default 300000, maks 3600000)

2397 "persistent": bool | None, # Run for the lifetime of the session; stop with TaskStop2399 "persistent": bool | None, # Jalankan untuk seumur hidup sesi; hentikan dengan TaskStop

2398}2400}

2399```2401```

2400 2402 


2402 2404 

2403```python theme={null}2405```python theme={null}

2404{2406{

2405 "taskId": str, # ID of the background monitor task2407 "taskId": str, # ID tugas monitor latar belakang

2406 "timeoutMs": int, # Timeout deadline in milliseconds2408 "timeoutMs": int, # Batas waktu dalam milidetik (0 saat persistent)

2407 "persistent": bool | None, # True when running until TaskStop or session end2409 "persistent": bool | None, # True saat berjalan hingga TaskStop atau akhir sesi

2408}2410}

2409```2411```

2410 2412 


2416 2418 

2417```python theme={null}2419```python theme={null}

2418{2420{

2419 "file_path": str, # The absolute path to the file to modify2421 "file_path": str, # Jalur absolut ke file yang akan dimodifikasi

2420 "old_string": str, # The text to replace2422 "old_string": str, # Teks yang akan diganti

2421 "new_string": str, # The text to replace it with2423 "new_string": str, # Teks untuk menggantinya

2422 "replace_all": bool | None, # Replace all occurrences (default False)2424 "replace_all": bool | None, # Ganti semua kemunculan (default False)

2423}2425}

2424```2426```

2425 2427 


2427 2429 

2428```python theme={null}2430```python theme={null}

2429{2431{

2430 "message": str, # Confirmation message2432 "message": str, # Pesan konfirmasi

2431 "replacements": int, # Number of replacements made2433 "replacements": int, # Jumlah penggantian yang dilakukan

2432 "file_path": str, # File path that was edited2434 "file_path": str, # Jalur file yang diedit

2433}2435}

2434```2436```

2435 2437 


2441 2443 

2442```python theme={null}2444```python theme={null}

2443{2445{

2444 "file_path": str, # The absolute path to the file to read2446 "file_path": str, # Jalur absolut ke file yang akan dibaca

2445 "offset": int | None, # The line number to start reading from2447 "offset": int | None, # Nomor baris untuk mulai membaca dari

2446 "limit": int | None, # The number of lines to read2448 "limit": int | None, # Jumlah baris yang akan dibaca

2447}2449}

2448```2450```

2449 2451 


2451 2453 

2452```python theme={null}2454```python theme={null}

2453{2455{

2454 "content": str, # File contents with line numbers2456 "content": str, # Isi file dengan nomor baris

2455 "total_lines": int, # Total number of lines in file2457 "total_lines": int, # Total jumlah baris dalam file

2456 "lines_returned": int, # Lines actually returned2458 "lines_returned": int, # Baris yang benar-benar dikembalikan

2457}2459}

2458```2460```

2459 2461 


2461 2463 

2462```python theme={null}2464```python theme={null}

2463{2465{

2464 "image": str, # Base64 encoded image data2466 "image": str, # Data gambar yang dikodekan Base64

2465 "mime_type": str, # Image MIME type2467 "mime_type": str, # Tipe MIME gambar

2466 "file_size": int, # File size in bytes2468 "file_size": int, # Ukuran file dalam byte

2467}2469}

2468```2470```

2469 2471 


2475 2477 

2476```python theme={null}2478```python theme={null}

2477{2479{

2478 "file_path": str, # The absolute path to the file to write2480 "file_path": str, # Jalur absolut ke file yang akan ditulis

2479 "content": str, # The content to write to the file2481 "content": str, # Konten yang akan ditulis ke file

2480}2482}

2481```2483```

2482 2484 


2484 2486 

2485```python theme={null}2487```python theme={null}

2486{2488{

2487 "message": str, # Success message2489 "message": str, # Pesan sukses

2488 "bytes_written": int, # Number of bytes written2490 "bytes_written": int, # Jumlah byte yang ditulis

2489 "file_path": str, # File path that was written2491 "file_path": str, # Jalur file yang ditulis

2490}2492}

2491```2493```

2492 2494 


2498 2500 

2499```python theme={null}2501```python theme={null}

2500{2502{

2501 "pattern": str, # The glob pattern to match files against2503 "pattern": str, # Pola glob untuk mencocokkan file

2502 "path": str | None, # The directory to search in (defaults to cwd)2504 "path": str | None, # Direktori untuk dicari (default ke cwd)

2503}2505}

2504```2506```

2505 2507 


2507 2509 

2508```python theme={null}2510```python theme={null}

2509{2511{

2510 "matches": list[str], # Array of matching file paths2512 "matches": list[str], # Array jalur file yang cocok

2511 "count": int, # Number of matches found2513 "count": int, # Jumlah kecocokan yang ditemukan

2512 "search_path": str, # Search directory used2514 "search_path": str, # Direktori pencarian yang digunakan

2513}2515}

2514```2516```

2515 2517 


2521 2523 

2522```python theme={null}2524```python theme={null}

2523{2525{

2524 "pattern": str, # The regular expression pattern2526 "pattern": str, # Pola ekspresi reguler

2525 "path": str | None, # File or directory to search in2527 "path": str | None, # File atau direktori untuk dicari

2526 "glob": str | None, # Glob pattern to filter files2528 "glob": str | None, # Pola glob untuk menyaring file

2527 "type": str | None, # File type to search2529 "type": str | None, # Jenis file untuk dicari

2528 "output_mode": str | None, # "content", "files_with_matches", or "count"2530 "output_mode": str | None, # "content", "files_with_matches", atau "count"

2529 "-i": bool | None, # Case insensitive search2531 "-i": bool | None, # Pencarian tidak peka huruf besar-kecil

2530 "-n": bool | None, # Show line numbers2532 "-n": bool | None, # Tampilkan nomor baris

2531 "-B": int | None, # Lines to show before each match2533 "-B": int | None, # Baris untuk ditampilkan sebelum setiap kecocokan

2532 "-A": int | None, # Lines to show after each match2534 "-A": int | None, # Baris untuk ditampilkan setelah setiap kecocokan

2533 "-C": int | None, # Lines to show before and after2535 "-C": int | None, # Baris untuk ditampilkan sebelum dan sesudah

2534 "head_limit": int | None, # Limit output to first N lines/entries2536 "head_limit": int | None, # Batasi output ke N baris/entri pertama

2535 "multiline": bool | None, # Enable multiline mode2537 "multiline": bool | None, # Aktifkan mode multiline

2536}2538}

2537```2539```

2538 2540 


2557 2559 

2558```python theme={null}2560```python theme={null}

2559{2561{

2560 "files": list[str], # Files containing matches2562 "files": list[str], # File yang berisi kecocokan

2561 "count": int, # Number of files with matches2563 "count": int, # Jumlah file dengan kecocokan

2562}2564}

2563```2565```

2564 2566 


2570 2572 

2571```python theme={null}2573```python theme={null}

2572{2574{

2573 "notebook_path": str, # Absolute path to the Jupyter notebook2575 "notebook_path": str, # Jalur absolut ke notebook Jupyter

2574 "cell_id": str | None, # The ID of the cell to edit2576 "cell_id": str | None, # ID sel yang akan diedit

2575 "new_source": str, # The new source for the cell2577 "new_source": str, # Sumber baru untuk sel

2576 "cell_type": "code" | "markdown" | None, # The type of the cell2578 "cell_type": "code" | "markdown" | None, # Jenis sel

2577 "edit_mode": "replace" | "insert" | "delete" | None, # Edit operation type2579 "edit_mode": "replace" | "insert" | "delete" | None, # Jenis operasi edit

2578}2580}

2579```2581```

2580 2582 


2582 2584 

2583```python theme={null}2585```python theme={null}

2584{2586{

2585 "message": str, # Success message2587 "message": str, # Pesan sukses

2586 "edit_type": "replaced" | "inserted" | "deleted", # Type of edit performed2588 "edit_type": "replaced" | "inserted" | "deleted", # Jenis edit yang dilakukan

2587 "cell_id": str | None, # Cell ID that was affected2589 "cell_id": str | None, # ID sel yang terpengaruh

2588 "total_cells": int, # Total cells in notebook after edit2590 "total_cells": int, # Total sel dalam notebook setelah edit

2589}2591}

2590```2592```

2591 2593 


2597 2599 

2598```python theme={null}2600```python theme={null}

2599{2601{

2600 "url": str, # The URL to fetch content from2602 "url": str, # URL untuk mengambil konten dari

2601 "prompt": str, # The prompt to run on the fetched content2603 "prompt": str, # Prompt untuk dijalankan pada konten yang diambil

2602}2604}

2603```2605```

2604 2606 


2606 2608 

2607```python theme={null}2609```python theme={null}

2608{2610{

2609 "response": str, # AI model's response to the prompt2611 "response": str, # Respons model AI terhadap prompt

2610 "url": str, # URL that was fetched2612 "url": str, # URL yang diambil

2611 "final_url": str | None, # Final URL after redirects2613 "final_url": str | None, # URL akhir setelah pengalihan

2612 "status_code": int | None, # HTTP status code2614 "status_code": int | None, # Kode status HTTP

2613}2615}

2614```2616```

2615 2617 


2621 2623 

2622```python theme={null}2624```python theme={null}

2623{2625{

2624 "query": str, # The search query to use2626 "query": str, # Kueri pencarian yang digunakan

2625 "allowed_domains": list[str] | None, # Only include results from these domains2627 "allowed_domains": list[str] | None, # Hanya sertakan hasil dari domain ini

2626 "blocked_domains": list[str] | None, # Never include results from these domains2628 "blocked_domains": list[str] | None, # Jangan pernah sertakan hasil dari domain ini

2627}2629}

2628```2630```

2629 2631 


2647{2649{

2648 "todos": [2650 "todos": [

2649 {2651 {

2650 "content": str, # The task description2652 "content": str, # Deskripsi tugas

2651 "status": "pending" | "in_progress" | "completed", # Task status2653 "status": "pending" | "in_progress" | "completed", # Status tugas

2652 "activeForm": str, # Active form of the description2654 "activeForm": str, # Bentuk aktif deskripsi

2653 }2655 }

2654 ]2656 ]

2655}2657}


2659 2661 

2660```python theme={null}2662```python theme={null}

2661{2663{

2662 "message": str, # Success message2664 "message": str, # Pesan sukses

2663 "stats": {"total": int, "pending": int, "in_progress": int, "completed": int},2665 "stats": {"total": int, "pending": int, "in_progress": int, "completed": int},

2664}2666}

2665```2667```


2672 2674 

2673```python theme={null}2675```python theme={null}

2674{2676{

2675 "bash_id": str, # The ID of the background shell2677 "bash_id": str, # ID shell latar belakang

2676 "filter": str | None, # Optional regex to filter output lines2678 "filter": str | None, # Regex opsional untuk menyaring baris output

2677}2679}

2678```2680```

2679 2681 


2681 2683 

2682```python theme={null}2684```python theme={null}

2683{2685{

2684 "output": str, # New output since last check2686 "output": str, # Output baru sejak pemeriksaan terakhir

2685 "status": "running" | "completed" | "failed", # Current shell status2687 "status": "running" | "completed" | "failed", # Status shell saat ini

2686 "exitCode": int | None, # Exit code when completed2688 "exitCode": int | None, # Kode keluar saat selesai

2687}2689}

2688```2690```

2689 2691 


2695 2697 

2696```python theme={null}2698```python theme={null}

2697{2699{

2698 "shell_id": str # The ID of the background shell to kill2700 "shell_id": str # ID shell latar belakang yang akan dibunuh

2699}2701}

2700```2702```

2701 2703 


2703 2705 

2704```python theme={null}2706```python theme={null}

2705{2707{

2706 "message": str, # Success message2708 "message": str, # Pesan sukses

2707 "shell_id": str, # ID of the killed shell2709 "shell_id": str, # ID shell yang dibunuh

2708}2710}

2709```2711```

2710 2712 


2716 2718 

2717```python theme={null}2719```python theme={null}

2718{2720{

2719 "plan": str # The plan to run by the user for approval2721 "plan": str # Rencana yang akan dijalankan oleh pengguna untuk persetujuan

2720}2722}

2721```2723```

2722 2724 


2724 2726 

2725```python theme={null}2727```python theme={null}

2726{2728{

2727 "message": str, # Confirmation message2729 "message": str, # Pesan konfirmasi

2728 "approved": bool | None, # Whether user approved the plan2730 "approved": bool | None, # Apakah pengguna menyetujui rencana

2729}2731}

2730```2732```

2731 2733 


2737 2739 

2738```python theme={null}2740```python theme={null}

2739{2741{

2740 "server": str | None # Optional server name to filter resources by2742 "server": str | None # Nama server opsional untuk menyaring sumber daya

2741}2743}

2742```2744```

2743 2745 


2766 2768 

2767```python theme={null}2769```python theme={null}

2768{2770{

2769 "server": str, # The MCP server name2771 "server": str, # Nama server MCP

2770 "uri": str, # The resource URI to read2772 "uri": str, # URI sumber daya yang akan dibaca

2771}2773}

2772```2774```

2773 2775 

Details

308| `tag` | `string \| null` | required | String tag, atau `null` untuk menghapus |308| `tag` | `string \| null` | required | String tag, atau `null` untuk menghapus |

309| `options.dir` | `string` | `undefined` | Jalur direktori proyek. Ketika dihilangkan, mencari di semua direktori proyek |309| `options.dir` | `string` | `undefined` | Jalur direktori proyek. Ketika dihilangkan, mencari di semua direktori proyek |

310 310 

311### `resolveSettings()`

312 

313Menyelesaikan pengaturan Claude Code yang efektif untuk direktori tertentu menggunakan mesin penggabungan yang sama dengan CLI, tanpa menspawn CLI Claude. Gunakan untuk memeriksa konfigurasi apa yang akan dilihat oleh panggilan `query()` sebelum memanggil satu.

314 

315<Note>

316 Fungsi ini alpha dan API-nya mungkin berubah sebelum stabilisasi. Fungsi ini membaca sumber MDM, termasuk plist macOS dan Windows HKLM/HKCU, untuk paritas dengan startup CLI, tetapi tidak mengeksekusi subprocess `policyHelper` yang dikonfigurasi admin. Field `permissions.defaultMode` dikembalikan apa adanya dari semua tingkat termasuk pengaturan proyek. Filter kepercayaan yang diterapkan CLI sebelum menghormati mode izin yang meningkat tidak diterapkan.

317</Note>

318 

319```typescript theme={null}

320function resolveSettings(

321 options?: ResolveSettingsOptions

322): Promise<ResolvedSettings>;

323```

324 

325#### Parameter

326 

327`resolveSettings()` menerima objek opsi tunggal. Semua field bersifat opsional.

328 

329| Parameter | Tipe | Default | Deskripsi |

330| :------------------------------ | :------------------------------------ | :-------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

331| `options.cwd` | `string` | `process.cwd()` | Direktori untuk menyelesaikan pengaturan proyek dan lokal relatif terhadap |

332| `options.settingSources` | [`SettingSource`](#settingsource)`[]` | Semua sumber | Sumber filesystem mana yang akan dimuat. Lewatkan `[]` untuk melewati pengaturan pengguna, proyek, dan lokal. Pengaturan kebijakan terkelola dimuat dalam semua kasus |

333| `options.managedSettings` | `Settings` | `undefined` | Pengaturan tingkat kebijakan pembatasan yang digabungkan pada tingkat preseden kebijakan terkelola. Kunci non-pembatasan seperti `model` secara diam-diam dijatuhkan |

334| `options.serverManagedSettings` | `Settings` | `undefined` | Payload pengaturan terkelola server dari `/api/claude_code/settings`. Kunci non-pembatasan melewati tanpa filter |

335 

336#### Tipe pengembalian: `ResolvedSettings`

337 

338`resolveSettings()` mengembalikan objek yang menjelaskan pengaturan yang digabungkan dan sumber yang berkontribusi pada setiap kunci.

339 

340| Properti | Tipe | Deskripsi |

341| :----------- | :-------------------------------------------------- | :------------------------------------------------------------------------------------------------ |

342| `effective` | `Settings` | Pengaturan yang digabungkan setelah menerapkan semua sumber yang diaktifkan dalam urutan preseden |

343| `provenance` | `Partial<Record<keyof Settings, ProvenanceEntry>>` | Untuk setiap kunci tingkat atas dalam `effective`, sumber mana yang memasok nilai |

344| `sources` | `Array<{ source, settings, path?, policyOrigin? }>` | Pengaturan mentah per-sumber, diurutkan dari preseden terendah hingga tertinggi |

345 

346#### Contoh

347 

348Contoh di bawah ini menyelesaikan pengaturan untuk direktori proyek dan mencetak sumber yang mengontrol periode pembersihan.

349 

350```typescript theme={null}

351import { resolveSettings } from "@anthropic-ai/claude-agent-sdk";

352 

353const { effective, provenance } = await resolveSettings({

354 cwd: "/path/to/project",

355 settingSources: ["user", "project", "local"],

356});

357 

358console.log(`Cleanup period: ${effective.cleanupPeriodDays} days`);

359console.log(`Set by: ${provenance.cleanupPeriodDays?.source}`);

360```

361 

311## Tipe362## Tipe

312 363 

313### `Options`364### `Options`


864 | SDKFilesPersistedEvent915 | SDKFilesPersistedEvent

865 | SDKToolUseSummaryMessage916 | SDKToolUseSummaryMessage

866 | SDKRateLimitEvent917 | SDKRateLimitEvent

918 | SDKPermissionDeniedMessage

867 | SDKPromptSuggestionMessage;919 | SDKPromptSuggestionMessage;

868```920```

869 921 


1052};1104};

1053```1105```

1054 1106 

1107### `SDKPermissionDeniedMessage`

1108 

1109Event aliran yang dipancarkan ketika sistem izin secara otomatis menolak panggilan tool tanpa prompt interaktif. Gunakan ini untuk merender penolakan di UI Anda saat terjadi, daripada hanya mengamati hasil tool `is_error` yang mengikuti. Jalur tanya interaktif mencapai aplikasi Anda secara terpisah melalui callback [`canUseTool`](#canusetool). Penolakan yang dikeluarkan oleh hook `PreToolUse` tidak dilaporkan melalui event ini.

1110 

1111Event ini memerlukan Claude Code v2.1.136 atau lebih baru.

1112 

1113```typescript theme={null}

1114type SDKPermissionDeniedMessage = {

1115 type: "system";

1116 subtype: "permission_denied";

1117 tool_name: string;

1118 tool_use_id: string;

1119 agent_id?: string;

1120 decision_reason_type?: string;

1121 decision_reason?: string;

1122 message: string;

1123 uuid: UUID;

1124 session_id: string;

1125};

1126```

1127 

1128| Field | Tipe | Deskripsi |

1129| ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |

1130| `tool_name` | `string` | Nama tool yang ditolak |

1131| `tool_use_id` | `string` | ID dari blok `tool_use` yang dijawab penolakan ini |

1132| `agent_id` | `string` | ID subagent ketika panggilan yang ditolak berasal dari dalam subagent. Mencerminkan field pada `can_use_tool` untuk perutean sisi host |

1133| `decision_reason_type` | `string` | Diskriminator untuk komponen yang memutuskan, seperti `"rule"`, `"mode"`, `"classifier"`, atau `"asyncAgent"` |

1134| `decision_reason` | `string` | Alasan yang dapat dibaca manusia dari komponen yang memutuskan, ketika tersedia |

1135| `message` | `string` | Pesan penolakan yang dikembalikan ke model dalam `tool_result` |

1136 

1055### `SDKPermissionDenial`1137### `SDKPermissionDenial`

1056 1138 

1057Informasi tentang penggunaan tool yang ditolak.1139Informasi tentang penggunaan tool yang ditolak.

agent-sdk/user-input.md +810 −0 created

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Menangani persetujuan dan input pengguna

6 

7> Tampilkan permintaan persetujuan Claude dan pertanyaan klarifikasi kepada pengguna, kemudian kembalikan keputusan mereka ke SDK.

8 

9Saat mengerjakan tugas, Claude kadang-kadang perlu berkonsultasi dengan pengguna. Mungkin perlu izin sebelum menghapus file, atau perlu menanyakan database mana yang akan digunakan untuk proyek baru. Aplikasi Anda perlu menampilkan permintaan ini kepada pengguna sehingga Claude dapat melanjutkan dengan input mereka.

10 

11Claude meminta input pengguna dalam dua situasi: ketika membutuhkan **izin untuk menggunakan alat** (seperti menghapus file atau menjalankan perintah), dan ketika memiliki **pertanyaan klarifikasi** (melalui alat `AskUserQuestion`). Keduanya memicu callback `canUseTool` Anda, yang menghentikan eksekusi sampai Anda mengembalikan respons. Ini berbeda dari putaran percakapan normal di mana Claude selesai dan menunggu pesan berikutnya Anda.

12 

13Untuk pertanyaan klarifikasi, Claude menghasilkan pertanyaan dan opsi. Peran Anda adalah menyajikannya kepada pengguna dan mengembalikan pilihan mereka. Anda tidak dapat menambahkan pertanyaan Anda sendiri ke alur ini; jika Anda perlu menanyakan sesuatu kepada pengguna, lakukan itu secara terpisah dalam logika aplikasi Anda.

14 

15Callback dapat tetap tertunda tanpa batas waktu. Eksekusi tetap dijeda sampai callback Anda kembali, dan SDK hanya membatalkan tunggu ketika kueri itu sendiri dibatalkan. Jika pengguna mungkin membutuhkan waktu lebih lama untuk merespons daripada yang dapat ditahan proses Anda, TypeScript SDK mendukung [hook `defer`](/id/hooks#defer-a-tool-call-for-later), yang memungkinkan proses keluar dan dilanjutkan nanti dari sesi yang disimpan; opsi ini tidak tersedia di Python SDK.

16 

17Panduan ini menunjukkan cara mendeteksi setiap jenis permintaan dan merespons dengan tepat.

18 

19## Deteksi ketika Claude membutuhkan input

20 

21Berikan callback `canUseTool` dalam opsi kueri Anda. Callback dipicu setiap kali Claude membutuhkan input pengguna, menerima nama alat dan input sebagai argumen:

22 

23<CodeGroup>

24 ```python Python theme={null}

25 async def handle_tool_request(tool_name, input_data, context):

26 # Minta pengguna dan kembalikan izin atau tolak

27 ...

28 

29 

30 options = ClaudeAgentOptions(can_use_tool=handle_tool_request)

31 ```

32 

33 ```typescript TypeScript theme={null}

34 async function handleToolRequest(toolName, input, options) {

35 // options includes { signal: AbortSignal, suggestions?: PermissionUpdate[] }

36 // Minta pengguna dan kembalikan izin atau tolak

37 }

38 

39 const options = { canUseTool: handleToolRequest };

40 ```

41</CodeGroup>

42 

43Callback dipicu dalam dua kasus:

44 

451. **Alat membutuhkan persetujuan**: Claude ingin menggunakan alat yang tidak disetujui secara otomatis oleh [aturan izin](/id/agent-sdk/permissions) atau mode. Periksa `tool_name` untuk alat (misalnya, `"Bash"`, `"Write"`).

462. **Claude mengajukan pertanyaan**: Claude memanggil alat `AskUserQuestion`. Periksa apakah `tool_name == "AskUserQuestion"` untuk menanganinya secara berbeda. Jika Anda menentukan array `tools`, sertakan `AskUserQuestion` agar ini berfungsi. Lihat [Menangani pertanyaan klarifikasi](#handle-clarifying-questions) untuk detail.

47 

48<Note>

49 Untuk secara otomatis mengizinkan atau menolak alat tanpa meminta pengguna, gunakan [hooks](/id/agent-sdk/hooks) sebagai gantinya. Hooks dijalankan sebelum `canUseTool` dan dapat mengizinkan, menolak, atau memodifikasi permintaan berdasarkan logika Anda sendiri. Anda juga dapat menggunakan [hook `PermissionRequest`](/id/agent-sdk/hooks#available-hooks) untuk mengirim notifikasi eksternal (Slack, email, push) ketika Claude menunggu persetujuan.

50</Note>

51 

52## Menangani permintaan persetujuan alat

53 

54Setelah Anda melewatkan callback `canUseTool` dalam opsi kueri Anda, callback dipicu ketika Claude ingin menggunakan alat yang tidak disetujui secara otomatis. Callback Anda menerima tiga argumen:

55 

56| Argumen | Deskripsi |

57| ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

58| `toolName` | Nama alat yang ingin digunakan Claude (misalnya, `"Bash"`, `"Write"`, `"Edit"`) |

59| `input` | Parameter yang diteruskan Claude ke alat. Isi bervariasi menurut alat. |

60| `options` (TS) / `context` (Python) | Konteks tambahan termasuk `suggestions` opsional (entri `PermissionUpdate` yang diusulkan untuk menghindari permintaan ulang) dan sinyal pembatalan. Di TypeScript, `signal` adalah `AbortSignal`; di Python, bidang sinyal dicadangkan untuk penggunaan di masa depan. Lihat [`ToolPermissionContext`](/id/agent-sdk/python#toolpermissioncontext) untuk Python. |

61 

62Objek `input` berisi parameter khusus alat. Contoh umum:

63 

64| Alat | Bidang input |

65| ------- | --------------------------------------- |

66| `Bash` | `command`, `description`, `timeout` |

67| `Write` | `file_path`, `content` |

68| `Edit` | `file_path`, `old_string`, `new_string` |

69| `Read` | `file_path`, `offset`, `limit` |

70 

71Lihat referensi SDK untuk skema input lengkap: [Python](/id/agent-sdk/python#tool-input%2Foutput-types) | [TypeScript](/id/agent-sdk/typescript#tool-input-types).

72 

73Anda dapat menampilkan informasi ini kepada pengguna sehingga mereka dapat memutuskan apakah akan mengizinkan atau menolak tindakan, kemudian kembalikan respons yang sesuai.

74 

75Contoh berikut meminta Claude untuk membuat dan menghapus file uji. Ketika Claude mencoba setiap operasi, callback mencetak permintaan alat ke terminal dan meminta persetujuan y/n.

76 

77<CodeGroup>

78 ```python Python theme={null}

79 import asyncio

80 

81 from claude_agent_sdk import ClaudeAgentOptions, ResultMessage, query

82 from claude_agent_sdk.types import (

83 HookMatcher,

84 PermissionResultAllow,

85 PermissionResultDeny,

86 ToolPermissionContext,

87 )

88 

89 

90 async def can_use_tool(

91 tool_name: str, input_data: dict, context: ToolPermissionContext

92 ) -> PermissionResultAllow | PermissionResultDeny:

93 # Tampilkan permintaan alat

94 print(f"\nTool: {tool_name}")

95 if tool_name == "Bash":

96 print(f"Command: {input_data.get('command')}")

97 if input_data.get("description"):

98 print(f"Description: {input_data.get('description')}")

99 else:

100 print(f"Input: {input_data}")

101 

102 # Dapatkan persetujuan pengguna

103 response = input("Allow this action? (y/n): ")

104 

105 # Kembalikan izin atau tolak berdasarkan respons pengguna

106 if response.lower() == "y":

107 # Izinkan: alat dijalankan dengan input asli (atau dimodifikasi)

108 return PermissionResultAllow(updated_input=input_data)

109 else:

110 # Tolak: alat tidak dijalankan, Claude melihat pesan

111 return PermissionResultDeny(message="User denied this action")

112 

113 

114 # Solusi yang diperlukan: hook dummy menjaga aliran tetap terbuka untuk can_use_tool

115 async def dummy_hook(input_data, tool_use_id, context):

116 return {"continue_": True}

117 

118 

119 async def prompt_stream():

120 yield {

121 "type": "user",

122 "message": {

123 "role": "user",

124 "content": "Create a test file in /tmp and then delete it",

125 },

126 }

127 

128 

129 async def main():

130 async for message in query(

131 prompt=prompt_stream(),

132 options=ClaudeAgentOptions(

133 can_use_tool=can_use_tool,

134 hooks={"PreToolUse": [HookMatcher(matcher=None, hooks=[dummy_hook])]},

135 ),

136 ):

137 if isinstance(message, ResultMessage) and message.subtype == "success":

138 print(message.result)

139 

140 

141 asyncio.run(main())

142 ```

143 

144 ```typescript TypeScript theme={null}

145 import { query } from "@anthropic-ai/claude-agent-sdk";

146 import * as readline from "readline";

147 

148 // Helper untuk meminta input pengguna di terminal

149 function prompt(question: string): Promise<string> {

150 const rl = readline.createInterface({

151 input: process.stdin,

152 output: process.stdout

153 });

154 return new Promise((resolve) =>

155 rl.question(question, (answer) => {

156 rl.close();

157 resolve(answer);

158 })

159 );

160 }

161 

162 for await (const message of query({

163 prompt: "Create a test file in /tmp and then delete it",

164 options: {

165 canUseTool: async (toolName, input) => {

166 // Tampilkan permintaan alat

167 console.log(`\nTool: ${toolName}`);

168 if (toolName === "Bash") {

169 console.log(`Command: ${input.command}`);

170 if (input.description) console.log(`Description: ${input.description}`);

171 } else {

172 console.log(`Input: ${JSON.stringify(input, null, 2)}`);

173 }

174 

175 // Dapatkan persetujuan pengguna

176 const response = await prompt("Allow this action? (y/n): ");

177 

178 // Kembalikan izin atau tolak berdasarkan respons pengguna

179 if (response.toLowerCase() === "y") {

180 // Izinkan: alat dijalankan dengan input asli (atau dimodifikasi)

181 return { behavior: "allow", updatedInput: input };

182 } else {

183 // Tolak: alat tidak dijalankan, Claude melihat pesan

184 return { behavior: "deny", message: "User denied this action" };

185 }

186 }

187 }

188 })) {

189 if ("result" in message) console.log(message.result);

190 }

191 ```

192</CodeGroup>

193 

194<Note>

195 Di Python, `can_use_tool` memerlukan [mode streaming](/id/agent-sdk/streaming-vs-single-mode) dan hook `PreToolUse` yang mengembalikan `{"continue_": True}` untuk menjaga aliran tetap terbuka. Tanpa hook ini, aliran ditutup sebelum callback izin dapat dipanggil.

196</Note>

197 

198Contoh ini menggunakan alur `y/n` di mana input apa pun selain `y` diperlakukan sebagai penolakan. Dalam praktik, Anda mungkin membangun UI yang lebih kaya yang memungkinkan pengguna memodifikasi permintaan, memberikan umpan balik, atau mengarahkan Claude sepenuhnya. Lihat [Merespons permintaan alat](#respond-to-tool-requests) untuk semua cara Anda dapat merespons.

199 

200### Merespons permintaan alat

201 

202Callback Anda mengembalikan salah satu dari dua jenis respons:

203 

204| Respons | Python | TypeScript |

205| ----------- | ------------------------------------------ | ------------------------------------- |

206| **Izinkan** | `PermissionResultAllow(updated_input=...)` | `{ behavior: "allow", updatedInput }` |

207| **Tolak** | `PermissionResultDeny(message=...)` | `{ behavior: "deny", message }` |

208 

209Saat mengizinkan, berikan input alat (asli atau dimodifikasi). Saat menolak, berikan pesan yang menjelaskan alasannya. Claude melihat pesan ini dan mungkin menyesuaikan pendekatannya.

210 

211<CodeGroup>

212 ```python Python theme={null}

213 from claude_agent_sdk.types import PermissionResultAllow, PermissionResultDeny

214 

215 # Izinkan alat untuk dijalankan

216 return PermissionResultAllow(updated_input=input_data)

217 

218 # Blokir alat

219 return PermissionResultDeny(message="User rejected this action")

220 ```

221 

222 ```typescript TypeScript theme={null}

223 // Izinkan alat untuk dijalankan

224 return { behavior: "allow", updatedInput: input };

225 

226 // Blokir alat

227 return { behavior: "deny", message: "User rejected this action" };

228 ```

229</CodeGroup>

230 

231Selain mengizinkan atau menolak, Anda dapat memodifikasi input alat atau memberikan konteks yang membantu Claude menyesuaikan pendekatannya:

232 

233* **Setujui**: biarkan alat dijalankan seperti yang diminta Claude

234* **Setujui dengan perubahan**: modifikasi input sebelum eksekusi (misalnya, sanitasi jalur, tambahkan batasan)

235* **Tolak**: blokir alat dan beri tahu Claude mengapa

236* **Sarankan alternatif**: blokir tetapi arahkan Claude ke arah yang diinginkan pengguna

237* **Alihkan sepenuhnya**: gunakan [input streaming](/id/agent-sdk/streaming-vs-single-mode) untuk mengirim Claude instruksi yang sepenuhnya baru

238 

239<Tabs>

240 <Tab title="Setujui">

241 Pengguna menyetujui tindakan apa adanya. Teruskan `input` dari callback Anda tanpa perubahan dan alat dijalankan persis seperti yang diminta Claude.

242 

243 <CodeGroup>

244 ```python Python theme={null}

245 async def can_use_tool(tool_name, input_data, context):

246 print(f"Claude wants to use {tool_name}")

247 approved = await ask_user("Allow this action?")

248 

249 if approved:

250 return PermissionResultAllow(updated_input=input_data)

251 return PermissionResultDeny(message="User declined")

252 ```

253 

254 ```typescript TypeScript theme={null}

255 canUseTool: async (toolName, input) => {

256 console.log(`Claude wants to use ${toolName}`);

257 const approved = await askUser("Allow this action?");

258 

259 if (approved) {

260 return { behavior: "allow", updatedInput: input };

261 }

262 return { behavior: "deny", message: "User declined" };

263 };

264 ```

265 </CodeGroup>

266 </Tab>

267 

268 <Tab title="Setujui dengan perubahan">

269 Pengguna menyetujui tetapi ingin memodifikasi permintaan terlebih dahulu. Anda dapat mengubah input sebelum alat dijalankan. Claude melihat hasilnya tetapi tidak diberitahu Anda mengubah apa pun. Berguna untuk sanitasi parameter, menambahkan batasan, atau membatasi akses.

270 

271 <CodeGroup>

272 ```python Python theme={null}

273 async def can_use_tool(tool_name, input_data, context):

274 if tool_name == "Bash":

275 # Pengguna menyetujui, tetapi batasi semua perintah ke sandbox

276 sandboxed_input = {**input_data}

277 sandboxed_input["command"] = input_data["command"].replace(

278 "/tmp", "/tmp/sandbox"

279 )

280 return PermissionResultAllow(updated_input=sandboxed_input)

281 return PermissionResultAllow(updated_input=input_data)

282 ```

283 

284 ```typescript TypeScript theme={null}

285 canUseTool: async (toolName, input) => {

286 if (toolName === "Bash") {

287 // Pengguna menyetujui, tetapi batasi semua perintah ke sandbox

288 const sandboxedInput = {

289 ...input,

290 command: input.command.replace("/tmp", "/tmp/sandbox")

291 };

292 return { behavior: "allow", updatedInput: sandboxedInput };

293 }

294 return { behavior: "allow", updatedInput: input };

295 };

296 ```

297 </CodeGroup>

298 </Tab>

299 

300 <Tab title="Tolak">

301 Pengguna tidak menginginkan tindakan ini terjadi. Blokir alat dan berikan pesan yang menjelaskan alasannya. Claude melihat pesan ini dan mungkin mencoba pendekatan yang berbeda.

302 

303 <CodeGroup>

304 ```python Python theme={null}

305 async def can_use_tool(tool_name, input_data, context):

306 approved = await ask_user(f"Allow {tool_name}?")

307 

308 if not approved:

309 return PermissionResultDeny(message="User rejected this action")

310 return PermissionResultAllow(updated_input=input_data)

311 ```

312 

313 ```typescript TypeScript theme={null}

314 canUseTool: async (toolName, input) => {

315 const approved = await askUser(`Allow ${toolName}?`);

316 

317 if (!approved) {

318 return {

319 behavior: "deny",

320 message: "User rejected this action"

321 };

322 }

323 return { behavior: "allow", updatedInput: input };

324 };

325 ```

326 </CodeGroup>

327 </Tab>

328 

329 <Tab title="Sarankan alternatif">

330 Pengguna tidak menginginkan tindakan spesifik ini, tetapi memiliki ide yang berbeda. Blokir alat dan sertakan panduan dalam pesan Anda. Claude akan membaca ini dan memutuskan cara melanjutkan berdasarkan umpan balik Anda.

331 

332 <CodeGroup>

333 ```python Python theme={null}

334 async def can_use_tool(tool_name, input_data, context):

335 if tool_name == "Bash" and "rm" in input_data.get("command", ""):

336 # Pengguna tidak ingin menghapus, sarankan pengarsipan sebagai gantinya

337 return PermissionResultDeny(

338 message="User doesn't want to delete files. They asked if you could compress them into an archive instead."

339 )

340 return PermissionResultAllow(updated_input=input_data)

341 ```

342 

343 ```typescript TypeScript theme={null}

344 canUseTool: async (toolName, input) => {

345 if (toolName === "Bash" && input.command.includes("rm")) {

346 // Pengguna tidak ingin menghapus, sarankan pengarsipan sebagai gantinya

347 return {

348 behavior: "deny",

349 message:

350 "User doesn't want to delete files. They asked if you could compress them into an archive instead."

351 };

352 }

353 return { behavior: "allow", updatedInput: input };

354 };

355 ```

356 </CodeGroup>

357 </Tab>

358 

359 <Tab title="Alihkan sepenuhnya">

360 Untuk perubahan arah yang lengkap (bukan hanya dorongan), gunakan [input streaming](/id/agent-sdk/streaming-vs-single-mode) untuk mengirim Claude instruksi baru secara langsung. Ini melewati permintaan alat saat ini dan memberikan Claude instruksi yang sepenuhnya baru untuk diikuti.

361 </Tab>

362</Tabs>

363 

364## Menangani pertanyaan klarifikasi

365 

366Ketika Claude membutuhkan lebih banyak arahan tentang tugas dengan beberapa pendekatan yang valid, Claude memanggil alat `AskUserQuestion`. Ini memicu callback `canUseTool` Anda dengan `toolName` diatur ke `AskUserQuestion`. Input berisi pertanyaan Claude sebagai opsi pilihan ganda, yang Anda tampilkan kepada pengguna dan kembalikan pilihan mereka.

367 

368<Tip>

369 Pertanyaan klarifikasi sangat umum dalam [mode `plan`](/id/agent-sdk/permissions#plan-mode-plan), di mana Claude menjelajahi basis kode dan mengajukan pertanyaan sebelum mengusulkan rencana. Ini membuat mode plan ideal untuk alur kerja interaktif di mana Anda ingin Claude mengumpulkan persyaratan sebelum membuat perubahan.

370</Tip>

371 

372Langkah-langkah berikut menunjukkan cara menangani pertanyaan klarifikasi:

373 

374<Steps>

375 <Step title="Berikan callback canUseTool">

376 Berikan callback `canUseTool` dalam opsi kueri Anda. Secara default, `AskUserQuestion` tersedia. Jika Anda menentukan array `tools` untuk membatasi kemampuan Claude (misalnya, agen read-only dengan hanya `Read`, `Glob`, dan `Grep`), sertakan `AskUserQuestion` dalam array itu. Jika tidak, Claude tidak akan dapat mengajukan pertanyaan klarifikasi:

377 

378 <CodeGroup>

379 ```python Python theme={null}

380 async for message in query(

381 prompt="Analyze this codebase",

382 options=ClaudeAgentOptions(

383 # Sertakan AskUserQuestion dalam daftar alat Anda

384 tools=["Read", "Glob", "Grep", "AskUserQuestion"],

385 can_use_tool=can_use_tool,

386 ),

387 ):

388 print(message)

389 ```

390 

391 ```typescript TypeScript theme={null}

392 for await (const message of query({

393 prompt: "Analyze this codebase",

394 options: {

395 // Sertakan AskUserQuestion dalam daftar alat Anda

396 tools: ["Read", "Glob", "Grep", "AskUserQuestion"],

397 canUseTool: async (toolName, input) => {

398 // Tangani pertanyaan klarifikasi di sini

399 }

400 }

401 })) {

402 console.log(message);

403 }

404 ```

405 </CodeGroup>

406 </Step>

407 

408 <Step title="Deteksi AskUserQuestion">

409 Dalam callback Anda, periksa apakah `toolName` sama dengan `AskUserQuestion` untuk menanganinya secara berbeda dari alat lain:

410 

411 <CodeGroup>

412 ```python Python theme={null}

413 async def can_use_tool(tool_name: str, input_data: dict, context):

414 if tool_name == "AskUserQuestion":

415 # Implementasi Anda untuk mengumpulkan jawaban dari pengguna

416 return await handle_clarifying_questions(input_data)

417 # Tangani alat lain secara normal

418 return await prompt_for_approval(tool_name, input_data)

419 ```

420 

421 ```typescript TypeScript theme={null}

422 canUseTool: async (toolName, input) => {

423 if (toolName === "AskUserQuestion") {

424 // Implementasi Anda untuk mengumpulkan jawaban dari pengguna

425 return handleClarifyingQuestions(input);

426 }

427 // Tangani alat lain secara normal

428 return promptForApproval(toolName, input);

429 };

430 ```

431 </CodeGroup>

432 </Step>

433 

434 <Step title="Analisis input pertanyaan">

435 Input berisi pertanyaan Claude dalam array `questions`. Setiap pertanyaan memiliki `question` (teks untuk ditampilkan), `options` (pilihan), dan `multiSelect` (apakah beberapa pilihan diizinkan):

436 

437 ```json theme={null}

438 {

439 "questions": [

440 {

441 "question": "How should I format the output?",

442 "header": "Format",

443 "options": [

444 { "label": "Summary", "description": "Brief overview" },

445 { "label": "Detailed", "description": "Full explanation" }

446 ],

447 "multiSelect": false

448 },

449 {

450 "question": "Which sections should I include?",

451 "header": "Sections",

452 "options": [

453 { "label": "Introduction", "description": "Opening context" },

454 { "label": "Conclusion", "description": "Final summary" }

455 ],

456 "multiSelect": true

457 }

458 ]

459 }

460 ```

461 

462 Lihat [Format pertanyaan](#question-format) untuk deskripsi bidang lengkap.

463 </Step>

464 

465 <Step title="Kumpulkan jawaban dari pengguna">

466 Presentasikan pertanyaan kepada pengguna dan kumpulkan pilihan mereka. Cara Anda melakukan ini tergantung pada aplikasi Anda: prompt terminal, formulir web, dialog seluler, dll.

467 </Step>

468 

469 <Step title="Kembalikan jawaban ke Claude">

470 Bangun objek `answers` sebagai catatan di mana setiap kunci adalah teks `question` dan setiap nilai adalah `label` opsi yang dipilih:

471 

472 | Dari objek pertanyaan | Gunakan sebagai |

473 | ----------------------------------------------------------------- | --------------- |

474 | Bidang `question` (misalnya, `"How should I format the output?"`) | Kunci |

475 | Bidang `label` opsi yang dipilih (misalnya, `"Summary"`) | Nilai |

476 

477 Untuk pertanyaan multi-pilih, berikan array label atau gabungkan dengan `", "`. Jika Anda [mendukung input teks bebas](#support-free-text-input), gunakan teks kustom pengguna sebagai nilai.

478 

479 <CodeGroup>

480 ```python Python theme={null}

481 return PermissionResultAllow(

482 updated_input={

483 "questions": input_data.get("questions", []),

484 "answers": {

485 "How should I format the output?": "Summary",

486 "Which sections should I include?": ["Introduction", "Conclusion"],

487 },

488 }

489 )

490 ```

491 

492 ```typescript TypeScript theme={null}

493 return {

494 behavior: "allow",

495 updatedInput: {

496 questions: input.questions,

497 answers: {

498 "How should I format the output?": "Summary",

499 "Which sections should I include?": "Introduction, Conclusion"

500 }

501 }

502 };

503 ```

504 </CodeGroup>

505 </Step>

506</Steps>

507 

508### Format pertanyaan

509 

510Input berisi pertanyaan yang dihasilkan Claude dalam array `questions`. Setiap pertanyaan memiliki bidang-bidang ini:

511 

512| Bidang | Deskripsi |

513| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |

514| `question` | Teks pertanyaan lengkap untuk ditampilkan |

515| `header` | Label pendek untuk pertanyaan (maks 12 karakter) |

516| `options` | Array 2-4 pilihan, masing-masing dengan `label` dan `description`. TypeScript: secara opsional `preview` (lihat [di bawah](#option-previews-type-script)) |

517| `multiSelect` | Jika `true`, pengguna dapat memilih beberapa opsi |

518 

519Struktur yang diterima callback Anda:

520 

521```json theme={null}

522{

523 "questions": [

524 {

525 "question": "How should I format the output?",

526 "header": "Format",

527 "options": [

528 { "label": "Summary", "description": "Brief overview of key points" },

529 { "label": "Detailed", "description": "Full explanation with examples" }

530 ],

531 "multiSelect": false

532 }

533 ]

534}

535```

536 

537#### Pratinjau opsi (TypeScript)

538 

539`toolConfig.askUserQuestion.previewFormat` menambahkan bidang `preview` ke setiap opsi sehingga aplikasi Anda dapat menampilkan mockup visual di samping label. Tanpa pengaturan ini, Claude tidak menghasilkan pratinjau dan bidang tidak ada.

540 

541| `previewFormat` | `preview` berisi |

542| :--------------------- | :----------------------------------------------------------------------------------------------------------- |

543| tidak diatur (default) | Bidang tidak ada. Claude tidak menghasilkan pratinjau. |

544| `"markdown"` | ASCII art dan blok kode yang dibatasi |

545| `"html"` | Fragmen `<div>` bergaya (SDK menolak `<script>`, `<style>`, dan `<!DOCTYPE>` sebelum callback Anda berjalan) |

546 

547Format berlaku untuk semua pertanyaan dalam sesi. Claude menyertakan `preview` pada opsi di mana perbandingan visual membantu (pilihan tata letak, skema warna) dan menghilangkannya di mana tidak akan membantu (konfirmasi ya/tidak, pilihan hanya teks). Periksa `undefined` sebelum merender.

548 

549```typescript theme={null}

550import { query } from "@anthropic-ai/claude-agent-sdk";

551 

552for await (const message of query({

553 prompt: "Help me choose a card layout",

554 options: {

555 toolConfig: {

556 askUserQuestion: { previewFormat: "html" }

557 },

558 canUseTool: async (toolName, input) => {

559 // input.questions[].options[].preview adalah string HTML atau undefined

560 return { behavior: "allow", updatedInput: input };

561 }

562 }

563})) {

564 // ...

565}

566```

567 

568Opsi dengan pratinjau HTML:

569 

570```json theme={null}

571{

572 "label": "Compact",

573 "description": "Title and metric value only",

574 "preview": "<div style=\"padding:12px;border:1px solid #ddd;border-radius:8px\"><div style=\"font-size:12px;color:#666\">Active users</div><div style=\"font-size:28px;font-weight:600\">1,284</div></div>"

575}

576```

577 

578### Format respons

579 

580Kembalikan objek `answers` yang memetakan bidang `question` setiap pertanyaan ke `label` opsi yang dipilih:

581 

582| Bidang | Deskripsi |

583| ----------- | ------------------------------------------------------------------------------ |

584| `questions` | Teruskan array pertanyaan asli (diperlukan untuk pemrosesan alat) |

585| `answers` | Objek di mana kunci adalah teks pertanyaan dan nilai adalah label yang dipilih |

586 

587Untuk pertanyaan multi-pilih, berikan array label atau gabungkan dengan `", "`. Untuk input teks bebas, gunakan teks kustom pengguna secara langsung.

588 

589```json theme={null}

590{

591 "questions": [

592 // ...

593 ],

594 "answers": {

595 "How should I format the output?": "Summary",

596 "Which sections should I include?": ["Introduction", "Conclusion"]

597 }

598}

599```

600 

601#### Dukung input teks bebas

602 

603Opsi yang telah ditentukan Claude tidak akan selalu mencakup apa yang diinginkan pengguna. Untuk memungkinkan pengguna mengetik jawaban mereka sendiri:

604 

605* Tampilkan pilihan "Other" tambahan setelah opsi Claude yang menerima input teks

606* Gunakan teks kustom pengguna sebagai nilai jawaban (bukan kata "Other")

607 

608Lihat [contoh lengkap](#complete-example) di bawah untuk implementasi lengkap.

609 

610### Contoh lengkap

611 

612Claude mengajukan pertanyaan klarifikasi ketika membutuhkan input pengguna untuk melanjutkan. Misalnya, ketika diminta membantu memutuskan tech stack untuk aplikasi seluler, Claude mungkin menanyakan tentang cross-platform vs native, preferensi backend, atau platform target. Pertanyaan-pertanyaan ini membantu Claude membuat keputusan yang sesuai dengan preferensi pengguna daripada menebak.

613 

614Contoh ini menangani pertanyaan-pertanyaan tersebut dalam aplikasi terminal. Berikut yang terjadi di setiap langkah:

615 

6161. **Arahkan permintaan**: Callback `canUseTool` memeriksa apakah nama alat adalah `"AskUserQuestion"` dan mengarahkan ke handler khusus

6172. **Tampilkan pertanyaan**: Handler melakukan loop melalui array `questions` dan mencetak setiap pertanyaan dengan opsi bernomor

6183. **Kumpulkan input**: Pengguna dapat memasukkan angka untuk memilih opsi, atau mengetik teks bebas langsung (misalnya, "jquery", "i don't know")

6194. **Peta jawaban**: Kode memeriksa apakah input adalah numerik (menggunakan label opsi) atau teks bebas (menggunakan teks langsung)

6205. **Kembalikan ke Claude**: Respons mencakup array `questions` asli dan pemetaan `answers`

621 

622<CodeGroup>

623 ```python Python theme={null}

624 import asyncio

625 

626 from claude_agent_sdk import ClaudeAgentOptions, ResultMessage, query

627 from claude_agent_sdk.types import HookMatcher, PermissionResultAllow

628 

629 

630 def parse_response(response: str, options: list) -> str:

631 """Analisis input pengguna sebagai nomor opsi atau teks bebas."""

632 try:

633 indices = [int(s.strip()) - 1 for s in response.split(",")]

634 labels = [options[i]["label"] for i in indices if 0 <= i < len(options)]

635 return ", ".join(labels) if labels else response

636 except ValueError:

637 return response

638 

639 

640 async def handle_ask_user_question(input_data: dict) -> PermissionResultAllow:

641 """Tampilkan pertanyaan Claude dan kumpulkan jawaban pengguna."""

642 answers = {}

643 

644 for q in input_data.get("questions", []):

645 print(f"\n{q['header']}: {q['question']}")

646 

647 options = q["options"]

648 for i, opt in enumerate(options):

649 print(f" {i + 1}. {opt['label']} - {opt['description']}")

650 if q.get("multiSelect"):

651 print(" (Enter numbers separated by commas, or type your own answer)")

652 else:

653 print(" (Enter a number, or type your own answer)")

654 

655 response = input("Your choice: ").strip()

656 answers[q["question"]] = parse_response(response, options)

657 

658 return PermissionResultAllow(

659 updated_input={

660 "questions": input_data.get("questions", []),

661 "answers": answers,

662 }

663 )

664 

665 

666 async def can_use_tool(

667 tool_name: str, input_data: dict, context

668 ) -> PermissionResultAllow:

669 # Arahkan AskUserQuestion ke handler pertanyaan kami

670 if tool_name == "AskUserQuestion":

671 return await handle_ask_user_question(input_data)

672 # Setujui secara otomatis alat lain untuk contoh ini

673 return PermissionResultAllow(updated_input=input_data)

674 

675 

676 async def prompt_stream():

677 yield {

678 "type": "user",

679 "message": {

680 "role": "user",

681 "content": "Help me decide on the tech stack for a new mobile app",

682 },

683 }

684 

685 

686 # Solusi yang diperlukan: hook dummy menjaga aliran tetap terbuka untuk can_use_tool

687 async def dummy_hook(input_data, tool_use_id, context):

688 return {"continue_": True}

689 

690 

691 async def main():

692 async for message in query(

693 prompt=prompt_stream(),

694 options=ClaudeAgentOptions(

695 can_use_tool=can_use_tool,

696 hooks={"PreToolUse": [HookMatcher(matcher=None, hooks=[dummy_hook])]},

697 ),

698 ):

699 if isinstance(message, ResultMessage) and message.subtype == "success":

700 print(message.result)

701 

702 

703 asyncio.run(main())

704 ```

705 

706 ```typescript TypeScript theme={null}

707 import { query } from "@anthropic-ai/claude-agent-sdk";

708 import * as readline from "readline/promises";

709 

710 // Helper untuk meminta input pengguna di terminal

711 async function prompt(question: string): Promise<string> {

712 const rl = readline.createInterface({ input: process.stdin, output: process.stdout });

713 const answer = await rl.question(question);

714 rl.close();

715 return answer;

716 }

717 

718 // Analisis input pengguna sebagai nomor opsi atau teks bebas

719 function parseResponse(response: string, options: any[]): string {

720 const indices = response.split(",").map((s) => parseInt(s.trim()) - 1);

721 const labels = indices

722 .filter((i) => !isNaN(i) && i >= 0 && i < options.length)

723 .map((i) => options[i].label);

724 return labels.length > 0 ? labels.join(", ") : response;

725 }

726 

727 // Tampilkan pertanyaan Claude dan kumpulkan jawaban pengguna

728 async function handleAskUserQuestion(input: any) {

729 const answers: Record<string, string> = {};

730 

731 for (const q of input.questions) {

732 console.log(`\n${q.header}: ${q.question}`);

733 

734 const options = q.options;

735 options.forEach((opt: any, i: number) => {

736 console.log(` ${i + 1}. ${opt.label} - ${opt.description}`);

737 });

738 if (q.multiSelect) {

739 console.log(" (Enter numbers separated by commas, or type your own answer)");

740 } else {

741 console.log(" (Enter a number, or type your own answer)");

742 }

743 

744 const response = (await prompt("Your choice: ")).trim();

745 answers[q.question] = parseResponse(response, options);

746 }

747 

748 // Kembalikan jawaban ke Claude (harus menyertakan pertanyaan asli)

749 return {

750 behavior: "allow",

751 updatedInput: { questions: input.questions, answers }

752 };

753 }

754 

755 async function main() {

756 for await (const message of query({

757 prompt: "Help me decide on the tech stack for a new mobile app",

758 options: {

759 canUseTool: async (toolName, input) => {

760 // Arahkan AskUserQuestion ke handler pertanyaan kami

761 if (toolName === "AskUserQuestion") {

762 return handleAskUserQuestion(input);

763 }

764 // Setujui secara otomatis alat lain untuk contoh ini

765 return { behavior: "allow", updatedInput: input };

766 }

767 }

768 })) {

769 if ("result" in message) console.log(message.result);

770 }

771 }

772 

773 main();

774 ```

775</CodeGroup>

776 

777## Keterbatasan

778 

779* **Subagents**: `AskUserQuestion` saat ini tidak tersedia di subagents yang dihasilkan melalui alat Agent

780* **Batas pertanyaan**: setiap panggilan `AskUserQuestion` mendukung 1-4 pertanyaan dengan 2-4 opsi masing-masing

781 

782## Cara lain untuk mendapatkan input pengguna

783 

784Callback `canUseTool` dan alat `AskUserQuestion` mencakup sebagian besar skenario persetujuan dan klarifikasi, tetapi SDK menawarkan cara lain untuk mendapatkan input dari pengguna:

785 

786### Input streaming

787 

788Gunakan [input streaming](/id/agent-sdk/streaming-vs-single-mode) ketika Anda perlu:

789 

790* **Mengganggu agen di tengah-tugas**: kirim sinyal pembatalan atau ubah arah saat Claude sedang bekerja

791* **Memberikan konteks tambahan**: tambahkan informasi yang dibutuhkan Claude tanpa menunggu untuk ditanya

792* **Membangun antarmuka obrolan**: biarkan pengguna mengirim pesan lanjutan selama operasi yang berjalan lama

793 

794Input streaming ideal untuk UI percakapan di mana pengguna berinteraksi dengan agen sepanjang eksekusi, bukan hanya di titik persetujuan.

795 

796### Alat kustom

797 

798Gunakan [alat kustom](/id/agent-sdk/custom-tools) ketika Anda perlu:

799 

800* **Mengumpulkan input terstruktur**: bangun formulir, wizard, atau alur kerja multi-langkah yang melampaui format pilihan ganda `AskUserQuestion`

801* **Mengintegrasikan sistem persetujuan eksternal**: terhubung ke platform tiket, alur kerja, atau persetujuan yang ada

802* **Menerapkan interaksi khusus domain**: buat alat yang disesuaikan dengan kebutuhan aplikasi Anda, seperti antarmuka tinjauan kode atau daftar periksa penyebaran

803 

804Alat kustom memberi Anda kontrol penuh atas interaksi, tetapi memerlukan lebih banyak pekerjaan implementasi daripada menggunakan callback `canUseTool` bawaan.

805 

806## Sumber daya terkait

807 

808* [Konfigurasi izin](/id/agent-sdk/permissions): atur mode dan aturan izin

809* [Kontrol eksekusi dengan hooks](/id/agent-sdk/hooks): jalankan kode kustom di titik-titik kunci dalam siklus hidup agen

810* [Referensi TypeScript SDK](/id/agent-sdk/typescript#canusetool): dokumentasi API canUseTool lengkap

Details

39 39 

40Pengklasifikasi tidak membaca `autoMode` dari pengaturan proyek bersama di `.claude/settings.json`, jadi repo yang diperiksa tidak dapat menyuntikkan aturan izinnya sendiri.40Pengklasifikasi tidak membaca `autoMode` dari pengaturan proyek bersama di `.claude/settings.json`, jadi repo yang diperiksa tidak dapat menyuntikkan aturan izinnya sendiri.

41 41 

42Entri dari setiap cakupan digabungkan. Pengembang dapat memperluas `environment`, `allow`, dan `soft_deny` dengan entri pribadi tetapi tidak dapat menghapus entri yang disediakan pengaturan terkelola. Karena aturan izin bertindak sebagai pengecualian untuk aturan blokir di dalam pengklasifikasi, entri `allow` yang ditambahkan pengembang dapat mengganti entri `soft_deny` organisasi: kombinasinya bersifat aditif, bukan batas kebijakan keras.42Entri dari setiap cakupan digabungkan. Pengembang dapat memperluas `environment`, `allow`, `soft_deny`, dan `hard_deny` dengan entri pribadi tetapi tidak dapat menghapus entri yang disediakan pengaturan terkelola. Karena aturan izin bertindak sebagai pengecualian untuk aturan blokir lunak di dalam pengklasifikasi, entri `allow` yang ditambahkan pengembang dapat mengganti entri `soft_deny` organisasi: kombinasinya bersifat aditif, bukan batas kebijakan keras.

43 43 

44<Note>44<Note>

45 Pengklasifikasi adalah gerbang kedua yang berjalan setelah [sistem izin](/id/permissions). Untuk tindakan yang tidak boleh pernah berjalan terlepas dari niat pengguna atau konfigurasi pengklasifikasi, gunakan `permissions.deny` dalam pengaturan terkelola, yang memblokir tindakan sebelum pengklasifikasi dikonsultasikan dan tidak dapat ditimpa.45 Pengklasifikasi adalah gerbang kedua yang berjalan setelah [sistem izin](/id/permissions). Untuk tindakan yang tidak boleh pernah berjalan terlepas dari niat pengguna atau konfigurasi pengklasifikasi, gunakan `permissions.deny` dalam pengaturan terkelola, yang memblokir tindakan sebelum pengklasifikasi dikonsultasikan dan tidak dapat ditimpa.


99 99 

100## Ganti aturan blokir dan izin100## Ganti aturan blokir dan izin

101 101 

102Dua bidang tambahan memungkinkan Anda mengganti daftar aturan bawaan pengklasifikasi: `autoMode.soft_deny` mengontrol apa yang diblokir, dan `autoMode.allow` mengontrol pengecualian mana yang berlaku. Masing-masing adalah array deskripsi prosa, dibaca sebagai aturan bahasa alami. Tidak ada bidang `autoMode.deny`; untuk hard-block tindakan terlepas dari niat, gunakan [`permissions.deny`](/id/permissions), yang berjalan sebelum pengklasifikasi.102Tiga bidang tambahan memungkinkan Anda mengganti daftar aturan bawaan pengklasifikasi: `autoMode.hard_deny` untuk batas keamanan tanpa syarat, `autoMode.soft_deny` untuk tindakan destruktif yang niat pengguna dapat menghapus, dan `autoMode.allow` untuk pengecualian. Masing-masing adalah array deskripsi prosa, dibaca sebagai aturan bahasa alami. Untuk hard block berbasis pola alat yang berjalan sebelum pengklasifikasi, gunakan [`permissions.deny`](/id/permissions).

103 103 

104Di dalam pengklasifikasi, prioritas bekerja dalam tiga tingkat:104Di dalam pengklasifikasi, prioritas bekerja dalam empat tingkat:

105 105 

106* Aturan `soft_deny` memblokir terlebih dahulu106* Aturan `hard_deny` memblokir tanpa syarat. Niat pengguna dan pengecualian `allow` tidak berlaku.

107* Aturan `allow` kemudian mengganti blokir yang cocok sebagai pengecualian107* Aturan `soft_deny` memblokir selanjutnya. Niat pengguna dan pengecualian `allow` dapat mengganti ini.

108* Niat pengguna eksplisit mengganti keduanya: jika pesan pengguna secara langsung dan spesifik menggambarkan tindakan yang tepat Claude akan ambil, pengklasifikasi mengizinkannya bahkan ketika aturan `soft_deny` cocok108* Aturan `allow` kemudian mengganti aturan `soft_deny` yang cocok sebagai pengecualian.

109* Niat pengguna eksplisit mengganti blokir soft yang tersisa: jika pesan pengguna secara langsung dan spesifik menggambarkan tindakan yang tepat Claude akan ambil, pengklasifikasi mengizinkannya bahkan ketika aturan `soft_deny` cocok.

109 110 

110Permintaan umum tidak dihitung sebagai niat eksplisit. Meminta Claude untuk "membersihkan repo" tidak mengotorisasi force-push, tetapi meminta Claude untuk "force-push cabang ini" melakukannya.111Permintaan umum tidak dihitung sebagai niat eksplisit. Meminta Claude untuk "membersihkan repo" tidak mengotorisasi force-push, tetapi meminta Claude untuk "force-push cabang ini" melakukannya.

111 112 

112Untuk melonggarkan, tambahkan ke `allow` ketika pengklasifikasi berulang kali menandai pola rutin yang pengecualian default tidak cover. Untuk mengencangkan, tambahkan ke `soft_deny` untuk risiko spesifik lingkungan Anda yang default lewatkan. Untuk menjaga aturan bawaan sambil menambahkan aturan Anda sendiri, sertakan string literal `"$defaults"` dalam array. Aturan default disisipi pada posisi itu, jadi aturan kustom Anda dapat berada sebelum atau sesudahnya, dan Anda terus mewarisi pembaruan saat daftar bawaan berubah di seluruh rilis.113Untuk melonggarkan, tambahkan ke `allow` ketika pengklasifikasi berulang kali menandai pola rutin yang pengecualian default tidak cover. Untuk mengencangkan, tambahkan ke `soft_deny` untuk risiko destruktif spesifik lingkungan Anda yang default lewatkan, atau ke `hard_deny` untuk batas keamanan yang tidak boleh pernah dilintasi. Untuk menjaga aturan bawaan sambil menambahkan aturan Anda sendiri, sertakan string literal `"$defaults"` dalam array. Aturan default disisipi pada posisi itu, jadi aturan kustom Anda dapat berada sebelum atau sesudahnya, dan Anda terus mewarisi pembaruan saat daftar bawaan berubah di seluruh rilis.

113 114 

114```json theme={null}115```json theme={null}

115{116{


127 "$defaults",128 "$defaults",

128 "Never run database migrations outside the migrations CLI, even against dev databases",129 "Never run database migrations outside the migrations CLI, even against dev databases",

129 "Never modify files under infra/terraform/prod/: production infrastructure changes go through the review workflow"130 "Never modify files under infra/terraform/prod/: production infrastructure changes go through the review workflow"

131 ],

132 "hard_deny": [

133 "$defaults",

134 "Never send repository contents to third-party code-review APIs"

130 ]135 ]

131 }136 }

132}137}

133```138```

134 139 

135<Danger>140<Danger>

136 Menetapkan salah satu dari `environment`, `allow`, atau `soft_deny` tanpa `"$defaults"` menggantikan seluruh daftar default untuk bagian itu. Jika Anda menetapkan `soft_deny` dengan satu entri dan menghilangkan `"$defaults"`, setiap aturan blokir bawaan dibuang: force push, data exfiltration, `curl | bash`, production deploys, dan semua aturan blokir default lainnya menjadi diizinkan. Hanya hilangkan `"$defaults"` ketika Anda bermaksud mengambil kepemilikan penuh atas daftar. Dalam hal itu, jalankan `claude auto-mode defaults` untuk mencetak aturan bawaan, salin ke file pengaturan Anda, kemudian tinjau setiap aturan terhadap pipeline Anda sendiri dan toleransi risiko.141 Menetapkan salah satu dari `environment`, `allow`, `soft_deny`, atau `hard_deny` tanpa `"$defaults"` menggantikan seluruh daftar default untuk bagian itu. Array `soft_deny` tanpa `"$defaults"` membuang setiap aturan blokir soft bawaan, termasuk force push, `curl | bash`, dan production deploys. Array `hard_deny` tanpa `"$defaults"` membuang aturan data exfiltration bawaan dan aturan bypass pemeriksaan keamanan.

137</Danger>142</Danger>

138 143 

139Setiap bagian dievaluasi secara independen, jadi menetapkan `environment` saja membiarkan daftar `allow` dan `soft_deny` default tetap utuh.144Setiap bagian dievaluasi secara independen, jadi menetapkan `environment` saja membiarkan daftar `allow`, `soft_deny`, dan `hard_deny` default tetap utuh. Hanya hilangkan `"$defaults"` ketika Anda bermaksud mengambil kepemilikan penuh atas daftar. Untuk melakukan itu dengan aman, jalankan `claude auto-mode defaults` untuk mencetak aturan bawaan, salin ke file pengaturan Anda, kemudian tinjau setiap aturan terhadap pipeline Anda sendiri dan toleransi risiko.

140 145 

141## Periksa default dan konfigurasi efektif Anda146## Periksa default dan konfigurasi efektif Anda

142 147 

143Tiga subperintah CLI membantu Anda memeriksa dan memvalidasi konfigurasi Anda.148Tiga subperintah CLI membantu Anda memeriksa dan memvalidasi konfigurasi Anda.

144 149 

145Cetak aturan `environment`, `allow`, dan `soft_deny` bawaan sebagai JSON:150Cetak aturan `environment`, `allow`, `soft_deny`, dan `hard_deny` bawaan sebagai JSON:

146 151 

147```bash theme={null}152```bash theme={null}

148claude auto-mode defaults153claude auto-mode defaults


154claude auto-mode config159claude auto-mode config

155```160```

156 161 

157Dapatkan umpan balik AI tentang aturan `allow` dan `soft_deny` kustom Anda:162Dapatkan umpan balik AI tentang aturan `allow`, `soft_deny`, dan `hard_deny` kustom Anda:

158 163 

159```bash theme={null}164```bash theme={null}

160claude auto-mode critique165claude auto-mode critique

commands.md +3 −2

Details

46| `/btw <question>` | Ajukan [pertanyaan sampingan](/id/interactive-mode#side-questions-with-%2Fbtw) dengan cepat tanpa menambahkan ke percakapan |46| `/btw <question>` | Ajukan [pertanyaan sampingan](/id/interactive-mode#side-questions-with-%2Fbtw) dengan cepat tanpa menambahkan ke percakapan |

47| `/chrome` | Konfigurasi pengaturan [Claude in Chrome](/id/chrome) |47| `/chrome` | Konfigurasi pengaturan [Claude in Chrome](/id/chrome) |

48| `/claude-api [migrate\|managed-agents-onboard]` | **[Skill](/id/skills#bundled-skills).** Muat materi referensi Claude API untuk bahasa proyek Anda (Python, TypeScript, Java, Go, Ruby, C#, PHP, atau cURL) dan referensi Managed Agents. Mencakup tool use, streaming, batches, structured outputs, dan pitfalls umum. Juga mengaktifkan secara otomatis ketika kode Anda mengimpor `anthropic` atau `@anthropic-ai/sdk`. Jalankan `/claude-api migrate` untuk meningkatkan kode Claude API yang ada ke model yang lebih baru: Claude menanyakan file mana yang akan dipindai dan model mana yang akan ditargetkan, kemudian memperbarui ID model, konfigurasi thinking, dan parameter lain yang berubah antar versi. Jalankan `/claude-api managed-agents-onboard` untuk panduan interaktif yang membuat Managed Agent baru dari awal |48| `/claude-api [migrate\|managed-agents-onboard]` | **[Skill](/id/skills#bundled-skills).** Muat materi referensi Claude API untuk bahasa proyek Anda (Python, TypeScript, Java, Go, Ruby, C#, PHP, atau cURL) dan referensi Managed Agents. Mencakup tool use, streaming, batches, structured outputs, dan pitfalls umum. Juga mengaktifkan secara otomatis ketika kode Anda mengimpor `anthropic` atau `@anthropic-ai/sdk`. Jalankan `/claude-api migrate` untuk meningkatkan kode Claude API yang ada ke model yang lebih baru: Claude menanyakan file mana yang akan dipindai dan model mana yang akan ditargetkan, kemudian memperbarui ID model, konfigurasi thinking, dan parameter lain yang berubah antar versi. Jalankan `/claude-api managed-agents-onboard` untuk panduan interaktif yang membuat Managed Agent baru dari awal |

49| `/clear` | Mulai percakapan baru dengan konteks kosong. Percakapan sebelumnya tetap tersedia di `/resume`. Untuk membebaskan konteks sambil melanjutkan percakapan yang sama, gunakan `/compact` sebagai gantinya. Alias: `/reset`, `/new` |49| `/clear [name]` | Mulai percakapan baru dengan konteks kosong. Percakapan sebelumnya tetap tersedia di `/resume`. Teruskan nama untuk memberi label percakapan sebelumnya di pemilih `/resume`. Untuk membebaskan konteks sambil melanjutkan percakapan yang sama, gunakan `/compact` sebagai gantinya. Alias: `/reset`, `/new` |

50| `/color [color\|default]` | Atur warna bilah prompt untuk sesi saat ini. Warna yang tersedia: `red`, `blue`, `green`, `yellow`, `purple`, `orange`, `pink`, `cyan`. Gunakan `default` untuk mengatur ulang, atau jalankan tanpa argumen untuk memilih warna acak. Ketika [Remote Control](/id/remote-control) terhubung, warna disinkronkan ke claude.ai/code |50| `/color [color\|default]` | Atur warna bilah prompt untuk sesi saat ini. Warna yang tersedia: `red`, `blue`, `green`, `yellow`, `purple`, `orange`, `pink`, `cyan`. Gunakan `default` untuk mengatur ulang, atau jalankan tanpa argumen untuk memilih warna acak. Ketika [Remote Control](/id/remote-control) terhubung, warna disinkronkan ke claude.ai/code |

51| `/compact [instructions]` | Bebaskan konteks dengan merangkum percakapan sejauh ini. Secara opsional teruskan instruksi fokus untuk ringkasan. Lihat [bagaimana compaction menangani rules, skills, dan memory files](/id/context-window#what-survives-compaction) |51| `/compact [instructions]` | Bebaskan konteks dengan merangkum percakapan sejauh ini. Secara opsional teruskan instruksi fokus untuk ringkasan. Lihat [bagaimana compaction menangani rules, skills, dan memory files](/id/context-window#what-survives-compaction) |

52| `/config` | Buka antarmuka [Settings](/id/settings) untuk menyesuaikan tema, model, [output style](/id/output-styles), dan preferensi lainnya. Alias: `/settings` |52| `/config` | Buka antarmuka [Settings](/id/settings) untuk menyesuaikan tema, model, [output style](/id/output-styles), dan preferensi lainnya. Alias: `/settings` |

53| `/context` | Visualisasikan penggunaan konteks saat ini sebagai grid berwarna. Menampilkan saran optimasi untuk alat yang berat konteks, memory bloat, dan peringatan kapasitas |53| `/context [all]` | Visualisasikan penggunaan konteks saat ini sebagai grid berwarna. Menampilkan saran optimasi untuk alat yang berat konteks, memory bloat, dan peringatan kapasitas. Dalam [fullscreen mode](/id/fullscreen) rincian per-item disusutkan untuk menjaga grid tetap terlihat. Teruskan `all` untuk meperluasnya |

54| `/copy [N]` | Salin respons asisten terakhir ke clipboard. Teruskan angka `N` untuk menyalin respons ke-N terbaru: `/copy 2` menyalin respons kedua terakhir. Ketika blok kode ada, menampilkan pemilih interaktif untuk memilih blok individual atau respons lengkap. Tekan `w` di pemilih untuk menulis pilihan ke file alih-alih clipboard, yang berguna melalui SSH |54| `/copy [N]` | Salin respons asisten terakhir ke clipboard. Teruskan angka `N` untuk menyalin respons ke-N terbaru: `/copy 2` menyalin respons kedua terakhir. Ketika blok kode ada, menampilkan pemilih interaktif untuk memilih blok individual atau respons lengkap. Tekan `w` di pemilih untuk menulis pilihan ke file alih-alih clipboard, yang berguna melalui SSH |

55| `/cost` | Alias untuk `/usage` |55| `/cost` | Alias untuk `/usage` |

56| `/debug [description]` | **[Skill](/id/skills#bundled-skills).** Aktifkan debug logging untuk sesi saat ini dan troubleshoot masalah dengan membaca session debug log. Debug logging dimatikan secara default kecuali Anda memulai dengan `claude --debug`, jadi menjalankan `/debug` di tengah sesi mulai menangkap log dari titik itu ke depan. Secara opsional jelaskan masalah untuk fokus analisis |56| `/debug [description]` | **[Skill](/id/skills#bundled-skills).** Aktifkan debug logging untuk sesi saat ini dan troubleshoot masalah dengan membaca session debug log. Debug logging dimatikan secara default kecuali Anda memulai dengan `claude --debug`, jadi menjalankan `/debug` di tengah sesi mulai menangkap log dari titik itu ke depan. Secara opsional jelaskan masalah untuk fokus analisis |


88| `/powerup` | Temukan fitur Claude Code melalui pelajaran interaktif cepat dengan demo animasi |88| `/powerup` | Temukan fitur Claude Code melalui pelajaran interaktif cepat dengan demo animasi |

89| `/pr-comments [PR]` | {/* max-version: 2.1.90 */}Dihapus di v2.1.91. Tanyakan Claude secara langsung untuk melihat komentar pull request sebagai gantinya. Pada versi sebelumnya, mengambil dan menampilkan komentar dari pull request GitHub; secara otomatis mendeteksi PR untuk cabang saat ini, atau teruskan URL atau nomor PR. Memerlukan CLI `gh` |89| `/pr-comments [PR]` | {/* max-version: 2.1.90 */}Dihapus di v2.1.91. Tanyakan Claude secara langsung untuk melihat komentar pull request sebagai gantinya. Pada versi sebelumnya, mengambil dan menampilkan komentar dari pull request GitHub; secara otomatis mendeteksi PR untuk cabang saat ini, atau teruskan URL atau nomor PR. Memerlukan CLI `gh` |

90| `/privacy-settings` | Lihat dan perbarui pengaturan privasi Anda. Hanya tersedia untuk pelanggan paket Pro dan Max |90| `/privacy-settings` | Lihat dan perbarui pengaturan privasi Anda. Hanya tersedia untuk pelanggan paket Pro dan Max |

91| `/radio` | Buka Claude FM lo-fi radio di browser Anda. Mencetak URL stream ketika tidak ada browser yang tersedia. Tidak tersedia di Bedrock, Vertex, atau Foundry |

91| `/recap` | Hasilkan ringkasan satu baris dari sesi saat ini sesuai permintaan. Lihat [Session recap](/id/interactive-mode#session-recap) untuk recap otomatis yang muncul setelah Anda pergi |92| `/recap` | Hasilkan ringkasan satu baris dari sesi saat ini sesuai permintaan. Lihat [Session recap](/id/interactive-mode#session-recap) untuk recap otomatis yang muncul setelah Anda pergi |

92| `/release-notes` | Lihat changelog dalam pemilih versi interaktif. Pilih versi spesifik untuk melihat release notes-nya, atau pilih untuk menampilkan semua versi |93| `/release-notes` | Lihat changelog dalam pemilih versi interaktif. Pilih versi spesifik untuk melihat release notes-nya, atau pilih untuk menampilkan semua versi |

93| `/reload-plugins` | Muat ulang semua [plugins](/id/plugins) aktif untuk menerapkan perubahan yang tertunda tanpa memulai ulang. Melaporkan jumlah untuk setiap komponen yang dimuat ulang dan menandai kesalahan pemuatan apa pun |94| `/reload-plugins` | Muat ulang semua [plugins](/id/plugins) aktif untuk menerapkan perubahan yang tertunda tanpa memulai ulang. Melaporkan jumlah untuk setiap komponen yang dimuat ulang dan menandai kesalahan pemuatan apa pun |

env-vars.md +3 −1

Details

71| `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING` | Atur ke `1` untuk menonaktifkan [penalaran adaptif](/id/model-config#adjust-effort-level) pada Opus 4.6 dan Sonnet 4.6 dan kembali ke anggaran pemikiran tetap yang dikendalikan oleh `MAX_THINKING_TOKENS`. {/* min-version: 2.1.111 */}Tidak berpengaruh pada Opus 4.7, yang selalu menggunakan penalaran adaptif |71| `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING` | Atur ke `1` untuk menonaktifkan [penalaran adaptif](/id/model-config#adjust-effort-level) pada Opus 4.6 dan Sonnet 4.6 dan kembali ke anggaran pemikiran tetap yang dikendalikan oleh `MAX_THINKING_TOKENS`. {/* min-version: 2.1.111 */}Tidak berpengaruh pada Opus 4.7, yang selalu menggunakan penalaran adaptif |

72| `CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN` | Atur ke `1` untuk menonaktifkan [rendering layar penuh](/id/fullscreen) dan menggunakan renderer layar utama klasik. Percakapan tetap berada di scrollback asli terminal Anda sehingga `Cmd+f` dan mode copy tmux bekerja seperti biasanya. Mengambil alih `CLAUDE_CODE_NO_FLICKER` dan pengaturan [`tui`](/id/settings#available-settings). Anda juga dapat beralih dengan `/tui default` |72| `CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN` | Atur ke `1` untuk menonaktifkan [rendering layar penuh](/id/fullscreen) dan menggunakan renderer layar utama klasik. Percakapan tetap berada di scrollback asli terminal Anda sehingga `Cmd+f` dan mode copy tmux bekerja seperti biasanya. Mengambil alih `CLAUDE_CODE_NO_FLICKER` dan pengaturan [`tui`](/id/settings#available-settings). Anda juga dapat beralih dengan `/tui default` |

73| `CLAUDE_CODE_DISABLE_ATTACHMENTS` | Atur ke `1` untuk menonaktifkan pemrosesan lampiran. Penyebutan file dengan sintaks `@` dikirim sebagai teks biasa alih-alih diperluas menjadi konten file |73| `CLAUDE_CODE_DISABLE_ATTACHMENTS` | Atur ke `1` untuk menonaktifkan pemrosesan lampiran. Penyebutan file dengan sintaks `@` dikirim sebagai teks biasa alih-alih diperluas menjadi konten file |

74| `CLAUDE_CODE_DISABLE_AUTO_MEMORY` | Atur ke `1` untuk menonaktifkan [memori otomatis](/id/memory#auto-memory). Atur ke `0` untuk memaksa memori otomatis selama peluncuran bertahap. Saat dinonaktifkan, Claude tidak membuat atau memuat file memori otomatis |74| `CLAUDE_CODE_DISABLE_AUTO_MEMORY` | Atur ke `1` untuk menonaktifkan [memori otomatis](/id/memory#auto-memory). Atur ke `0` untuk memaksa memori otomatis selama mode `--bare` atau [`autoMemoryEnabled: false`](/id/settings#available-settings) akan menonaktifkannya. Saat dinonaktifkan, Claude tidak membuat atau memuat file memori otomatis |

75| `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` | Atur ke `1` untuk menonaktifkan semua fungsi tugas latar belakang, termasuk parameter `run_in_background` pada alat Bash dan subagent, auto-backgrounding, dan pintasan Ctrl+B |75| `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` | Atur ke `1` untuk menonaktifkan semua fungsi tugas latar belakang, termasuk parameter `run_in_background` pada alat Bash dan subagent, auto-backgrounding, dan pintasan Ctrl+B |

76| `CLAUDE_CODE_DISABLE_CLAUDE_MDS` | Atur ke `1` untuk mencegah memuat file memori CLAUDE.md apa pun ke dalam konteks, termasuk file pengguna, proyek, dan memori otomatis |76| `CLAUDE_CODE_DISABLE_CLAUDE_MDS` | Atur ke `1` untuk mencegah memuat file memori CLAUDE.md apa pun ke dalam konteks, termasuk file pengguna, proyek, dan memori otomatis |

77| `CLAUDE_CODE_DISABLE_CRON` | Atur ke `1` untuk menonaktifkan [tugas terjadwal](/id/scheduled-tasks). Skill `/loop` dan alat cron menjadi tidak tersedia dan tugas yang sudah dijadwalkan berhenti berfungsi, termasuk tugas yang sudah berjalan di tengah sesi |77| `CLAUDE_CODE_DISABLE_CRON` | Atur ke `1` untuk menonaktifkan [tugas terjadwal](/id/scheduled-tasks). Skill `/loop` dan alat cron menjadi tidak tersedia dan tugas yang sudah dijadwalkan berhenti berfungsi, termasuk tugas yang sudah berjalan di tengah sesi |


116| `CLAUDE_CODE_MAX_RETRIES` | Ganti jumlah kali untuk mencoba ulang permintaan API yang gagal (default: 10) |116| `CLAUDE_CODE_MAX_RETRIES` | Ganti jumlah kali untuk mencoba ulang permintaan API yang gagal (default: 10) |

117| `CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY` | Jumlah maksimal alat baca-saja dan subagent yang dapat dieksekusi secara paralel (default: 10). Nilai yang lebih tinggi meningkatkan paralelisme tetapi mengonsumsi lebih banyak sumber daya |117| `CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY` | Jumlah maksimal alat baca-saja dan subagent yang dapat dieksekusi secara paralel (default: 10). Nilai yang lebih tinggi meningkatkan paralelisme tetapi mengonsumsi lebih banyak sumber daya |

118| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | Atur ke `1` untuk meluncurkan server MCP stdio dengan hanya lingkungan dasar yang aman ditambah `env` yang dikonfigurasi server, alih-alih mewarisi lingkungan shell Anda |118| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | Atur ke `1` untuk meluncurkan server MCP stdio dengan hanya lingkungan dasar yang aman ditambah `env` yang dikonfigurasi server, alih-alih mewarisi lingkungan shell Anda |

119| `CLAUDE_CODE_NATIVE_CURSOR` | Atur ke `1` untuk menampilkan kursor terminal sendiri di caret input alih-alih blok yang digambar. Kursor menghormati pengaturan blink, bentuk, dan fokus terminal |

119| `CLAUDE_CODE_NEW_INIT` | Atur ke `1` untuk membuat `/init` menjalankan alur pengaturan interaktif. Alur menanyakan file mana yang akan dibuat, termasuk CLAUDE.md, skill, dan hook, sebelum menjelajahi basis kode dan menulisnya. Tanpa variabel ini, `/init` membuat CLAUDE.md secara otomatis tanpa meminta. |120| `CLAUDE_CODE_NEW_INIT` | Atur ke `1` untuk membuat `/init` menjalankan alur pengaturan interaktif. Alur menanyakan file mana yang akan dibuat, termasuk CLAUDE.md, skill, dan hook, sebelum menjelajahi basis kode dan menulisnya. Tanpa variabel ini, `/init` membuat CLAUDE.md secara otomatis tanpa meminta. |

120| `CLAUDE_CODE_NO_FLICKER` | Atur ke `1` untuk mengaktifkan [rendering layar penuh](/id/fullscreen), pratinjau penelitian yang mengurangi flicker dan menjaga memori tetap datar dalam percakapan panjang. Setara dengan pengaturan [`tui`](/id/settings#available-settings); Anda juga dapat beralih dengan `/tui fullscreen` |121| `CLAUDE_CODE_NO_FLICKER` | Atur ke `1` untuk mengaktifkan [rendering layar penuh](/id/fullscreen), pratinjau penelitian yang mengurangi flicker dan menjaga memori tetap datar dalam percakapan panjang. Setara dengan pengaturan [`tui`](/id/settings#available-settings); Anda juga dapat beralih dengan `/tui fullscreen` |

121| `CLAUDE_CODE_OAUTH_REFRESH_TOKEN` | Token refresh OAuth untuk autentikasi Claude.ai. Saat diatur, `claude auth login` menukar token ini secara langsung alih-alih membuka browser. Memerlukan `CLAUDE_CODE_OAUTH_SCOPES`. Berguna untuk menyediakan autentikasi di lingkungan otomatis |122| `CLAUDE_CODE_OAUTH_REFRESH_TOKEN` | Token refresh OAuth untuk autentikasi Claude.ai. Saat diatur, `claude auth login` menukar token ini secara langsung alih-alih membuka browser. Memerlukan `CLAUDE_CODE_OAUTH_SCOPES`. Berguna untuk menyediakan autentikasi di lingkungan otomatis |


191| `DISABLE_TELEMETRY` | Atur ke `1` untuk menolak telemetri. Peristiwa telemetri tidak menyertakan data pengguna seperti kode, jalur file, atau perintah bash |192| `DISABLE_TELEMETRY` | Atur ke `1` untuk menolak telemetri. Peristiwa telemetri tidak menyertakan data pengguna seperti kode, jalur file, atau perintah bash |

192| `DISABLE_UPDATES` | Atur ke `1` untuk memblokir semua pembaruan termasuk manual `claude update` dan `claude install`. Lebih ketat daripada `DISABLE_AUTOUPDATER`. Gunakan saat mendistribusikan Claude Code melalui saluran Anda sendiri dan pengguna tidak boleh memperbarui diri |193| `DISABLE_UPDATES` | Atur ke `1` untuk memblokir semua pembaruan termasuk manual `claude update` dan `claude install`. Lebih ketat daripada `DISABLE_AUTOUPDATER`. Gunakan saat mendistribusikan Claude Code melalui saluran Anda sendiri dan pengguna tidak boleh memperbarui diri |

193| `DISABLE_UPGRADE_COMMAND` | Atur ke `1` untuk menyembunyikan perintah `/upgrade` |194| `DISABLE_UPGRADE_COMMAND` | Atur ke `1` untuk menyembunyikan perintah `/upgrade` |

195| `DO_NOT_TRACK` | Atur ke `1` untuk menolak telemetri. Setara dengan pengaturan `DISABLE_TELEMETRY`. Dihormati sebagai [konvensi lintas alat standar](https://consoledonottrack.com/) |

194| `ENABLE_CLAUDEAI_MCP_SERVERS` | Atur ke `false` untuk menonaktifkan [server MCP claude.ai](/id/mcp#use-mcp-servers-from-claude-ai) di Claude Code. Diaktifkan secara default untuk pengguna yang masuk |196| `ENABLE_CLAUDEAI_MCP_SERVERS` | Atur ke `false` untuk menonaktifkan [server MCP claude.ai](/id/mcp#use-mcp-servers-from-claude-ai) di Claude Code. Diaktifkan secara default untuk pengguna yang masuk |

195| `ENABLE_PROMPT_CACHING_1H` | Atur ke `1` untuk meminta TTL cache prompt 1 jam alih-alih default 5 menit. Dimaksudkan untuk pengguna kunci API, [Bedrock](/id/amazon-bedrock), [Vertex](/id/google-vertex-ai), dan [Foundry](/id/microsoft-foundry). Pengguna langganan menerima TTL 1 jam secara otomatis. Penulisan cache 1 jam ditagih dengan tarif yang lebih tinggi |197| `ENABLE_PROMPT_CACHING_1H` | Atur ke `1` untuk meminta TTL cache prompt 1 jam alih-alih default 5 menit. Dimaksudkan untuk pengguna kunci API, [Bedrock](/id/amazon-bedrock), [Vertex](/id/google-vertex-ai), dan [Foundry](/id/microsoft-foundry). Pengguna langganan menerima TTL 1 jam secara otomatis. Penulisan cache 1 jam ditagih dengan tarif yang lebih tinggi |

196| `ENABLE_PROMPT_CACHING_1H_BEDROCK` | Deprecated. Gunakan `ENABLE_PROMPT_CACHING_1H` sebagai gantinya |198| `ENABLE_PROMPT_CACHING_1H_BEDROCK` | Deprecated. Gunakan `ENABLE_PROMPT_CACHING_1H` sebagai gantinya |

errors.md +16 −0

Details

31| `Not logged in · Please run /login` | [Autentikasi](#not-logged-in) |31| `Not logged in · Please run /login` | [Autentikasi](#not-logged-in) |

32| `Invalid API key` | [Autentikasi](#invalid-api-key) |32| `Invalid API key` | [Autentikasi](#invalid-api-key) |

33| `This organization has been disabled` | [Autentikasi](#this-organization-has-been-disabled) |33| `This organization has been disabled` | [Autentikasi](#this-organization-has-been-disabled) |

34| `Routines are disabled by your organization's policy` | [Autentikasi](#routines-are-disabled-by-your-organizations-policy) |

34| `OAuth token revoked` / `OAuth token has expired` | [Autentikasi](#oauth-token-revoked-or-expired) |35| `OAuth token revoked` / `OAuth token has expired` | [Autentikasi](#oauth-token-revoked-or-expired) |

35| `does not meet scope requirement user:profile` | [Autentikasi](#oauth-scope-requirement) |36| `does not meet scope requirement user:profile` | [Autentikasi](#oauth-scope-requirement) |

36| `Unable to connect to API` | [Jaringan](#unable-to-connect-to-api) |37| `Unable to connect to API` | [Jaringan](#unable-to-connect-to-api) |


252* Jalankan `/status` setelahnya untuk mengonfirmasi kredensial aktif adalah langganan Anda253* Jalankan `/status` setelahnya untuk mengonfirmasi kredensial aktif adalah langganan Anda

253* Jika tidak ada variabel lingkungan yang diatur dan kesalahan berlanjut, organisasi yang dinonaktifkan adalah yang terikat pada `/login` Anda. Hubungi dukungan atau masuk dengan akun berbeda.254* Jika tidak ada variabel lingkungan yang diatur dan kesalahan berlanjut, organisasi yang dinonaktifkan adalah yang terikat pada `/login` Anda. Hubungi dukungan atau masuk dengan akun berbeda.

254 255 

256### Routines are disabled by your organization's policy

257 

258Admin Tim atau Enterprise Anda telah mematikan routines di tingkat organisasi. Kesalahan muncul ketika Anda mencoba membuat atau menjalankan routine, termasuk dari `/schedule` dan UI [Routines](/id/routines) di claude.ai/code.

259 

260```text theme={null}

261Routines are disabled by your organization's policy.

262```

263 

264Ini adalah pengaturan sisi server, jadi tidak dapat ditimpa dari pengaturan lokal, variabel lingkungan, atau flag CLI.

265 

266**Yang harus dilakukan:**

267 

268* Minta admin Anda untuk mengaktifkan toggle **Routines** di [claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code)

269* Untuk pekerjaan terjadwal sekali pakai yang tidak memerlukan routines tingkat organisasi, lihat [scheduled tasks](/id/scheduled-tasks)

270 

255### OAuth token revoked or expired271### OAuth token revoked or expired

256 272 

257Login yang disimpan tidak lagi valid. Token yang dicabut berarti Anda keluar di mana-mana atau admin menghapus akses; token yang kedaluwarsa berarti penyegaran otomatis gagal di tengah sesi.273Login yang disimpan tidak lagi valid. Token yang dicabut berarti Anda keluar di mana-mana atau admin menghapus akses; token yang kedaluwarsa berarti penyegaran otomatis gagal di tengah sesi.

Details

288 288 

289Setelah Claude merespons, saran terus muncul berdasarkan riwayat percakapan Anda, seperti langkah lanjutan dari permintaan multi-bagian atau kelanjutan alami dari alur kerja Anda.289Setelah Claude merespons, saran terus muncul berdasarkan riwayat percakapan Anda, seperti langkah lanjutan dari permintaan multi-bagian atau kelanjutan alami dari alur kerja Anda.

290 290 

291* Tekan **Tab** atau **Right arrow** untuk menerima saran, atau tekan **Enter** untuk menerima dan mengirimkan291* Tekan **Tab** atau **Right arrow** untuk menempatkan saran di input prompt, kemudian **Enter** untuk mengirimkan

292* Mulai mengetik untuk menolaknya292* Mulai mengetik untuk menolaknya

293 293 

294Saran berjalan sebagai permintaan latar belakang yang menggunakan kembali cache prompt percakapan induk, sehingga biaya tambahan minimal. Claude Code melewati pembuatan saran ketika cache dingin untuk menghindari biaya yang tidak perlu.294Saran berjalan sebagai permintaan latar belakang yang menggunakan kembali cache prompt percakapan induk, sehingga biaya tambahan minimal. Claude Code melewati pembuatan saran ketika cache dingin untuk menghindari biaya yang tidak perlu.

mcp.md +2 −0

Details

265 --header "Authorization: Bearer your-token"265 --header "Authorization: Bearer your-token"

266```266```

267 267 

268Saat mengonfigurasi server MCP melalui JSON dalam `.mcp.json`, `~/.claude.json`, atau `claude mcp add-json`, bidang `type` menerima `streamable-http` sebagai alias untuk `http`. Spesifikasi MCP menggunakan nama `streamable-http` untuk transport ini, jadi konfigurasi yang disalin dari dokumentasi server berfungsi tanpa modifikasi.

269 

268### Opsi 2: Tambahkan server SSE jarak jauh270### Opsi 2: Tambahkan server SSE jarak jauh

269 271 

270<Warning>272<Warning>

permissions.md +7 −0

Details

210* `Edit(//tmp/scratch.txt)`: edit jalur absolut `/tmp/scratch.txt`210* `Edit(//tmp/scratch.txt)`: edit jalur absolut `/tmp/scratch.txt`

211* `Read(src/**)`: membaca dari `<current-directory>/src/`211* `Read(src/**)`: membaca dari `<current-directory>/src/`

212 212 

213Aturan hanya cocok dengan file di bawah jangkarannya, jadi jangkar menentukan seberapa jauh aturan deny mencapai. Nama file telanjang mengikuti semantik gitignore dan cocok di kedalaman apa pun, jadi `Read(.env)` dan `Read(**/.env)` setara:

214 

215| Aturan deny | Memblokir | Tidak memblokir |

216| --------------------------------- | -------------------------------------------------- | -------------------------------------------------- |

217| `Read(.env)` atau `Read(**/.env)` | `.env` apa pun di atau di bawah direktori saat ini | `.env` di direktori induk atau proyek lain |

218| `Read(//**/.env)` | `.env` apa pun di mana pun di sistem file | tidak ada; aturan ini berlabuh di akar sistem file |

219 

213<Note>220<Note>

214 Dalam pola gitignore, `*` mencocokkan file dalam satu direktori sementara `**` mencocokkan secara rekursif di seluruh direktori. Untuk memungkinkan semua akses file, gunakan hanya nama alat tanpa tanda kurung: `Read`, `Edit`, atau `Write`.221 Dalam pola gitignore, `*` mencocokkan file dalam satu direktori sementara `**` mencocokkan secara rekursif di seluruh direktori. Untuk memungkinkan semua akses file, gunakan hanya nama alat tanpa tanda kurung: `Read`, `Edit`, atau `Write`.

215</Note>222</Note>

Details

423 423 

424| Field | Tipe | Deskripsi | Contoh |424| Field | Tipe | Deskripsi | Contoh |

425| :---------------------- | :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------- |425| :---------------------- | :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------- |

426| `skills` | string\|array | Direktori skill khusus yang berisi `<name>/SKILL.md` (menggantikan default `skills/`) | `"./custom/skills/"` |426| `skills` | string\|array | Direktori skill khusus yang berisi `<name>/SKILL.md` (selain default `skills/`) | `"./custom/skills/"` |

427| `commands` | string\|array | File skill `.md` datar atau direktori khusus (menggantikan default `commands/`) | `"./custom/cmd.md"` atau `["./cmd1.md"]` |427| `commands` | string\|array | File skill `.md` datar atau direktori khusus (menggantikan default `commands/`) | `"./custom/cmd.md"` atau `["./cmd1.md"]` |

428| `agents` | string\|array | File agent khusus (menggantikan default `agents/`) | `"./custom/agents/reviewer.md"` |428| `agents` | string\|array | File agent khusus (menggantikan default `agents/`) | `"./custom/agents/reviewer.md"` |

429| `hooks` | string\|array\|object | Jalur konfigurasi hook atau konfigurasi inline | `"./my-extra-hooks.json"` |429| `hooks` | string\|array\|object | Jalur konfigurasi hook atau konfigurasi inline | `"./my-extra-hooks.json"` |


510 510 

511### Aturan perilaku jalur511### Aturan perilaku jalur

512 512 

513Untuk `skills`, `commands`, `agents`, `outputStyles`, `experimental.themes`, dan `experimental.monitors`, jalur khusus menggantikan default. Jika manifest menentukan `skills`, direktori default `skills/` tidak dipindai; jika menentukan `experimental.monitors`, default `monitors/monitors.json` tidak dimuat. [Hooks](#hooks), [MCP servers](#mcp-servers), dan [LSP servers](#lsp-servers) memiliki semantik berbeda untuk menangani beberapa sumber.513Apakah jalur khusus menggantikan atau memperluas direktori default plugin tergantung pada field:

514 

515* **Menggantikan default**: `commands`, `agents`, `outputStyles`, `experimental.themes`, `experimental.monitors`. Misalnya, saat manifest menentukan `commands`, direktori default `commands/` tidak dipindai. Untuk menyimpan default dan menambahkan lebih banyak, sertakan secara eksplisit: `"commands": ["./commands/", "./extras/"]`

516* **Menambah default**: `skills`. Direktori default `skills/` selalu dipindai, dan direktori yang tercantum di `skills` dimuat bersama dengannya

517* **Aturan penggabungan sendiri**: [hooks](#hooks), [MCP servers](#mcp-servers), dan [LSP servers](#lsp-servers). Lihat setiap bagian untuk cara beberapa sumber digabungkan

518 

519Untuk semua field jalur:

514 520 

515* Semua jalur harus relatif terhadap root plugin dan dimulai dengan `./`521* Semua jalur harus relatif terhadap root plugin dan dimulai dengan `./`

516* Komponen dari jalur khusus menggunakan aturan penamaan dan namespacing yang sama522* Komponen dari jalur khusus menggunakan aturan penamaan dan namespacing yang sama

517* Beberapa jalur dapat ditentukan sebagai array523* Beberapa jalur dapat ditentukan sebagai array

518* Untuk menyimpan direktori default dan menambahkan lebih banyak jalur untuk skills, commands, agents, atau output styles, sertakan default dalam array Anda: `"skills": ["./skills/", "./extras/"]`524* Saat jalur skill menunjuk ke direktori yang berisi `SKILL.md` secara langsung, misalnya `"skills": ["./"]` menunjuk ke root plugin, field frontmatter `name` di `SKILL.md` menentukan nama invokasi skill. Ini memberikan nama stabil terlepas dari direktori instalasi. Jika `name` tidak diatur di frontmatter, basename direktori digunakan sebagai fallback.

519* Ketika jalur skill menunjuk ke direktori yang berisi `SKILL.md` secara langsung, misalnya `"skills": ["./"]` menunjuk ke root plugin, field frontmatter `name` di `SKILL.md` menentukan nama invokasi skill. Ini memberikan nama stabil terlepas dari direktori instalasi. Jika `name` tidak diatur di frontmatter, basename direktori digunakan sebagai fallback.

520 525 

521**Contoh jalur**:526**Contoh jalur**:

522 527 

routines.md +8 −0

Details

22 22 

23Rutinitas tersedia pada paket Pro, Max, Team, dan Enterprise dengan [Claude Code di web](/id/claude-code-on-the-web) diaktifkan. Buat dan kelola di [claude.ai/code/routines](https://claude.ai/code/routines), atau dari CLI dengan `/schedule`.23Rutinitas tersedia pada paket Pro, Max, Team, dan Enterprise dengan [Claude Code di web](/id/claude-code-on-the-web) diaktifkan. Buat dan kelola di [claude.ai/code/routines](https://claude.ai/code/routines), atau dari CLI dengan `/schedule`.

24 24 

25Admin Team dan Enterprise dapat menonaktifkan rutinitas untuk semua anggota dengan toggle Routines di [claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code). Ketika dinonaktifkan, rutinitas yang ada berhenti berjalan dan anggota tidak dapat membuat yang baru.

26 

25Halaman ini mencakup pembuatan rutinitas, mengonfigurasi setiap jenis pemicu, mengelola jalankan, dan bagaimana batas penggunaan berlaku.27Halaman ini mencakup pembuatan rutinitas, mengonfigurasi setiap jenis pemicu, mengelola jalankan, dan bagaimana batas penggunaan berlaku.

26 28 

27## Contoh kasus penggunaan29## Contoh kasus penggunaan


360 362 

361Jalankan sekali saja tidak dihitung terhadap batas jalankan rutinitas harian. Mereka mengurangi penggunaan langganan reguler Anda seperti sesi lainnya, tetapi mereka dikecualikan dari tunjangan jalankan rutinitas harian per akun.363Jalankan sekali saja tidak dihitung terhadap batas jalankan rutinitas harian. Mereka mengurangi penggunaan langganan reguler Anda seperti sesi lainnya, tetapi mereka dikecualikan dari tunjangan jalankan rutinitas harian per akun.

362 364 

365## Pemecahan masalah

366 

367### "Rutinitas dinonaktifkan oleh kebijakan organisasi Anda"

368 

369Admin Team atau Enterprise Anda mungkin telah mematikan toggle **Routines** di [claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code). Ini adalah pengaturan organisasi sisi server, jadi tidak dapat ditimpa dari konfigurasi lokal Anda. Hubungi admin Anda untuk meminta agar rutinitas diaktifkan untuk organisasi Anda.

370 

363## Sumber daya terkait371## Sumber daya terkait

364 372 

365* [`/loop` and in-session scheduling](/id/scheduled-tasks): jadwalkan tugas lokal dalam sesi CLI terbuka373* [`/loop` and in-session scheduling](/id/scheduled-tasks): jadwalkan tugas lokal dalam sesi CLI terbuka

security.md +1 −1

Details

59* **Persetujuan permintaan jaringan**: Alat yang membuat permintaan jaringan memerlukan persetujuan pengguna secara default59* **Persetujuan permintaan jaringan**: Alat yang membuat permintaan jaringan memerlukan persetujuan pengguna secara default

60* **Jendela konteks terisolasi**: Web fetch menggunakan jendela konteks terpisah untuk menghindari injeksi prompt yang berpotensi berbahaya60* **Jendela konteks terisolasi**: Web fetch menggunakan jendela konteks terpisah untuk menghindari injeksi prompt yang berpotensi berbahaya

61* **Verifikasi kepercayaan**: Jalankan codebase pertama kali dan server MCP baru memerlukan verifikasi kepercayaan61* **Verifikasi kepercayaan**: Jalankan codebase pertama kali dan server MCP baru memerlukan verifikasi kepercayaan

62 * Catatan: Verifikasi kepercayaan dinonaktifkan saat menjalankan secara non-interaktif dengan flag `-p`62 * Catatan: Verifikasi kepercayaan dinonaktifkan saat menjalankan secara non-interaktif dengan flag `-p`. Pengecualiannya adalah [`--worktree`](/id/worktrees), yang masih memerlukan kepercayaan telah diterima untuk direktori

63* **Deteksi command injection**: Perintah bash yang mencurigakan memerlukan persetujuan manual bahkan jika sebelumnya allowlisted63* **Deteksi command injection**: Perintah bash yang mencurigakan memerlukan persetujuan manual bahkan jika sebelumnya allowlisted

64* **Pencocokan fail-closed**: Perintah yang tidak cocok secara default memerlukan persetujuan manual64* **Pencocokan fail-closed**: Perintah yang tidak cocok secara default memerlukan persetujuan manual

65* **Deskripsi bahasa alami**: Perintah bash kompleks menyertakan penjelasan untuk pemahaman pengguna65* **Deskripsi bahasa alami**: Perintah bash kompleks menyertakan penjelasan untuk pemahaman pengguna

Details

41 </Step>41 </Step>

42 42 

43 <Step title="Tentukan pengaturan Anda">43 <Step title="Tentukan pengaturan Anda">

44 Tambahkan konfigurasi Anda sebagai JSON. Semua [pengaturan yang tersedia di `settings.json`](/id/settings#available-settings) didukung, termasuk [hooks](/id/hooks), [variabel lingkungan](/id/env-vars), dan [pengaturan yang hanya dikelola](/id/permissions#managed-only-settings) seperti `allowManagedPermissionRulesOnly`.44 Tambahkan konfigurasi Anda sebagai JSON. Semua [pengaturan yang tersedia di `settings.json`](/id/settings#available-settings) didukung kecuali yang dibatasi untuk pengiriman kebijakan tingkat OS; lihat [Batasan saat ini](#current-limitations) untuk daftar singkat itu. Ini mencakup [hooks](/id/hooks), [variabel lingkungan](/id/env-vars), dan [pengaturan yang hanya dikelola](/id/permissions#managed-only-settings) seperti `allowManagedPermissionRulesOnly`.

45 45 

46 Contoh ini memberlakukan daftar penolakan izin, mencegah pengguna dari melewati izin, dan membatasi aturan izin hanya pada yang ditentukan dalam pengaturan terkelola:46 Contoh ini memberlakukan daftar penolakan izin, mencegah pengguna dari melewati izin, dan membatasi aturan izin hanya pada yang ditentukan dalam pengaturan terkelola:

47 47 


93 }93 }

94 ```94 ```

95 95 

96 Karena hooks menjalankan perintah shell, pengguna melihat [dialog persetujuan keamanan](#security-approval-dialogs) sebelum diterapkan. Lihat [Konfigurasi mode otomatis](/id/auto-mode-config) untuk cara entri `autoMode` mempengaruhi apa yang diblokir pengklasifikasi dan peringatan penting tentang bidang `allow` dan `soft_deny`.96 Karena hooks menjalankan perintah shell, pengguna melihat [dialog persetujuan keamanan](#security-approval-dialogs) sebelum diterapkan. Lihat [Konfigurasi mode otomatis](/id/auto-mode-config) untuk cara entri `autoMode` mempengaruhi apa yang diblokir pengklasifikasi dan peringatan penting tentang bidang `environment`, `allow`, `soft_deny`, dan `hard_deny`.

97 </Step>97 </Step>

98 98 

99 <Step title="Simpan dan terapkan">99 <Step title="Simpan dan terapkan">


124 124 

125* Pengaturan berlaku secara seragam untuk semua pengguna dalam organisasi. Konfigurasi per-grup belum didukung.125* Pengaturan berlaku secara seragam untuk semua pengguna dalam organisasi. Konfigurasi per-grup belum didukung.

126* [Konfigurasi server MCP](/id/mcp#managed-mcp-configuration) tidak dapat didistribusikan melalui pengaturan yang dikelola server.126* [Konfigurasi server MCP](/id/mcp#managed-mcp-configuration) tidak dapat didistribusikan melalui pengaturan yang dikelola server.

127* Pengaturan yang dibatasi untuk sumber kebijakan tingkat OS, seperti `policyHelper` dan `wslInheritsWindowsSettings`, tidak dihormati. Terapkan melalui MDM atau file `managed-settings.json` sistem sebagai gantinya.

127 128 

128## Pengiriman pengaturan129## Pengiriman pengaturan

129 130 

settings.md +29 −2

Details

169| `attribution` | Sesuaikan atribusi untuk komit git dan pull request. Lihat [Pengaturan atribusi](#attribution-settings) | `{"commit": "🤖 Generated with Claude Code", "pr": ""}` |169| `attribution` | Sesuaikan atribusi untuk komit git dan pull request. Lihat [Pengaturan atribusi](#attribution-settings) | `{"commit": "🤖 Generated with Claude Code", "pr": ""}` |

170| `autoMemoryDirectory` | Direktori khusus untuk penyimpanan [memori otomatis](/id/memory#storage-location). Menerima jalur absolut atau jalur dengan awalan `~/`. Diterima dari kebijakan dan pengaturan pengguna, dan dari flag `--settings`. Tidak diterima dari pengaturan proyek atau lokal, karena repositori yang diklon dapat menyediakan file apa pun untuk mengalihkan penulisan memori ke lokasi sensitif | `"~/my-memory-dir"` |170| `autoMemoryDirectory` | Direktori khusus untuk penyimpanan [memori otomatis](/id/memory#storage-location). Menerima jalur absolut atau jalur dengan awalan `~/`. Diterima dari kebijakan dan pengaturan pengguna, dan dari flag `--settings`. Tidak diterima dari pengaturan proyek atau lokal, karena repositori yang diklon dapat menyediakan file apa pun untuk mengalihkan penulisan memori ke lokasi sensitif | `"~/my-memory-dir"` |

171| `autoMemoryEnabled` | Aktifkan [memori otomatis](/id/memory#enable-or-disable-auto-memory). Saat `false`, Claude tidak membaca dari atau menulis ke direktori memori otomatis. Default: `true`. Anda juga dapat mengalihkan ini dengan `/memory` selama sesi. Untuk menonaktifkan melalui variabel lingkungan, atur [`CLAUDE_CODE_DISABLE_AUTO_MEMORY`](/id/env-vars) dalam `env` | `false` |171| `autoMemoryEnabled` | Aktifkan [memori otomatis](/id/memory#enable-or-disable-auto-memory). Saat `false`, Claude tidak membaca dari atau menulis ke direktori memori otomatis. Default: `true`. Anda juga dapat mengalihkan ini dengan `/memory` selama sesi. Untuk menonaktifkan melalui variabel lingkungan, atur [`CLAUDE_CODE_DISABLE_AUTO_MEMORY`](/id/env-vars) dalam `env` | `false` |

172| `autoMode` | Sesuaikan apa yang diblokir dan diizinkan oleh pengklasifikasi [mode otomatis](/id/permission-modes#eliminate-prompts-with-auto-mode). Berisi array aturan prosa `environment`, `allow`, dan `soft_deny`. Sertakan string literal `"$defaults"` dalam array untuk mewarisi aturan bawaan pada posisi tersebut. Lihat [Konfigurasikan mode otomatis](/id/auto-mode-config). Tidak dibaca dari pengaturan proyek bersama | `{"soft_deny": ["$defaults", "Never run terraform apply"]}` |172| `autoMode` | Sesuaikan apa yang diblokir dan diizinkan oleh pengklasifikasi [mode otomatis](/id/permission-modes#eliminate-prompts-with-auto-mode). Berisi array aturan prosa `environment`, `allow`, `soft_deny`, dan `hard_deny`. Sertakan string literal `"$defaults"` dalam array untuk mewarisi aturan bawaan pada posisi tersebut. Lihat [Konfigurasikan mode otomatis](/id/auto-mode-config). Tidak dibaca dari pengaturan proyek bersama | `{"soft_deny": ["$defaults", "Never run terraform apply"]}` |

173| `autoScrollEnabled` | Dalam [rendering fullscreen](/id/fullscreen), ikuti output baru ke bagian bawah percakapan. Default: `true`. Muncul di `/config` sebagai **Auto-scroll**. Prompt izin masih bergulir ke tampilan saat ini dimatikan | `false` |173| `autoScrollEnabled` | Dalam [rendering fullscreen](/id/fullscreen), ikuti output baru ke bagian bawah percakapan. Default: `true`. Muncul di `/config` sebagai **Auto-scroll**. Prompt izin masih bergulir ke tampilan saat ini dimatikan | `false` |

174| `autoUpdatesChannel` | Saluran rilis untuk diikuti untuk pembaruan. Gunakan `"stable"` untuk versi yang biasanya sekitar satu minggu lama dan melewati versi dengan regresi besar, atau `"latest"` (default) untuk rilis terbaru. Untuk menonaktifkan auto-updates sepenuhnya, atur [`DISABLE_AUTOUPDATER`](/id/setup#disable-auto-updates) dalam `env` | `"stable"` |174| `autoUpdatesChannel` | Saluran rilis untuk diikuti untuk pembaruan. Gunakan `"stable"` untuk versi yang biasanya sekitar satu minggu lama dan melewati versi dengan regresi besar, atau `"latest"` (default) untuk rilis terbaru. Untuk menonaktifkan auto-updates sepenuhnya, atur [`DISABLE_AUTOUPDATER`](/id/setup#disable-auto-updates) dalam `env` | `"stable"` |

175| `availableModels` | Batasi model mana yang dapat dipilih pengguna melalui `/model`, `--model`, atau `ANTHROPIC_MODEL`. Tidak mempengaruhi opsi Default. Lihat [Batasi pemilihan model](/id/model-config#restrict-model-selection) | `["sonnet", "haiku"]` |175| `availableModels` | Batasi model mana yang dapat dipilih pengguna melalui `/model`, `--model`, atau `ANTHROPIC_MODEL`. Tidak mempengaruhi opsi Default. Lihat [Batasi pemilihan model](/id/model-config#restrict-model-selection) | `["sonnet", "haiku"]` |


202| `forceRemoteSettingsRefresh` | (Pengaturan yang dikelola saja) Blokir startup CLI sampai pengaturan yang dikelola jarak jauh segar diambil dari server. Jika pengambilan gagal, CLI keluar daripada melanjutkan dengan pengaturan yang di-cache atau tidak ada. Saat tidak diatur, startup berlanjut tanpa menunggu pengaturan jarak jauh. Lihat [penegakan fail-closed](/id/server-managed-settings#enforce-fail-closed-startup) | `true` |202| `forceRemoteSettingsRefresh` | (Pengaturan yang dikelola saja) Blokir startup CLI sampai pengaturan yang dikelola jarak jauh segar diambil dari server. Jika pengambilan gagal, CLI keluar daripada melanjutkan dengan pengaturan yang di-cache atau tidak ada. Saat tidak diatur, startup berlanjut tanpa menunggu pengaturan jarak jauh. Lihat [penegakan fail-closed](/id/server-managed-settings#enforce-fail-closed-startup) | `true` |

203| `gcpAuthRefresh` | Skrip khusus yang menyegarkan GCP Application Default Credentials saat kedaluwarsa atau tidak dapat dimuat. Lihat [konfigurasi kredensial lanjutan](/id/google-vertex-ai#advanced-credential-configuration) | `gcloud auth application-default login` |203| `gcpAuthRefresh` | Skrip khusus yang menyegarkan GCP Application Default Credentials saat kedaluwarsa atau tidak dapat dimuat. Lihat [konfigurasi kredensial lanjutan](/id/google-vertex-ai#advanced-credential-configuration) | `gcloud auth application-default login` |

204| `hooks` | Konfigurasikan perintah khusus untuk dijalankan pada acara siklus hidup. Lihat [dokumentasi hooks](/id/hooks) untuk format | Lihat [hooks](/id/hooks) |204| `hooks` | Konfigurasikan perintah khusus untuk dijalankan pada acara siklus hidup. Lihat [dokumentasi hooks](/id/hooks) untuk format | Lihat [hooks](/id/hooks) |

205| `httpHookAllowedEnvVars` | Daftar putih nama variabel lingkungan yang dapat diinterpolasi oleh HTTP hooks ke dalam header. Saat diatur, `allowedEnvVars` efektif setiap hook adalah persimpangan dengan daftar ini. Tidak terdefinisi = tidak ada pembatasan. Array digabungkan di seluruh sumber pengaturan. Lihat [Konfigurasi Hook](#hook-configuration) | `["MY_TOKEN", "HOOK_SECRET"]` |205| `httpHookAllowedEnvVars` | Daftar putih nama variabel lingkungan yang dapat diinterpolasi oleh HTTP hooks ke dalam header. Saat diatur, `allowedEnvVars` efektif setiap hook adalah persimpangan dari daftar sendiri dan pengaturan ini. Tidak terdefinisi = tidak ada pembatasan. Array digabungkan di seluruh sumber pengaturan. Lihat [Konfigurasi Hook](#hook-configuration) | `["MY_TOKEN", "HOOK_SECRET"]` |

206| `includeCoAuthoredBy` | **Usang**: Gunakan `attribution` sebagai gantinya. Apakah akan menyertakan baris `co-authored-by Claude` dalam komit git dan pull request (default: `true`) | `false` |206| `includeCoAuthoredBy` | **Usang**: Gunakan `attribution` sebagai gantinya. Apakah akan menyertakan baris `co-authored-by Claude` dalam komit git dan pull request (default: `true`) | `false` |

207| `includeGitInstructions` | Sertakan instruksi alur kerja komit dan PR bawaan dan snapshot status git dalam prompt sistem Claude (default: `true`). Atur ke `false` untuk menghapus keduanya, misalnya saat menggunakan skills alur kerja git Anda sendiri. Variabel lingkungan `CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS` memiliki prioritas atas pengaturan ini saat diatur | `false` |207| `includeGitInstructions` | Sertakan instruksi alur kerja komit dan PR bawaan dan snapshot status git dalam prompt sistem Claude (default: `true`). Atur ke `false` untuk menghapus keduanya, misalnya saat menggunakan skills alur kerja git Anda sendiri. Variabel lingkungan `CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS` memiliki prioritas atas pengaturan ini saat diatur | `false` |

208| `language` | Konfigurasikan bahasa respons pilihan Claude (misalnya, `"japanese"`, `"spanish"`, `"french"`). Claude akan merespons dalam bahasa ini secara default. Juga menetapkan bahasa [voice dictation](/id/voice-dictation#change-the-dictation-language) | `"japanese"` |208| `language` | Konfigurasikan bahasa respons pilihan Claude (misalnya, `"japanese"`, `"spanish"`, `"french"`). Claude akan merespons dalam bahasa ini secara default. Juga menetapkan bahasa [voice dictation](/id/voice-dictation#change-the-dictation-language) | `"japanese"` |


215| `permissions` | Lihat tabel di bawah untuk struktur izin. | |215| `permissions` | Lihat tabel di bawah untuk struktur izin. | |

216| `plansDirectory` | Sesuaikan di mana file rencana disimpan. Jalur relatif terhadap akar proyek. Default: `~/.claude/plans` | `"./plans"` |216| `plansDirectory` | Sesuaikan di mana file rencana disimpan. Jalur relatif terhadap akar proyek. Default: `~/.claude/plans` | `"./plans"` |

217| `pluginTrustMessage` | (Pengaturan yang dikelola saja) Pesan khusus ditambahkan ke peringatan kepercayaan plugin yang ditampilkan sebelum instalasi. Gunakan ini untuk menambahkan konteks spesifik organisasi, misalnya untuk mengonfirmasi bahwa plugin dari marketplace internal Anda telah disaring. | `"All plugins from our marketplace are approved by IT"` |217| `pluginTrustMessage` | (Pengaturan yang dikelola saja) Pesan khusus ditambahkan ke peringatan kepercayaan plugin yang ditampilkan sebelum instalasi. Gunakan ini untuk menambahkan konteks spesifik organisasi, misalnya untuk mengonfirmasi bahwa plugin dari marketplace internal Anda telah disaring. | `"All plugins from our marketplace are approved by IT"` |

218| `policyHelper` | {/* min-version: 2.1.136 */}Admin-deployed executable yang menghitung pengaturan yang dikelola secara dinamis saat startup. Hanya dihormati dari MDM atau file `managed-settings.json` sistem. Lihat [Hitung pengaturan yang dikelola dengan policy helper](#compute-managed-settings-with-a-policy-helper). Memerlukan Claude Code v2.1.136 atau lebih baru | `{"path": "/usr/local/bin/claude-policy"}` |

218| `preferredNotifChannel` | Metode untuk notifikasi task-complete dan permission-prompt: `"auto"`, `"terminal_bell"`, `"iterm2"`, `"iterm2_with_bell"`, `"kitty"`, `"ghostty"`, atau `"notifications_disabled"`. Default: `"auto"`, yang mengirim notifikasi desktop di iTerm2, Ghostty, dan Kitty dan tidak melakukan apa pun di terminal lain. Atur `"terminal_bell"` untuk membunyikan karakter bell di terminal apa pun. Muncul di `/config` sebagai **Notifications**. Lihat [Dapatkan terminal bell atau notifikasi](/id/terminal-config#get-a-terminal-bell-or-notification) | `"terminal_bell"` |219| `preferredNotifChannel` | Metode untuk notifikasi task-complete dan permission-prompt: `"auto"`, `"terminal_bell"`, `"iterm2"`, `"iterm2_with_bell"`, `"kitty"`, `"ghostty"`, atau `"notifications_disabled"`. Default: `"auto"`, yang mengirim notifikasi desktop di iTerm2, Ghostty, dan Kitty dan tidak melakukan apa pun di terminal lain. Atur `"terminal_bell"` untuk membunyikan karakter bell di terminal apa pun. Muncul di `/config` sebagai **Notifications**. Lihat [Dapatkan terminal bell atau notifikasi](/id/terminal-config#get-a-terminal-bell-or-notification) | `"terminal_bell"` |

219| `prefersReducedMotion` | Kurangi atau nonaktifkan animasi UI (spinners, shimmer, efek flash) untuk aksesibilitas | `true` |220| `prefersReducedMotion` | Kurangi atau nonaktifkan animasi UI (spinners, shimmer, efek flash) untuk aksesibilitas | `true` |

220| `prUrlTemplate` | Template URL untuk lencana PR yang ditampilkan di footer dan dalam ringkasan hasil tool. Mengganti `{host}`, `{owner}`, `{repo}`, `{number}`, dan `{url}` dari URL PR yang dilaporkan `gh`. Gunakan untuk mengarahkan tautan PR ke alat review kode internal daripada `github.com`. Tidak mempengaruhi autolinks `#123` dalam prosa Claude | `"https://reviews.example.com/{owner}/{repo}/pull/{number}"` |221| `prUrlTemplate` | Template URL untuk lencana PR yang ditampilkan di footer dan dalam ringkasan hasil tool. Mengganti `{host}`, `{owner}`, `{repo}`, `{number}`, dan `{url}` dari URL PR yang dilaporkan `gh`. Gunakan untuk mengarahkan tautan PR ke alat review kode internal daripada `github.com`. Tidak mempengaruhi autolinks `#123` dalam prosa Claude | `"https://reviews.example.com/{owner}/{repo}/pull/{number}"` |


470}471}

471```472```

472 473 

474### Hitung pengaturan yang dikelola dengan policy helper

475 

476Pengaturan `policyHelper` menunjuk ke executable yang menghitung pengaturan yang dikelola saat startup, sehingga admin dapat menurunkan kebijakan dari postur perangkat, identitas, atau layanan jarak jauh daripada file statis. Konfigurasikan dari MDM atau file `managed-settings.json` sistem. Claude Code mengabaikan `policyHelper` saat muncul dalam cakupan apa pun, termasuk pengaturan pengguna, pengaturan proyek, hive registry HKCU, dan [pengaturan yang dikelola server](/id/server-managed-settings).

477 

478Pengaturan menerima kunci ini:

479 

480| Kunci | Tipe | Deskripsi |

481| ------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------- |

482| `path` | string | Jalur absolut ke executable helper |

483| `timeoutMs` | number | Berapa lama menunggu helper sebelum memperlakukan run sebagai gagal |

484| `refreshIntervalMs` | number | Seberapa sering menjalankan kembali helper di latar belakang. Atur ke `0` untuk menonaktifkan refresh, atau ke setidaknya `60000` |

485 

486Helper menulis amplop JSON ke stdout. Letakkan pengaturan di bawah kunci `managedSettings` daripada di tingkat atas, karena objek pengaturan telanjang diuraikan dengan `managedSettings` tidak terdefinisi dan menerapkan tidak ada:

487 

488```json theme={null}

489{

490 "managedSettings": {

491 "permissions": { "deny": ["Read(//etc/secrets/**)"] }

492 },

493 "claudeMd": "# Organization context\n...",

494 "appendSystemPrompt": "Always cite the internal style guide."

495}

496```

497 

498Saat helper memancarkan `managedSettings`, objek itu menggantikan pengaturan yang dikelola berbasis file untuk run. Saat helper keluar non-zero saat startup, Claude Code mencetak kesalahan dan menolak untuk memulai, jadi helper yang memerlukan ketahanan pemadaman harus melayani dari cache sendiri dan keluar `0`.

499 

473### Prioritas pengaturan500### Prioritas pengaturan

474 501 

475Pengaturan berlaku dalam urutan prioritas. Dari tertinggi ke terendah:502Pengaturan berlaku dalam urutan prioritas. Dari tertinggi ke terendah:

whats-new.md +17 −1

Details

8 8 

9Ringkasan dev mingguan menyoroti fitur yang paling mungkin mengubah cara Anda bekerja. Setiap entri mencakup kode yang dapat dijalankan, demo singkat, dan tautan ke dokumentasi lengkap. Untuk setiap perbaikan bug dan peningkatan kecil, lihat [changelog](/id/changelog).9Ringkasan dev mingguan menyoroti fitur yang paling mungkin mengubah cara Anda bekerja. Setiap entri mencakup kode yang dapat dijalankan, demo singkat, dan tautan ke dokumentasi lengkap. Untuk setiap perbaikan bug dan peningkatan kecil, lihat [changelog](/id/changelog).

10 10 

11<Update label="Week 19" description="May 4–8, 2026" tags={["v2.1.128–v2.1.136"]}>

12 **Plugin dimuat dari arsip `.zip` dan URL**: `--plugin-dir` sekarang menerima file `.zip`, dan `--plugin-url` mengambil arsip plugin untuk sesi saat ini.

13 

14 Juga minggu ini: **`worktree.baseRef`** memilih apakah worktree baru bercabang dari default jarak jauh atau `HEAD` lokal; **aturan hard deny mode otomatis** memblokir tindakan tanpa syarat terlepas dari pengecualian izin; dan **hooks melihat tingkat upaya aktif** melalui `effort.level` dan `$CLAUDE_EFFORT`.

15 

16 [Baca ringkasan Week 19 →](/id/whats-new/2026-w19)

17</Update>

18 

19<Update label="Week 18" description="April 27 – May 1, 2026" tags={["v2.1.120–v2.1.126"]}>

20 **Windows tanpa Git Bash**: Git untuk Windows tidak lagi diperlukan, dan Claude Code menggunakan PowerShell sebagai alat shell ketika Bash tidak ada.

21 

22 Juga minggu ini: **`claude ultrareview`** membawa tinjauan kode cloud ke CI dan skrip; **`claude project purge`** membersihkan status lokal untuk proyek; dan menempel **URL PR ke `/resume`** menemukan sesi yang membuatnya.

23 

24 [Baca ringkasan Week 18 →](/id/whats-new/2026-w18)

25</Update>

26 

11<Update label="Week 17" description="April 20–24, 2026" tags={["v2.1.114–v2.1.119"]}>27<Update label="Week 17" description="April 20–24, 2026" tags={["v2.1.114–v2.1.119"]}>

12 **`/ultrareview`** dibuka sebagai pratinjau penelitian publik: armada agen pemburu bug berjalan di cloud dan temuan kembali ke CLI atau Desktop Anda secara otomatis.28 **`/ultrareview`** dibuka sebagai pratinjau penelitian publik: armada agen pemburu bug berjalan di cloud dan temuan kembali ke CLI atau Desktop Anda secara otomatis.

13 29 


19<Update label="Week 16" description="April 13–17, 2026" tags={["v2.1.105–v2.1.113"]}>35<Update label="Week 16" description="April 13–17, 2026" tags={["v2.1.105–v2.1.113"]}>

20 **Claude Opus 4.7** hadir sebagai default baru di Max dan Team Premium, dengan tingkat upaya `xhigh` baru yang merupakan pengaturan yang direkomendasikan untuk sebagian besar pekerjaan coding dan slider `/effort` interaktif untuk menyesuaikannya.36 **Claude Opus 4.7** hadir sebagai default baru di Max dan Team Premium, dengan tingkat upaya `xhigh` baru yang merupakan pengaturan yang direkomendasikan untuk sebagian besar pekerjaan coding dan slider `/effort` interaktif untuk menyesuaikannya.

21 37 

22 Juga minggu ini: **Routines** di Claude Code di web menjalankan agen cloud templated dari jadwal, acara GitHub, atau panggilan API; `/ultrareview` menjalankan tinjauan kode multi-agen paralel di cloud; `/usage` menunjukkan apa yang mendorong batas Anda; dan CLI bergerak ke biner asli.38 Juga minggu ini: **Routines** di Claude Code di web menjalankan agen cloud templated dari jadwal, acara GitHub, atau panggilan API; **notifikasi push mobile** mengirim ping ke ponsel Anda ketika tugas panjang selesai atau Claude membutuhkan Anda; `/usage` menunjukkan apa yang mendorong batas Anda; dan CLI bergerak ke biner asli.

23 39 

24 [Baca ringkasan Week 16 →](/id/whats-new/2026-w16)40 [Baca ringkasan Week 16 →](/id/whats-new/2026-w16)

25</Update>41</Update>

Details

4 4 

5# Minggu 16 · 13–17 April 20265# Minggu 16 · 13–17 April 2026

6 6 

7> Claude Opus 4.7 dengan tingkat upaya xhigh baru, Routines di Claude Code di web, /ultrareview tinjauan kode cloud, /usage breakdown yang menunjukkan apa yang mendorong batas Anda, dan binari asli menggantikan JavaScript yang dibundel.7> Claude Opus 4.7 dengan tingkat upaya xhigh baru, Routines di Claude Code di web, notifikasi push mobile yang mengirim ping ke ponsel Anda ketika Claude membutuhkan Anda, /usage breakdown yang menunjukkan apa yang mendorong batas Anda, dan binari asli menggantikan JavaScript yang dibundel.

8 8 

9<div className="digest-meta">9<div className="digest-meta">

10 <span>Rilis <a href="/docs/id/changelog#2-1-105">v2.1.105 → v2.1.113</a></span>10 <span>Rilis <a href="/docs/id/changelog#2-1-105">v2.1.105 → v2.1.113</a></span>


73 73 

74<div className="digest-feature">74<div className="digest-feature">

75 <div className="digest-feature-header">75 <div className="digest-feature-header">

76 <span className="digest-feature-title">/ultrareview</span>76 <span className="digest-feature-title">Notifikasi push mobile</span>

77 <span className="digest-feature-pill">v2.1.111</span>77 <span className="digest-feature-pill">mobile</span>

78 </div>78 </div>

79 79 

80 <p className="digest-feature-lede">Tinjauan kode komprehensif di cloud. Ultrareview menggandakan cabang Anda di seluruh peninjau paralel di Claude Code di web, menjalankan lintasan kritik adversarial atas setiap temuan, dan mengembalikan laporan temuan yang diverifikasi sementara terminal Anda tetap bebas. Panggilnya tanpa argumen untuk meninjau cabang saat ini Anda, atau teruskan nomor PR untuk mengambil dan meninjau PR itu. Dialog peluncuran sekarang menunjukkan diffstat sehingga Anda tahu apa yang akan naik sebelum Anda mengonfirmasi.</p>80 <p className="digest-feature-lede">Dengan <a href="/docs/id/remote-control">Remote Control</a> terhubung, Claude dapat mengirim notifikasi push ke ponsel Anda ketika tugas panjang selesai atau membutuhkan keputusan untuk melanjutkan. Aktifkan dengan "Push when Claude decides" di <code>/config</code>, atau minta satu di prompt Anda. Berguna ketika Anda memulai jalankan agen panjang dan ingin menjauh dari terminal.</p>

81 81 

82 <p className="digest-feature-try">Tinjau cabang yang Anda gunakan:</p>82 <Frame>

83 83 <video autoPlay muted loop playsInline className="w-full" src="https://mintcdn.com/claude-code/uII1TETOZxBUZ3lB/images/whats-new/push-notifications.mp4?fit=max&auto=format&n=uII1TETOZxBUZ3lB&q=85&s=c91a967139596500cbdb581a53822ac1" data-path="images/whats-new/push-notifications.mp4" />

84 ```text Claude Code theme={null}84 </Frame>

85 > /ultrareview

86 ```

87 85 

88 <p className="digest-feature-try">Atau arahkan ke PR:</p>86 <p className="digest-feature-try">Minta Claude untuk mengirim ping Anda ketika selesai:</p>

89 87 

90 ```text Claude Code theme={null}88 ```text Claude Code theme={null}

91 > /ultrareview 123489 > notify me when the tests pass

92 ```90 ```

93 91 

94 <a className="digest-feature-link" href="/docs/id/ultrareview">Panduan Ultrareview</a>92 <a className="digest-feature-link" href="/docs/id/remote-control#mobile-push-notifications">Remote Control: notifikasi push mobile</a>

95</div>93</div>

96 94 

97<div className="digest-feature">95<div className="digest-feature">


116 <p className="digest-wins-title">Kemenangan lainnya</p>114 <p className="digest-wins-title">Kemenangan lainnya</p>

117 115 

118 <div className="digest-wins-grid">116 <div className="digest-wins-grid">

117 <div><a href="/docs/id/ultrareview"><code>/ultrareview</code></a> baru: tinjauan kode komprehensif di cloud menggunakan analisis multi-agen paralel dan lintasan kritik adversarial. Jalankan tanpa argumen untuk meninjau cabang saat ini Anda, atau <code>/ultrareview \<PR#></code> untuk PR tertentu</div>

119 <div><a href="/docs/id/permission-modes#eliminate-prompts-with-auto-mode">Mode Auto</a> sekarang tersedia untuk pelanggan Max di Opus 4.7, dan flag <code>--enable-auto-mode</code> tidak lagi diperlukan</div>118 <div><a href="/docs/id/permission-modes#eliminate-prompts-with-auto-mode">Mode Auto</a> sekarang tersedia untuk pelanggan Max di Opus 4.7, dan flag <code>--enable-auto-mode</code> tidak lagi diperlukan</div>

120 <div><a href="/docs/id/interactive-mode#session-recap">Ringkasan sesi</a> menunjukkan ringkasan satu baris tentang apa yang terjadi saat Anda pergi; jalankan <code>/recap</code> sesuai permintaan atau matikan dari <code>/config</code></div>119 <div><a href="/docs/id/interactive-mode#session-recap">Ringkasan sesi</a> menunjukkan ringkasan satu baris tentang apa yang terjadi saat Anda pergi; jalankan <code>/recap</code> sesuai permintaan atau matikan dari <code>/config</code></div>

121 <div>Perintah <code>/tui</code> baru dan pengaturan <code>tui</code> beralih antara rendering klasik dan bebas flicker di tengah percakapan; tampilan fokus dipindahkan dari <code>Ctrl+O</code> ke perintah <code>/focus</code> tersendiri</div>120 <div>Perintah <code>/tui</code> baru dan pengaturan <code>tui</code> beralih antara rendering klasik dan bebas flicker di tengah percakapan; tampilan fokus dipindahkan dari <code>Ctrl+O</code> ke perintah <code>/focus</code> tersendiri</div>

122 <div>Alat notifikasi push: dengan <a href="/docs/id/remote-control">Remote Control</a> terhubung dan "Push when Claude decides" diaktifkan, Claude dapat mengirim ping ke ponsel Anda ketika membutuhkan Anda</div>

123 <div>Plugin dapat mengirimkan pengamat latar belakang melalui kunci manifes tingkat atas <code>monitors</code> yang auto-arms saat memulai sesi atau saat invoke skill</div>121 <div>Plugin dapat mengirimkan pengamat latar belakang melalui kunci manifes tingkat atas <code>monitors</code> yang auto-arms saat memulai sesi atau saat invoke skill</div>

124 <div>Opsi "Auto (match terminal)" di <code>/theme</code> mengikuti mode gelap/terang terminal Anda</div>122 <div>Opsi "Auto (match terminal)" di <code>/theme</code> mengikuti mode gelap/terang terminal Anda</div>

125 <div><code>/fewer-permission-prompts</code> memindai transkrip Anda untuk panggilan Bash dan MCP read-only umum dan mengusulkan allowlist untuk <code>.claude/settings.json</code></div>123 <div><code>/fewer-permission-prompts</code> memindai transkrip Anda untuk panggilan Bash dan MCP read-only umum dan mengusulkan allowlist untuk <code>.claude/settings.json</code></div>

whats-new/2026-w18.md +113 −0 created

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Minggu 18 · 27 April – 1 Mei, 2026

6 

7> Claude Code di Windows berjalan tanpa Git Bash, claude auth login menerima kode OAuth yang ditempel langsung, claude project purge membersihkan status lokal per proyek, dan menempel URL PR ke /resume menemukan sesi yang membuatnya.

8 

9<div className="digest-meta">

10 <span>Rilis <a href="/id/docs/changelog#2-1-120">v2.1.120 → v2.1.126</a></span>

11 <span>4 fitur · 27 April – 1 Mei</span>

12</div>

13 

14<div className="digest-feature">

15 <div className="digest-feature-header">

16 <span className="digest-feature-title">Masuk tanpa callback browser</span>

17 <span className="digest-feature-pill">v2.1.126</span>

18 </div>

19 

20 <p className="digest-feature-lede"><code>claude auth login</code> sekarang menerima kode OAuth yang ditempel langsung ke terminal ketika callback browser tidak dapat menjangkau localhost. Ini mencakup WSL2, sesi SSH, dan kontainer, di mana pengalihan ke port lokal tidak berfungsi. Rilis yang sama juga memperbaiki timeout login pada koneksi yang lambat atau di-proxy dan di devcontainer yang hanya IPv6.</p>

21 

22 <p className="digest-feature-try">Masuk, kemudian tempel kode dari browser:</p>

23 

24 ```bash theme={null}

25 claude auth login

26 ```

27 

28 <a className="digest-feature-link" href="/id/docs/cli-reference#cli-commands">Referensi CLI</a>

29</div>

30 

31<div className="digest-feature">

32 <div className="digest-feature-header">

33 <span className="digest-feature-title">claude project purge</span>

34 <span className="digest-feature-pill">v2.1.126</span>

35 </div>

36 

37 <p className="digest-feature-lede">Hapus semua status Claude Code untuk proyek: transkrip, tugas, riwayat file, dan entri konfigurasi proyek. Mendukung `--dry-run` untuk pratinjau, `-y`/`--yes` untuk melewati konfirmasi, `-i`/`--interactive` untuk memilih, dan `--all` untuk menghapus setiap proyek.</p>

38 

39 <p className="digest-feature-try">Pratinjau apa yang akan dihapus:</p>

40 

41 ```bash theme={null}

42 claude project purge --dry-run

43 ```

44 

45 <p className="digest-feature-try">Kemudian jalankan untuk nyata:</p>

46 

47 ```bash theme={null}

48 claude project purge

49 ```

50 

51 <a className="digest-feature-link" href="/id/docs/cli-reference">Referensi CLI</a>

52</div>

53 

54<div className="digest-feature">

55 <div className="digest-feature-header">

56 <span className="digest-feature-title">Lanjutkan dengan URL PR</span>

57 <span className="digest-feature-pill">v2.1.122</span>

58 </div>

59 

60 <p className="digest-feature-lede">Ketika Anda membuat pull request dengan <code>gh pr create</code>, Claude Code menautkannya ke sesi yang menghasilkannya. Sekarang Anda dapat kembali ke sesi itu hanya dari URL PR, tanpa perlu mengingat namanya.</p>

61 

62 <p className="digest-feature-try">Buka pemilih sesi:</p>

63 

64 ```text Claude Code theme={null}

65 > /resume

66 ```

67 

68 <p className="digest-feature-try">Tempel URL PR ke dalam pemilih. Karakter pertama dari tempel membawa Anda ke mode pencarian, dan daftar disaring ke sesi yang membuat PR itu. Tekan Enter untuk melanjutkannya. URL pull dan merge request GitHub, GitHub Enterprise, GitLab, dan Bitbucket semuanya berfungsi.</p>

69 

70 ```text Claude Code theme={null}

71 https://github.com/your-org/your-repo/pull/1234

72 ```

73 

74 <p className="digest-feature-try">Untuk melewati pemilih, teruskan nomor PR di baris perintah sebagai gantinya:</p>

75 

76 ```bash theme={null}

77 claude --from-pr 1234

78 ```

79 

80 <a className="digest-feature-link" href="/id/docs/sessions#use-the-session-picker">Sesi: gunakan pemilih sesi</a>

81</div>

82 

83<div className="digest-feature">

84 <div className="digest-feature-header">

85 <span className="digest-feature-title">Windows tanpa Git Bash</span>

86 <span className="digest-feature-pill">Windows</span>

87 </div>

88 

89 <p className="digest-feature-lede">Git untuk Windows tidak lagi diperlukan. Ketika Bash tidak ada, Claude Code menggunakan PowerShell sebagai alat shell, dan ketika alat PowerShell diaktifkan, itu diperlakukan sebagai shell utama. PowerShell 7 yang diinstal melalui Microsoft Store, MSI tanpa PATH, atau alat global <code>.NET</code> sekarang terdeteksi secara otomatis.</p>

90 

91 <a className="digest-feature-link" href="/id/docs/setup">Panduan penyiapan</a>

92</div>

93 

94<div className="digest-wins">

95 <p className="digest-wins-title">Kemenangan lainnya</p>

96 

97 <div className="digest-wins-grid">

98 <div>Server MCP dapat memilih keluar dari penundaan pencarian alat dengan <code>alwaysLoad: true</code> dalam konfigurasi mereka sehingga semua alat server itu selalu tersedia</div>

99 <div><code>claude plugin prune</code> baru menghapus dependensi plugin yang diinstal otomatis yang yatim piatu, dan <code>plugin uninstall --prune</code> berjenjang</div>

100 <div><code>/skills</code> sekarang memiliki kotak pencarian ketik-untuk-filter sehingga Anda dapat menemukan keterampilan dalam daftar panjang tanpa menggulir</div>

101 <div>Hook <code>PostToolUse</code> dapat mengganti output alat untuk alat apa pun melalui <code>hookSpecificOutput.updatedToolOutput</code>, bukan hanya alat MCP</div>

102 <div>Subperintah <a href="/id/docs/ultrareview"><code>claude ultrareview</code></a> baru menjalankan <code>/ultrareview</code> secara non-interaktif dari CI atau skrip: mencetak temuan ke stdout (<code>--json</code> untuk output mentah) dan keluar 0 saat selesai atau 1 saat gagal</div>

103 <div><code>--dangerously-skip-permissions</code> sekarang melewati prompt untuk penulisan ke <code>.claude/</code>, <code>.git/</code>, <code>.vscode/</code>, file konfigurasi shell, dan jalur yang dilindungi sebelumnya lainnya, sementara perintah penghapusan yang bencana masih meminta sebagai jaring keselamatan</div>

104 <div>Pemilih <code>/model</code> dapat mencantumkan model dari titik akhir <code>/v1/models</code> gateway Anda ketika <code>ANTHROPIC\_BASE\_URL</code> menunjuk ke gateway yang kompatibel dengan Anthropic; pilih dengan <code>CLAUDE\_CODE\_ENABLE\_GATEWAY\_MODEL\_DISCOVERY=1</code> sejak v2.1.129</div>

105 <div>Server MCP yang mengalami kesalahan sementara selama startup sekarang coba ulang otomatis hingga 3 kali alih-alih tetap terputus</div>

106 <div><code>ANTHROPIC\_BEDROCK\_SERVICE\_TIER</code> memilih tingkat layanan Bedrock: <code>default</code>, <code>flex</code>, atau <code>priority</code></div>

107 <div><code>/terminal-setup</code> mengaktifkan pengaturan akses clipboard iTerm2 sehingga <code>/copy</code> berfungsi, termasuk dari tmux</div>

108 <div>Vertex AI sekarang mendukung Workload Identity Federation berbasis sertifikat X.509 (mTLS ADC)</div>

109 <div>Perbaikan kebocoran memori yang signifikan: sesi yang kaya gambar, <code>/usage</code> pada riwayat transkrip besar, dan alat yang berjalan lama tanpa acara kemajuan</div>

110 </div>

111</div>

112 

113[Changelog lengkap untuk v2.1.120–v2.1.126 →](/id/changelog#2-1-120)

whats-new/2026-w19.md +60 −0 created

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Minggu 19 · 4–8 Mei 2026

6 

7> Muat plugin dari arsip .zip dan URL, cari riwayat perintah di seluruh proyek dengan Ctrl+R, cabang worktree baru dari HEAD lokal atau default jarak jauh, dan blokir tindakan tanpa syarat dengan aturan hard deny mode otomatis.

8 

9<div className="digest-meta">

10 <span>Rilis <a href="/id/changelog#2-1-128">v2.1.128 → v2.1.136</a></span>

11 <span>2 fitur · 4–8 Mei</span>

12</div>

13 

14<div className="digest-feature">

15 <div className="digest-feature-header">

16 <span className="digest-feature-title">Plugin dari arsip .zip dan URL</span>

17 </div>

18 

19 <p className="digest-feature-lede"><code>--plugin-dir</code> sekarang menerima arsip plugin <code>.zip</code> selain direktori, dan flag <code>--plugin-url</code> baru mengambil arsip plugin dari URL untuk sesi saat ini. Berguna untuk mencoba plugin sebelum menambahkannya ke marketplace, atau untuk mengirimkan plugin internal dari penyimpanan artefak.</p>

20 

21 <p className="digest-feature-try">Muat plugin langsung dari URL:</p>

22 

23 ```bash terminal theme={null}

24 claude --plugin-url https://example.com/my-plugin.zip

25 ```

26 

27 <a className="digest-feature-link" href="/id/plugins">Panduan Plugin</a>

28</div>

29 

30<div className="digest-feature">

31 <div className="digest-feature-header">

32 <span className="digest-feature-title">Pencarian riwayat di semua proyek Anda</span>

33 <span className="digest-feature-pill">v2.1.129</span>

34 </div>

35 

36 <p className="digest-feature-lede">Pencarian terbalik <code>Ctrl+R</code> sekarang secara default mencakup semua prompt di seluruh proyek, mengembalikan perilaku dari sebelum v2.1.124. Tekan <code>Ctrl+S</code> saat mencari untuk mempersempit kembali ke proyek atau sesi saat ini. Berguna ketika Anda mengingat perintah yang Anda jalankan di repo lain minggu lalu dan tidak ingin menggalinya.</p>

37 

38 <a className="digest-feature-link" href="/id/interactive-mode#command-history">Mode interaktif: riwayat perintah</a>

39</div>

40 

41<div className="digest-wins">

42 <p className="digest-wins-title">Kemenangan lainnya</p>

43 

44 <div className="digest-wins-grid">

45 <div>Pengaturan <code>worktree.baseRef</code> baru (<code>fresh</code> | <code>head</code>) mengontrol apakah <code>--worktree</code>, alat <code>EnterWorktree</code>, dan worktree isolasi agen bercabang dari cabang default jarak jauh atau <code>HEAD</code> lokal; default <code>fresh</code> menjaga komit yang belum didorong keluar dari worktree baru</div>

46 <div>Aturan <code>settings.autoMode.hard\_deny</code> baru memblokir tindakan yang cocok tanpa syarat dalam mode otomatis, terlepas dari pengecualian izin, untuk tindakan yang tidak boleh pernah berjalan secara otomatis bahkan ketika aturan izin yang lebih luas berlaku</div>

47 <div>Hook sekarang menerima tingkat upaya aktif melalui bidang input JSON <code>effort.level</code> dan variabel lingkungan <code>$CLAUDE_EFFORT</code>, dan perintah alat Bash dapat membaca <code>$CLAUDE\_EFFORT</code></div>

48 <div><code>CLAUDE\_CODE\_DISABLE\_ALTERNATE\_SCREEN=1</code> menolak renderer layar alternatif fullscreen dan menjaga percakapan dalam scrollback asli terminal</div>

49 <div><code>CLAUDE\_CODE\_PACKAGE\_MANAGER\_AUTO\_UPDATE</code> memungkinkan instalasi Homebrew atau WinGet menjalankan upgrade di latar belakang dan meminta untuk memulai ulang</div>

50 <div><code>CLAUDE\_CODE\_SESSION\_ID</code> sekarang ada di lingkungan subprocess alat Bash, cocok dengan <code>session\_id</code> yang diteruskan ke hook</div>

51 <div><code>/mcp</code> sekarang menampilkan jumlah alat untuk server yang terhubung dan menandai server yang terhubung dengan 0 alat</div>

52 <div><code>--channels</code> sekarang bekerja dengan autentikasi konsol (kunci API)</div>

53 <div>Subprocess seperti Bash, hook, MCP, dan LSP tidak lagi mewarisi variabel lingkungan <code>OTEL\_\*</code>, jadi aplikasi yang diinstrumentasi OTEL yang dijalankan melalui alat Bash tidak lagi mengambil endpoint OTLP CLI sendiri</div>

54 <div>Ringkasan kemajuan sub-agen sekarang mencapai cache prompt, mengurangi biaya token <code>cache\_creation</code> sekitar 3x</div>

55 <div>Beberapa perbaikan keandalan OAuth dan kredensial: sesi paralel tidak lagi buntu di 401 setelah perlombaan refresh-token, token refresh OAuth MCP tidak lagi hilang ketika beberapa server menyegarkan secara bersamaan, dan loop login langka dari penulisan kredensial bersamaan diperbaiki</div>

56 <div>Kunci admin <code>parentSettingsBehavior</code> baru memungkinkan admin untuk memilih SDK <code>managedSettings</code> ke dalam penggabungan kebijakan</div>

57 </div>

58</div>

59 

60[Changelog lengkap untuk v2.1.128–v2.1.136 →](/id/changelog#2-1-128)