Skip to content

สิทธิ์

ควบคุมการดำเนินการที่ต้องได้รับการอนุมัติจึงจะรันได้

OpenCode ใช้การกำหนดค่า permission เพื่อตัดสินใจว่าการดำเนินการที่กำหนดควรทำงานโดยอัตโนมัติ แจ้งให้คุณทราบ หรือถูกบล็อก

ตั้งแต่ v1.1.1 การกำหนดค่าบูลีนแบบเดิม tools เลิกใช้แล้วและได้รวมเข้ากับ permission แล้ว การกำหนดค่า tools แบบเก่ายังคงรองรับความเข้ากันได้แบบย้อนหลัง


การดำเนินการ

กฎการอนุญาตแต่ละข้อจะแก้ไขเป็นข้อใดข้อหนึ่งต่อไปนี้

  • "allow" — ทำงานโดยไม่ได้รับการอนุมัติ
  • "ask" — พร้อมท์สำหรับการอนุมัติ
  • "deny" — บล็อกการกระทำ

การกำหนดค่า

คุณสามารถตั้งค่าการอนุญาตทั่วโลก (ด้วย *) และแทนที่เครื่องมือเฉพาะ

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"*": "ask",
"bash": "allow",
"edit": "deny"
}
}

คุณยังสามารถตั้งค่าการอนุญาตทั้งหมดพร้อมกันได้:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"permission": "allow"
}

กฎแบบละเอียด (ไวยากรณ์ของวัตถุ)

สำหรับการอนุญาตส่วนใหญ่ คุณสามารถใช้ออบเจ็กต์เพื่อปรับใช้การดำเนินการต่างๆ ตามอินพุตของเครื่องมือได้

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

  • ~/projects/* -> /Users/username/projects/*
  • $HOME/projects/* -> /Users/username/projects/*
  • ~ -> /Users/username

ไดเรกทอรีภายนอก

ใช้ external_directory เพื่ออนุญาตการเรียกใช้เครื่องมือที่สัมผัสเส้นทางนอกไดเร็กทอรีการทำงานที่ OpenCode เริ่มทำงาน สิ่งนี้ใช้ได้กับเครื่องมือใดๆ ที่ใช้เส้นทางเป็นอินพุต (เช่น read, edit, list, glob, grep และคำสั่ง bash จำนวนมาก)

การขยายบ้าน (เช่น ~/...) ส่งผลต่อวิธีการเขียนรูปแบบเท่านั้น ไม่ได้ทำให้เส้นทางภายนอกเป็นส่วนหนึ่งของพื้นที่ทำงานปัจจุบัน ดังนั้นเส้นทางภายนอกไดเรกทอรีการทำงานยังต้องได้รับอนุญาตผ่าน external_directory

ตัวอย่างเช่น อนุญาตให้เข้าถึงทุกสิ่งภายใต้ ~/projects/personal/:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
}
}
}

ไดเร็กทอรีใดๆ ที่ได้รับอนุญาตที่นี่จะสืบทอดค่าเริ่มต้นเดียวกันกับพื้นที่ทำงานปัจจุบัน เนื่องจาก read มีค่าเริ่มต้นเป็น allow การอ่านจึงได้รับอนุญาตสำหรับรายการภายใต้ external_directory เว้นแต่จะถูกแทนที่ เพิ่มกฎที่ชัดเจนเมื่อควรจำกัดเครื่องมือในเส้นทางเหล่านี้ เช่น การบล็อกการแก้ไขในขณะที่ยังคงอ่านอยู่:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
},
"edit": {
"~/projects/personal/**": "deny"
}
}
}

ให้รายการมุ่งเน้นไปที่เส้นทางที่เชื่อถือได้ และเลเยอร์อนุญาตหรือปฏิเสธกฎเพิ่มเติมตามที่จำเป็นสำหรับเครื่องมืออื่นๆ (เช่น bash)


สิทธิ์ที่มีอยู่

สิทธิ์ของ OpenCode จะกำหนดไว้ตามชื่อเครื่องมือ พร้อมด้วย guardrails อีก 2-3 คน:

  • read — อ่านไฟล์ (ตรงกับเส้นทางของไฟล์)
  • edit — การแก้ไขไฟล์ทั้งหมด (ครอบคลุมถึง edit, write, patch, multiedit)
  • glob — ไฟล์ globbing (ตรงกับรูปแบบ glob)
  • grep — การค้นหาเนื้อหา (ตรงกับรูปแบบ regex)
  • list — แสดงรายการไฟล์ในไดเร็กทอรี (ตรงกับเส้นทางไดเร็กทอรี)
  • bash — การรันคำสั่ง shell (ตรงกับคำสั่งที่แยกวิเคราะห์เช่น 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 ถูกปฏิเสธโดยค่าเริ่มต้น:
opencode.json
{
"permission": {
"read": {
"*": "allow",
"*.env": "deny",
"*.env.*": "deny",
"*.env.example": "allow"
}
}
}

สิ่งที่ “ถาม” ทำ

เมื่อ OpenCode แจ้งให้อนุมัติ UI จะเสนอผลลัพธ์สามประการ:

  • once — อนุมัติเพียงคำขอนี้
  • always — อนุมัติคำขอในอนาคตที่ตรงกับรูปแบบที่แนะนำ (สำหรับส่วนที่เหลือของเซสชัน OpenCode ปัจจุบัน)
  • reject — ปฏิเสธคำขอ

ชุดรูปแบบที่ always จะอนุมัตินั้นมาจากเครื่องมือ (เช่น โดยทั่วไปการอนุมัติ bash จะกำหนดไวท์ลิสต์คำนำหน้าคำสั่งที่ปลอดภัย เช่น git status*)


ตัวแทน

คุณสามารถแทนที่สิทธิ์ต่อตัวแทนได้ สิทธิ์ของตัวแทนจะผสานเข้ากับการกำหนดค่าส่วนกลาง และกฎของตัวแทนจะมีความสำคัญกว่า เรียนรู้เพิ่มเติม เกี่ยวกับการอนุญาตของตัวแทน

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 ได้:

~/.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.