238 lines
13 KiB
Plaintext
238 lines
13 KiB
Plaintext
---
|
|
title: สิทธิ์
|
|
description: ควบคุมการดำเนินการที่ต้องได้รับการอนุมัติจึงจะรันได้
|
|
---
|
|
|
|
OpenCode ใช้การกำหนดค่า `permission` เพื่อตัดสินใจว่าการดำเนินการที่กำหนดควรทำงานโดยอัตโนมัติ แจ้งให้คุณทราบ หรือถูกบล็อก
|
|
|
|
ตั้งแต่ `v1.1.1` การกำหนดค่าบูลีนแบบเดิม `tools` เลิกใช้แล้วและได้รวมเข้ากับ `permission` แล้ว การกำหนดค่า `tools` แบบเก่ายังคงรองรับความเข้ากันได้แบบย้อนหลัง
|
|
|
|
---
|
|
|
|
## การดำเนินการ
|
|
|
|
กฎการอนุญาตแต่ละข้อจะแก้ไขเป็นข้อใดข้อหนึ่งต่อไปนี้
|
|
|
|
- `"allow"` — ทำงานโดยไม่ได้รับการอนุมัติ
|
|
- `"ask"` — พร้อมท์สำหรับการอนุมัติ
|
|
- `"deny"` — บล็อกการกระทำ
|
|
|
|
---
|
|
|
|
## การกำหนดค่า
|
|
|
|
คุณสามารถตั้งค่าการอนุญาตทั่วโลก (ด้วย `*`) และแทนที่เครื่องมือเฉพาะ
|
|
|
|
```json title="opencode.json"
|
|
{
|
|
"$schema": "https://opencode.ai/config.json",
|
|
"permission": {
|
|
"*": "ask",
|
|
"bash": "allow",
|
|
"edit": "deny"
|
|
}
|
|
}
|
|
```
|
|
|
|
คุณยังสามารถตั้งค่าการอนุญาตทั้งหมดพร้อมกันได้:
|
|
|
|
```json title="opencode.json"
|
|
{
|
|
"$schema": "https://opencode.ai/config.json",
|
|
"permission": "allow"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## กฎแบบละเอียด (ไวยากรณ์ของวัตถุ)
|
|
|
|
สำหรับการอนุญาตส่วนใหญ่ คุณสามารถใช้ออบเจ็กต์เพื่อปรับใช้การดำเนินการต่างๆ ตามอินพุตของเครื่องมือได้
|
|
|
|
```json title="opencode.json"
|
|
{
|
|
"$schema": "https://opencode.ai/config.json",
|
|
"permission": {
|
|
"bash": {
|
|
"*": "ask",
|
|
"git *": "allow",
|
|
"npm *": "allow",
|
|
"rm *": "deny",
|
|
"grep *": "allow"
|
|
},
|
|
"edit": {
|
|
"*": "deny",
|
|
"packages/web/src/content/docs/*.mdx": "allow"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
กฎจะได้รับการประเมินโดยการจับคู่รูปแบบ โดย **กฎการจับคู่สุดท้ายจะชนะ** รูปแบบทั่วไปคือการใส่กฎ catch-all `"*"` ก่อน และใส่กฎที่เฉพาะเจาะจงมากขึ้นหลังจากนั้น
|
|
|
|
### สัญลักษณ์แทน
|
|
|
|
รูปแบบการอนุญาตใช้การจับคู่ไวด์การ์ดแบบง่าย:
|
|
|
|
- `*` จับคู่อักขระใดๆ ตั้งแต่ศูนย์ขึ้นไป
|
|
- `?` ตรงกับอักขระหนึ่งตัวเท่านั้น
|
|
- อักขระอื่นๆ ทั้งหมดตรงกันอย่างแท้จริง
|
|
|
|
### การขยายโฮมไดเร็กทอรี
|
|
|
|
คุณสามารถใช้ `~` หรือ `$HOME` ที่จุดเริ่มต้นของรูปแบบเพื่ออ้างอิงโฮมไดเร็กตอรี่ของคุณ สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับกฎของ [`external_directory`](#external-directories)
|
|
|
|
- `~/projects/*` -> `/Users/username/projects/*`
|
|
- `$HOME/projects/*` -> `/Users/username/projects/*`
|
|
- `~` -> `/Users/username`
|
|
|
|
### ไดเรกทอรีภายนอก
|
|
|
|
ใช้ `external_directory` เพื่ออนุญาตการเรียกใช้เครื่องมือที่สัมผัสเส้นทางนอกไดเร็กทอรีการทำงานที่ OpenCode เริ่มทำงาน สิ่งนี้ใช้ได้กับเครื่องมือใดๆ ที่ใช้เส้นทางเป็นอินพุต (เช่น `read`, `edit`, `list`, `glob`, `grep` และคำสั่ง `bash` จำนวนมาก)
|
|
|
|
การขยายบ้าน (เช่น `~/...`) ส่งผลต่อวิธีการเขียนรูปแบบเท่านั้น ไม่ได้ทำให้เส้นทางภายนอกเป็นส่วนหนึ่งของพื้นที่ทำงานปัจจุบัน ดังนั้นเส้นทางภายนอกไดเรกทอรีการทำงานยังต้องได้รับอนุญาตผ่าน `external_directory`
|
|
|
|
ตัวอย่างเช่น อนุญาตให้เข้าถึงทุกสิ่งภายใต้ `~/projects/personal/`:
|
|
|
|
```json title="opencode.json"
|
|
{
|
|
"$schema": "https://opencode.ai/config.json",
|
|
"permission": {
|
|
"external_directory": {
|
|
"~/projects/personal/**": "allow"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
ไดเร็กทอรีใดๆ ที่ได้รับอนุญาตที่นี่จะสืบทอดค่าเริ่มต้นเดียวกันกับพื้นที่ทำงานปัจจุบัน เนื่องจาก [`read` มีค่าเริ่มต้นเป็น `allow`](#defaults) การอ่านจึงได้รับอนุญาตสำหรับรายการภายใต้ `external_directory` เว้นแต่จะถูกแทนที่ เพิ่มกฎที่ชัดเจนเมื่อควรจำกัดเครื่องมือในเส้นทางเหล่านี้ เช่น การบล็อกการแก้ไขในขณะที่ยังคงอ่านอยู่:
|
|
|
|
```json title="opencode.json"
|
|
{
|
|
"$schema": "https://opencode.ai/config.json",
|
|
"permission": {
|
|
"external_directory": {
|
|
"~/projects/personal/**": "allow"
|
|
},
|
|
"edit": {
|
|
"~/projects/personal/**": "deny"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
ให้รายการมุ่งเน้นไปที่เส้นทางที่เชื่อถือได้ และเลเยอร์อนุญาตหรือปฏิเสธกฎเพิ่มเติมตามที่จำเป็นสำหรับเครื่องมืออื่นๆ (เช่น `bash`)
|
|
|
|
---
|
|
|
|
## สิทธิ์ที่มีอยู่
|
|
|
|
สิทธิ์ของ OpenCode จะกำหนดไว้ตามชื่อเครื่องมือ พร้อมด้วยเจ้าหน้าที่รักษาความปลอดภัยอีก 2-3 คน:
|
|
|
|
- `read` — อ่านไฟล์ (ตรงกับเส้นทางของไฟล์)
|
|
- `edit` — การแก้ไขไฟล์ทั้งหมด (ครอบคลุมถึง `edit`, `write`, `patch`, `multiedit`)
|
|
- `glob` — ไฟล์ globbing (ตรงกับรูปแบบ glob)
|
|
- `grep` — การค้นหาเนื้อหา (ตรงกับรูปแบบ regex)
|
|
- `list` — แสดงรายการไฟล์ในไดเร็กทอรี (ตรงกับเส้นทางไดเร็กทอรี)
|
|
- `bash` — การรันคำสั่งเชลล์ (ตรงกับคำสั่งที่แยกวิเคราะห์เช่น `git status --porcelain`)
|
|
- `task` — การเปิดตัวตัวแทนย่อย (ตรงกับประเภทตัวแทนย่อย)
|
|
- `skill` — กำลังโหลดทักษะ (ตรงกับชื่อทักษะ)
|
|
- `lsp` — กำลังเรียกใช้คำสั่ง LSP (ปัจจุบันยังไม่ละเอียด)
|
|
- `todoread`, `todowrite` — กำลังอ่าน/updating รายการสิ่งที่ต้องทำ
|
|
- `webfetch` — กำลังดึง URL (ตรงกับ URL)
|
|
- `websearch`, `codesearch` — การค้นหาเว็บ/code (ตรงกับข้อความค้นหา)
|
|
- `external_directory` — ทริกเกอร์เมื่อเครื่องมือแตะเส้นทางนอกไดเร็กทอรีการทำงานของโปรเจ็กต์
|
|
- `doom_loop` — ทริกเกอร์เมื่อมีการเรียกใช้เครื่องมือเดียวกันซ้ำ 3 ครั้งโดยมีอินพุตเหมือนกัน
|
|
|
|
---
|
|
|
|
## ค่าเริ่มต้น
|
|
|
|
หากคุณไม่ได้ระบุสิ่งใด OpenCode จะเริ่มต้นจากค่าเริ่มต้นที่อนุญาต:
|
|
|
|
- การอนุญาตส่วนใหญ่มีค่าเริ่มต้นเป็น `"allow"`
|
|
- `doom_loop` และ `external_directory` มีค่าเริ่มต้นเป็น `"ask"`
|
|
- `read` คือ `"allow"` แต่ไฟล์ `.env` ถูกปฏิเสธโดยค่าเริ่มต้น:
|
|
|
|
```json title="opencode.json"
|
|
{
|
|
"permission": {
|
|
"read": {
|
|
"*": "allow",
|
|
"*.env": "deny",
|
|
"*.env.*": "deny",
|
|
"*.env.example": "allow"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## สิ่งที่ "ถาม" ทำ
|
|
|
|
เมื่อ OpenCode แจ้งให้อนุมัติ UI จะเสนอผลลัพธ์สามประการ:
|
|
|
|
- `once` — อนุมัติเพียงคำขอนี้
|
|
- `always` — อนุมัติคำขอในอนาคตที่ตรงกับรูปแบบที่แนะนำ (สำหรับส่วนที่เหลือของเซสชัน OpenCode ปัจจุบัน)
|
|
- `reject` — ปฏิเสธคำขอ
|
|
|
|
ชุดรูปแบบที่ `always` จะอนุมัตินั้นมาจากเครื่องมือ (เช่น โดยทั่วไปการอนุมัติทุบตีจะกำหนดไวท์ลิสต์คำนำหน้าคำสั่งที่ปลอดภัย เช่น `git status*`)
|
|
|
|
---
|
|
|
|
## ตัวแทน
|
|
|
|
คุณสามารถแทนที่สิทธิ์ต่อตัวแทนได้ สิทธิ์ของตัวแทนจะผสานเข้ากับการกำหนดค่าส่วนกลาง และกฎของตัวแทนจะมีความสำคัญกว่า [เรียนรู้เพิ่มเติม](/docs/agents#permissions) เกี่ยวกับการอนุญาตของตัวแทน
|
|
|
|
:::note
|
|
โปรดดูส่วน [กฎแบบละเอียด (ไวยากรณ์ของวัตถุ)](#granular-rules-object-syntax) ด้านบนเพื่อดูตัวอย่างการจับคู่รูปแบบโดยละเอียดเพิ่มเติม
|
|
:::
|
|
|
|
```json title="opencode.json"
|
|
{
|
|
"$schema": "https://opencode.ai/config.json",
|
|
"permission": {
|
|
"bash": {
|
|
"*": "ask",
|
|
"git *": "allow",
|
|
"git commit *": "deny",
|
|
"git push *": "deny",
|
|
"grep *": "allow"
|
|
}
|
|
},
|
|
"agent": {
|
|
"build": {
|
|
"permission": {
|
|
"bash": {
|
|
"*": "ask",
|
|
"git *": "allow",
|
|
"git commit *": "ask",
|
|
"git push *": "deny",
|
|
"grep *": "allow"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
คุณยังสามารถกำหนดค่าการอนุญาตตัวแทนใน Markdown ได้:
|
|
|
|
```markdown title="~/.config/opencode/agents/review.md"
|
|
---
|
|
description: Code review without edits
|
|
mode: subagent
|
|
permission:
|
|
edit: deny
|
|
bash: ask
|
|
webfetch: deny
|
|
---
|
|
|
|
Only analyze code and suggest changes.
|
|
```
|
|
|
|
:::tip
|
|
ใช้การจับคู่รูปแบบสำหรับคำสั่งที่มีอาร์กิวเมนต์ `"grep *"` อนุญาต `grep pattern file.txt` ในขณะที่ `"grep"` คนเดียวจะบล็อกได้ คำสั่งเช่น `git status` ใช้งานได้กับพฤติกรรมเริ่มต้น แต่ต้องได้รับอนุญาตอย่างชัดเจน (เช่น `"git status *"`) เมื่ออาร์กิวเมนต์ถูกส่งผ่าน
|
|
:::
|