opencode / packages /web /src /content /docs /ko /permissions.mdx
SaylorTwift's picture
SaylorTwift HF Staff
Add files using upload-large-folder tool
0dbc9de verified
Raw History Blame Contribute Delete
7.17 kB
---
title: ๊ถŒํ•œ
description: ์‹คํ–‰ ์Šน์ธ์ด ํ•„์š”ํ•œ ์ž‘์—…์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
---
opencode๋Š” ์ฃผ์–ด์ง„ ๋™์ž‘์ด ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด `permission` config๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
`v1.1.1`์˜ ๊ฒƒ๊ณผ ๊ฐ™์ด, ์œ ์‚ฐ `tools` ๋ถˆ๋ฆฐ ๊ตฌ์„ฑ์€ deprecated์ด๊ณ  `permission`๋กœ ํ•ฉ๋ณ‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ `tools` config๋Š” ์—ฌ์ „ํžˆ ๋’ค์ชฝ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.
---
## ๋™์ž‘
๊ฐ ๊ถŒํ•œ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
- `"allow"` - ์Šน์ธ์—†์ด ์‹คํ–‰
- `"ask"` - ์Šน์ธ์„์œ„ํ•œ prompt
- `"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 `"*"` ๊ทœ์น™์„ ๋จผ์ € ๋„ฃ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ›„์— ๋” ๊ตฌ์ฒด์ ์ธ ๊ทœ์น™.
## ์™€์ผ๋“œ์นด๋“œ
Permission ๋ณธ ์‚ฌ์šฉ ๊ฐ„๋‹จํ•œ wildcard ์ผ์น˜:
- `*`๋Š” ์–ด๋–ค ์„ฑ๊ฒฉ๋“ ์ง€์˜ 0๊ฐœ ์ด์ƒ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค
- `?`๋Š” ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๋ฌธ์ž ์ผ์น˜
- ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฌธ์ž ์ผ์น˜ ๋ง ๊ทธ๋Œ€๋กœ
## ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ ํ™•์žฅ
`~` ๋˜๋Š” `$HOME`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ํŒจํ„ด์˜ ์‹œ์ž‘์— ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ฐธ์กฐ. ์ด๊ฒƒ์€ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [`external_directory`](#external-directories) ๊ทœ์น™.
- `~/projects/*` -> `/Users/username/projects/*`
- `$HOME/projects/*` -> `/Users/username/projects/*`
- `~` -> `/Users/username`
## ์™ธ๋ถ€ ๋””๋ ‰ํ„ฐ๋ฆฌ
`external_directory`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„๊ตฌ๊ฐ€ opencode๊ฐ€ ์‹œ์ž‘๋œ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ–์— ํ„ฐ์น˜ ๊ฒฝ๋กœ๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž…๋ ฅ (์˜ˆ : `read`, `edit`, `glob`, `grep` ๋ฐ ๋งŽ์€ `bash` ๋ช…๋ น)๋กœ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ๋„๊ตฌ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
ํ™ˆ ํ™•์žฅ (`~/...`์™€ ๊ฐ™์€) ํŒจํ„ด์ด ์ž‘์„ฑ๋œ ๋ฐฉ๋ฒ•์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ˜„์žฌ์˜ ์ž‘์—… ๊ณต๊ฐ„์˜ ์™ธ๋ถ€ ๊ฒฝ๋กœ ๋ถ€๋ถ„์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค, ๊ทธ๋ž˜์„œ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์™ธ๋ถ€ ๊ฒฝ๋กœ๋Š” ์—ฌ์ „ํžˆ `external_directory`๋ฅผ ํ†ตํ•ด ํ—ˆ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๊ฒƒ์€ `~/projects/personal/`์˜ ๋ชจ๋“  ๊ฒƒ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
```json title="opencode.json"
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
}
}
}
```
์—ฌ๊ธฐ์— ํ—ˆ์šฉ๋˜๋Š” ๋ชจ๋“  ๋””๋ ‰ํ† ๋ฆฌ๋Š” ํ˜„์žฌ ์ž‘์—… ๊ณต๊ฐ„๊ณผ ๋™์ผํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. [`read` defaults to `allow`](#defaults)๋Š” `external_directory`์—์„œ `external_directory`์˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฒฝ๋กœ์— ์ œํ•œ ๋  ๋•Œ ๋ช…์‹œ์  ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
```json title="opencode.json"
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
},
"edit": {
"~/projects/personal/**": "deny"
}
}
}
```
์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ๋กœ์— ์ดˆ์ ์„ ๋งž์ถ˜ ๋ชฉ๋ก์„ ์œ ์ง€ํ•˜๊ณ  ๋‹ค๋ฅธ ๋„๊ตฌ (์˜ˆ : `bash`)์— ํ•„์š”ํ•œ๋Œ€๋กœ ์ถ”๊ฐ€ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ deny ๊ทœ์น™์„ ์ธต์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
---
## ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ถŒํ•œ
opencode ๊ถŒํ•œ์€ ๋„๊ตฌ ์ด๋ฆ„์— ์˜ํ•ด ํ‚ค ์ž…๋ ฅ๋˜๋ฉฐ, ๋‘ ๊ฐœ์˜ ์•ˆ์ „ ๊ฐ€๋“œ :
- `read` - ํŒŒ์ผ ์ฝ๊ธฐ (ํŒŒ์ผ ๊ฒฝ๋กœ์˜ ๋งค์นญ)
- `edit` - ๋ชจ๋“  ํŒŒ์ผ ์ˆ˜์ • (covers `edit`, `write`, `patch`)
- `glob` - ํŒŒ์ผ globbing (glob ํŒจํ„ด ๋งค์นญ)
- `grep` - ์ฝ˜ํ…์ธ  ๊ฒ€์ƒ‰ ( regex ํŒจํ„ด ๋งค์นญ)
- `bash` - shell ๋ช…๋ น ์‹คํ–‰ (`git status --porcelain`์™€ ๊ฐ™์€ ํŒŸ ๋ช…๋ น)
- `task` - ์—์ด์ „ํŠธ ์‹คํ–‰ (์ž‘์—… ์—์ด์ „ํŠธ ์œ ํ˜•)
- `skill` - ๊ธฐ์ˆ ์„ ๋กœ๋”ฉ (๊ธฐ์ˆ  ์ด๋ฆ„์„ ๋งค์นญ)
- `lsp` - LSP ์ฟผ๋ฆฌ ์‹คํ–‰ (ํ˜„์žฌ ๋น„ ๊ณผ๋ฆฝ)
- `webfetch` - URL์„ fetching ( URL์„ ๋งค์นญ)
- `websearch` - ์›น ๊ฒ€์ƒ‰ (๋ฌธ์ž ์ฟผ๋ฆฌ)
- `external_directory` - ํ”„๋กœ์ ํŠธ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์™ธ๋ถ€์˜ ๋„๊ตฌ ์ ‘์ด‰ ๊ฒฝ๋กœ ๋•Œ ํŠธ๋ฆฌ๊ฑฐ
- `doom_loop` - ๋™์ผํ•œ ๋„๊ตฌ ํ˜ธ์ถœ์ด ๋™์ผํ•œ ์ž…๋ ฅ์œผ๋กœ 3 ๋ฒˆ ๋ฐ˜๋ณต ํ•  ๋•Œ ํŠธ๋ฆฌ๊ฑฐ
---
## ๊ธฐ๋ณธ๊ฐ’
์•„๋ฌด๊ฒƒ๋„ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, opencode๋Š” permissive ๊ธฐ๋ณธ๊ฐ’์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
- `"allow"`์— ๊ธฐ๋ณธ ๊ถŒํ•œ.
- `doom_loop` ๋ฐ `external_directory` ๊ธฐ๋ณธ์ ์œผ๋กœ `"ask"`.
- `read`๋Š” `"allow"`์ด๊ณ , ๊ทธ๋Ÿฌ๋‚˜ `.env` ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ denied:
```json title="opencode.json"
{
"permission": {
"read": {
"*": "allow",
"*.env": "deny",
"*.env.*": "deny",
"*.env.example": "allow"
}
}
}
```
---
## "Ask"๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
opencode๊ฐ€ ์Šน์ธ๋˜๋ฉด UI๋Š” ์„ธ ๊ฐ€์ง€ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
- `once` - ์ด ์š”์ฒญ์„ ์Šน์ธ
- `always` - ์ œ์•ˆ ๋œ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฏธ๋ž˜ ์š”์ฒญ (ํ˜„์žฌ opencode ์„ธ์…˜์˜ ๋‚˜๋จธ์ง€)
- `reject` - ์š”์ฒญ์„ ๊ฑฐ๋ถ€
`always`๋Š” ๋„๊ตฌ (์˜ˆ๋ฅผ ๋“ค๋ฉด, bash ์Šน์ธ ์ผ๋ฐ˜์ ์œผ๋กœ `git status*`์™€ ๊ฐ™์€ ์•ˆ์ „ํ•œ ๋ช…๋ น ์ ‘๋‘์‚ฌ)์— ์˜ํ•ด approve๊ฐ€ ์ œ๊ณต ๋  ํŒจํ„ด์˜ ์ง‘ํ•ฉ.
---
## ์—์ด์ „ํŠธ
์—์ด์ „ํŠธ ๋‹น ๊ถŒํ•œ์ด ๋ถ€์—ฌ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ ๊ถŒํ•œ์€ ๊ธ€๋กœ๋ฒŒ ๊ตฌ์„ฑ๊ณผ ํ•ฉ๋ณ‘๋˜๋ฉฐ, ์—์ด์ „ํŠธ ๊ทœ์น™์€ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. [Learn more](/docs/agents#permissions) ์•ฝ ์—์ด์ „ํŠธ ๊ถŒํ•œ.
:::note
[Granular Rules (Object Syntax)](#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 *"`์™€ ๊ฐ™์€)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
:::