opencode / packages /web /src /content /docs /ko /tools.mdx
SaylorTwift's picture
SaylorTwift HF Staff
Add files using upload-large-folder tool
0dbc9de verified
Raw History Blame Contribute Delete
8.69 kB
---
title: ๋„๊ตฌ
description: LLM์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
---
๋„๊ตฌ๋Š” LLM์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. opencode๋Š” ๋‚ด์žฅ ๋„๊ตฌ ์„ธํŠธ๋กœ ์ œ๊ณต๋˜์ง€๋งŒ, [custom tools](/docs/custom-tools) ๋˜๋Š” [MCP ์„œ๋ฒ„](/docs/mcp-servers)๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋„๊ตฌ๋Š”**enabled**์ด๋ฉฐ, ์‹คํ–‰ํ•  ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. [permissions](/docs/permissions)๋ฅผ ํ†ตํ•ด ๊ณต๊ตฌ ๋™์ž‘์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
---
## ๊ตฌ์„ฑ
`permission` ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„๊ตฌ ๋™์ž‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋„๊ตฌ์— ๋Œ€ํ•œ ์Šน์ธ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
```json title="opencode.json"
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"edit": "deny",
"bash": "ask",
"webfetch": "allow"
}
}
```
ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ์ œ์–ด ํ•  ์™€์ผ๋“œ ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, MCP ์„œ๋ฒ„์˜ ๋ชจ๋“  ๋„๊ตฌ์— ๋Œ€ํ•œ ์Šน์ธ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
```json title="opencode.json"
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"mymcp_*": "ask"
}
}
```
[Learn more](/docs/permissions) configuring ๊ถŒํ•œ์— ๋Œ€ํ•ด.
---
## ๋‚ด์žฅ
๋‹ค์Œ์€ opencode์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๋‚ด์žฅ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
---
###### bash
ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์—์„œ shell ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"bash": "allow"
}
}
```
์ด ๋„๊ตฌ๋Š” `npm install`, `git status` ๋˜๋Š” ๋‹ค๋ฅธ shell ๋ช…๋ น๊ณผ ๊ฐ™์€ terminal ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” LLM์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
---
### edit
์ •ํ™•ํ•œ ๋ฌธ์ž์—ด ๊ต์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"edit": "allow"
}
}
```
์ด ๋„๊ตฌ๋Š” ์ •ํ™•ํ•œ ํ…์ŠคํŠธ ์ผ์น˜๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ํŒŒ์ผ์— ์ •ํ™•ํ•œ ํŽธ์ง‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. LLM์€ ์ฝ”๋“œ๋ฅผ modifyํ•˜๋Š” ์ฃผ์š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
---
### write
์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด์˜ ๊ฒƒ์„ ๋ฎ์–ด์“ฐ๊ธฐ.
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"edit": "allow"
}
}
```
LLM์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด ํŒŒ์ผ์„ ๋ฎ์–ด์“ฐ๊ฒ ์Šต๋‹ˆ๋‹ค.
:::note
`write` ๊ณต๊ตฌ๋Š” ๋ชจ๋“  ํŒŒ์ผ ์ˆ˜์ • (`edit`, `write`, `patch`)๋ฅผ ํฌํ•จํ•˜๋Š” `edit` ํ—ˆ๊ฐ€์— ์˜ํ•ด ํ†ต์ œ๋ฉ๋‹ˆ๋‹ค.
:::
---
### read
codebase์—์„œ ํŒŒ์ผ ๋‚ด์šฉ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค.
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"read": "allow"
}
}
```
์ด ๋„๊ตฌ๋Š” ํŒŒ์ผ์„ ์ฝ๊ณ  ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํฐ ํŒŒ์ผ์— ๋Œ€ํ•œ ํŠน์ • ๋ผ์ธ ๋ฒ”์œ„๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
---
#### grep
์ •๊ทœ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ๋‚ด์šฉ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"grep": "allow"
}
}
```
Codebase์—์„œ ๋น ๋ฅธ ์ฝ˜ํ…์ธ  ๊ฒ€์ƒ‰. ์ „์ฒด regex ๋ฌธ๋ฒ• ๋ฐ ํŒŒ์ผ ํŒจํ„ด ํ•„ํ„ฐ๋ง ์ง€์›.
---
#### glob
ํŒจํ„ด ๋งค์นญ์œผ๋กœ ํŒŒ์ผ ์ฐพ๊ธฐ.
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"glob": "allow"
}
}
```
`**/*.js` ๋˜๋Š” `src/**/*.ts`์™€ ๊ฐ™์€ glob ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ๊ฒ€์ƒ‰. ์ˆ˜์ • ์‹œ๊ฐ„์— ์˜ํ•ด ์ •๋ ฌ ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ ๋ฐ˜ํ™˜.
---
### lsp (์‹คํ—˜์ )
์ •์˜, ์ฐธ๊ณ , hover info ๋ฐ ํ˜ธ์ถœ hierarchy์™€ ๊ฐ™์€ ์ฝ”๋“œ ์ธํ…”๋ฆฌ์ „์Šค ๊ธฐ๋Šฅ์„ ์–ป๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ ๋œ LSP ์„œ๋ฒ„์™€ ์ธํ„ฐ๋ž™ํŠธ.
:::note
์ด ๋„๊ตฌ๋Š” `OPENCODE_EXPERIMENTAL_LSP_TOOL=true` (๋˜๋Š” `OPENCODE_EXPERIMENTAL=true`) ๋•Œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.
:::
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"lsp": "allow"
}
}
```
์ง€์›๋œ ๊ฐ€๋™์€ `goToDefinition`, `findReferences`, `hover`, `documentSymbol`, `workspaceSymbol`, `goToImplementation`, `prepareCallHierarchy`, `incomingCalls` ๋ฐ `outgoingCalls`๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
LSP ์„œ๋ฒ„๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑํ•˜๋ ค๋ฉด [LSP Servers](/docs/lsp)๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
---
## patch
ํŒŒ์ผ์— ํŒจ์น˜๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"edit": "allow"
}
}
```
์ด ๋„๊ตฌ๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์— ํŒจ์น˜ ํŒŒ์ผ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์†Œ์Šค์—์„œ diffs ๋ฐ Patch๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
:::note
`patch` ๊ณต๊ตฌ๋Š” ๋ชจ๋“  ํŒŒ์ผ ์ˆ˜์ • (`edit`, `write`, `patch`)๋ฅผ ํฌํ•จํ•˜๋Š” `edit` ํ—ˆ๊ฐ€์— ์˜ํ•ด ํ†ต์ œ๋ฉ๋‹ˆ๋‹ค.
:::
---
### skill
[skill](/docs/skills) (`SKILL.md` ํŒŒ์ผ)์„๋กœ๋“œํ•˜๊ณ  ๋Œ€ํ™”์˜ ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"skill": "allow"
}
}
```
---
## todowrite
์ฝ”๋”ฉ ์„ธ์…˜ ์ค‘์— todo ๋ชฉ๋ก์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"todowrite": "allow"
}
}
```
๋ณต์žกํ•œ ์ž‘์—… ์ค‘์— ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—… ๋ชฉ๋ก์„ ๋งŒ๋“ค๊ณ  ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. LLM์€ ๋ฉ€ํ‹ฐ ๋‹จ๊ณ„ ์ž‘์—…์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
:::note
์ด ๋„๊ตฌ๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์‹œ์•ฝ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜์ง€๋งŒ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [๋” ์•Œ์•„๋ณด๊ธฐ](/docs/agents/#permissions)
:::
---
#### webfetch
Fetch ์›น ์ฝ˜ํ…์ธ .
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"webfetch": "allow"
}
}
```
LLM์„ fetch ๋ฐ ์›น ํŽ˜์ด์ง€๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ฌธ์„œ ๋˜๋Š” ์—ฐ๊ตฌ
---
#### websearch
์›น ๊ฒ€์ƒ‰
:::note
์ด ๋„๊ตฌ๋Š” opencode ์ œ๊ณต ์—…์ฒด ๋˜๋Š” `OPENCODE_ENABLE_EXA` ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋“  ์ง„์‹ค ๊ฐ’ (์˜ˆ : `true` ๋˜๋Š” `1`)๋กœ ์„ค์ •ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
opencode๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ™œ์„ฑํ™”:
```bash
OPENCODE_ENABLE_EXA=1 opencode
```
:::
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"websearch": "allow"
}
}
```
Exa AI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ด€๋ จ ์ •๋ณด๋ฅผ ์˜จ๋ผ์ธ์œผ๋กœ ์ฐพ์œผ์‹ญ์‹œ์˜ค. ์—ฐ๊ตฌ ์ฃผ์ œ์— ์œ ์šฉํ•œ, ํ˜„์žฌ ์ด๋ฒคํŠธ๋ฅผ ์ฐพ๋Š”, ๋˜๋Š” ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ์ฐจ๋‹จ์„ ๋„˜์–ด ์ •๋ณด๋ฅผ ์ˆ˜์ง‘.
API ํ‚ค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค - ๋„๊ตฌ๋Š” ์ธ์ฆ์—†์ด Exa AI์˜ ํ˜ธ์ŠคํŒ… MCP ์„œ๋น„์Šค์— ์ง์ ‘ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
:::tip
`websearch`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • URL (retrieval)์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ๊ฒ€์ƒ‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
:::
---
### question
์‹คํ–‰ ์ค‘์— ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ ์š”์ฒญ.
```json title="opencode.json" {4}
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"question": "allow"
}
}
```
์ด ๋„๊ตฌ๋Š” ์ž‘์—… ์ค‘์— LLM์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค:
- ์‚ฌ์šฉ์ž ์„ ํ˜ธ๋„ ๋˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ ๋ณ€๊ฒฝ
- ์ฃผ์œ„ ์ง€์นจ
- ๊ตฌํ˜„ ์„ ํƒ์— ๋Œ€ํ•œ ๊ฒฐ์ •
- ์–ด๋–ค ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์„ ํƒ ์ œ๊ณต
๊ฐ ์งˆ๋ฌธ์—๋Š” ํ—ค๋”, ์งˆ๋ฌธ ํ…์ŠคํŠธ ๋ฐ ์˜ต์…˜ ๋ชฉ๋ก์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ œ๊ณต๋œ ์„ ํƒ๊ถŒ์—์„œ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ฃผ๋ฌธ ๋Œ€๋‹ต์„ ํƒ€์ž๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์งˆ๋ฌธ์ด ์žˆ์„ ๋•Œ, ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  ๋‹ต๋ณ€์„ ์ œ์ถœํ•˜๊ธฐ ์ „์— ๊ทธ๋“ค ์‚ฌ์ด์—์„œ ํƒ์ƒ‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
---
## ์‚ฌ์šฉ์ž ์ •์˜ ๋„๊ตฌ
์‚ฌ์šฉ์ž ์ •์˜ ๋„๊ตฌ๋Š” LLM์ด ํ˜ธ์ถœ ํ•  ์ˆ˜์žˆ๋Š” ์ž์‹ ์˜ ๊ธฐ๋Šฅ์„ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. config ํŒŒ์ผ์— ์ •์˜๋˜์–ด arbitrary ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
[Learn more](/docs/custom-tools) ์‚ฌ์šฉ์ž ์ •์˜ ๋„๊ตฌ ๋งŒ๋“ค๊ธฐ.
---
## MCP ์„œ๋ฒ„
MCP(Model Context Protocol) ์„œ๋ฒ„๋Š” ์™ธ๋ถ€ ๋„๊ตฌ์™€ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์„ธ์Šค, API ํ†ตํ•ฉ ๋ฐ ํƒ€์‚ฌ ์„œ๋น„์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
MCP ์„œ๋ฒ„ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ [Learn more](/docs/mcp-servers).
---
## ๋‚ด๋ถ€
๋‚ด๋ถ€, ๋„๊ตฌ `grep` ๊ทธ๋ฆฌ๊ณ  `glob` ์‚ฌ์šฉ [ripgrep](https://github.com/BurntSushi/ripgrep) ํ›„๋“œ ์•„๋ž˜์—. ๊ธฐ๋ณธ์ ์œผ๋กœ ripgrep์€ `.gitignore` ํŒจํ„ด์„ ์กด์ค‘ํ•˜๋ฉฐ `.gitignore`์— ๋‚˜์—ด๋œ ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ ๋ฐ ๋ชฉ๋ก์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.
---
#### Ignore ํŒจํ„ด
์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌด์‹œ๋˜๋Š” ํŒŒ์ผ์„ ํฌํ•จํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— `.ignore` ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ๋ช…์‹œ์ ์œผ๋กœ ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
```text title=".ignore"
!node_modules/
!dist/
!build/
```
์˜ˆ๋ฅผ ๋“ค์–ด,์ด `.ignore` ํŒŒ์ผ์€ `node_modules/`, `dist/` ๋ฐ `build/` ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์—์„œ ๊ฒ€์ƒ‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `.gitignore`.