discord-agent-bridge 0.2.0 โ†’ 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md ADDED
@@ -0,0 +1,262 @@
1
+ # discord-agent-bridge
2
+
3
+ ๐ŸŒ **ํ•œ๊ตญ์–ด** | [English](README.md)
4
+
5
+ > Self-hosted Discord bot that runs AI coding agents โ€” Claude Code, Codex, and more โ€” per channel. Role-based access, multi-server, extensible.
6
+
7
+ **์ฑ„๋„๋งˆ๋‹ค Claude Code / Codex ๊ฐ™์€ AI ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๋ฅผ ๋ถ™์—ฌ ์“ฐ๋Š” ์…€ํ”„ํ˜ธ์ŠคํŒ… Discord ๋ด‡์ž…๋‹ˆ๋‹ค.** ๋‚ด PC์—์„œ ์‹คํ–‰๋˜๊ณ , ์—ญํ•  ๊ธฐ๋ฐ˜ ๊ถŒํ•œ ยท ๋‹ค์ค‘ ์„œ๋ฒ„ ยท ํ™•์žฅ ๊ฐ€๋Šฅ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
8
+
9
+ - ํ˜„์žฌ ์ง€์›: **Claude Code**, **Codex**
10
+ - ํ™•์žฅ: ๋ชจ๋“œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€๋กœ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ(์˜ˆ: opencode) ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ
11
+
12
+ > โœ… **npm์— ๋ฐฐํฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.** `npx discord-agent-bridge` ๋กœ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜(๊ถŒ์žฅ), ์ „์—ญ ์„ค์น˜ยท์†Œ์Šค ๋นŒ๋“œ๋กœ๋„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **Claude Code ยท Codex** ๋‘ ๋ฐฑ์—”๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
13
+
14
+ ---
15
+
16
+ ## ์ด๊ฒŒ ๋ญ์˜ˆ์š”?
17
+
18
+ Discord ์ฑ„๋„์—์„œ ๋Œ€ํ™”ํ•˜๋“ฏ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด, ๋‚ด ์ปดํ“จํ„ฐ์—์„œ Claude Code(๋˜๋Š” Codex)๊ฐ€ ๊ทธ ํ”„๋กœ์ ํŠธ ํด๋”๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ž‘์—…ํ•ด ์ฃผ๋Š” ๋ด‡์ž…๋‹ˆ๋‹ค.
19
+
20
+ - **์ฑ„๋„ = ์„ธ์…˜ = ํ”„๋กœ์ ํŠธ ํ•˜๋‚˜.** ์ฑ„๋„์„ ๋งŒ๋“ค ๋•Œ ์ž‘์—… ํด๋”์™€ ๋ฐฑ์—”๋“œ(Claude/Codex)๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค.
21
+ - **์—ฌ๋Ÿฌ ์„œ๋ฒ„**์— ๊ฐ™์€ ๋ด‡์„ ์ดˆ๋Œ€ํ•ด ์“ธ ์ˆ˜ ์žˆ๊ณ , **์„œ๋ฒ„/ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ์„ค์ •์ด ๋”ฐ๋กœ** ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
22
+ - **์—ญํ• (Role)๋กœ ๋ˆ„๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€** ํ†ต์ œํ•ฉ๋‹ˆ๋‹ค.
23
+
24
+ ---
25
+
26
+ ## ์ค€๋น„๋ฌผ
27
+
28
+ - **Node.js 20 ์ด์ƒ**
29
+ - ์‚ฌ์šฉํ•  ๋ฐฑ์—”๋“œ์— ๋งž๋Š” CLI๊ฐ€ **์„ค์น˜ + ๋กœ๊ทธ์ธ**๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
30
+ - **Claude ๋ชจ๋“œ** โ†’ [Claude Code](https://docs.anthropic.com/en/docs/claude-code) ์ธ์ฆ (`claude` ๋กœ๊ทธ์ธ ๋˜๋Š” `ANTHROPIC_API_KEY`). ์‚ฌ์šฉ๋Ÿ‰/ํ•œ๋„ ํŒจ๋„์„ ๋ณด๋ ค๋ฉด **Claude Pro/Max ๊ตฌ๋… ๋กœ๊ทธ์ธ**์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
31
+ - **Codex ๋ชจ๋“œ** โ†’ `codex` CLI ์„ค์น˜ + ๋กœ๊ทธ์ธ.
32
+ - **Discord ๋ด‡ ํ† ํฐ** (์•„๋ž˜ 1๋‹จ๊ณ„์—์„œ ๋ฐœ๊ธ‰)
33
+
34
+ ---
35
+
36
+ ## 1๋‹จ๊ณ„ โ€” Discord ๋ด‡ ๋งŒ๋“ค๊ธฐ (Developer Portal)
37
+
38
+ ๋ด‡์„ ์ง์ ‘ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 5๋ถ„์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.
39
+
40
+ 1. **[Discord Developer Portal](https://discord.com/developers/applications)** ์ ‘์† โ†’ ์˜ค๋ฅธ์ชฝ ์œ„ **New Application** โ†’ ์ด๋ฆ„ ์ž…๋ ฅ(์˜ˆ: `my-agent-bot`) โ†’ **Create**.
41
+ 2. ์™ผ์ชฝ ๋ฉ”๋‰ด **Bot** ํƒญ โ†’ **Reset Token** โ†’ ๋‚˜์˜ค๋Š” **ํ† ํฐ์„ ๋ณต์‚ฌ**ํ•ด ์•ˆ์ „ํ•œ ๊ณณ์— ๋ณด๊ด€.
42
+ - โš ๏ธ ์ด ํ† ํฐ์€ ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. ๋…ธ์ถœ๋˜๋ฉด ์ฆ‰์‹œ **Reset Token**์œผ๋กœ ์žฌ๋ฐœ๊ธ‰ํ•˜์„ธ์š”.
43
+ 3. ๊ฐ™์€ **Bot** ํƒญ ์•„๋ž˜ **Privileged Gateway Intents**:
44
+ - โœ… **MESSAGE CONTENT INTENT** โ€” **ํ•„์ˆ˜** (๋ด‡์ด ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์„ ์ฝ์–ด์•ผ ํ•จ)
45
+ - โœ… **SERVER MEMBERS INTENT** โ€” ๊ถŒ์žฅ (์—ญํ•  ๊ธฐ๋ฐ˜ ๊ถŒํ•œ ํ™•์ธ์— ์‚ฌ์šฉ)
46
+ - ์ผœ๊ณ  **Save Changes**.
47
+ 4. ์™ผ์ชฝ **OAuth2** ํƒญ โ†’ **Client ID(Application ID)** ๋ณต์‚ฌ (์…‹์—…์— ํ•„์š”).
48
+ 5. **์ดˆ๋Œ€ ๋งํฌ ๋งŒ๋“ค๊ธฐ** โ€” OAuth2 โ†’ **URL Generator**:
49
+ - **Scopes**: `bot`, `applications.commands`
50
+ - **Bot Permissions**: `Manage Channels`, `Send Messages`, `Embed Links`, `Attach Files`, `Read Message History`, `Create Public Threads`, `Send Messages in Threads`, `Manage Threads`, `Add Reactions`
51
+ - ์ƒ์„ฑ๋œ URL์„ ๋ธŒ๋ผ์šฐ์ €์— ๋ถ™์—ฌ๋„ฃ์–ด **๋‚ด ์„œ๋ฒ„์— ์ดˆ๋Œ€**.
52
+ - (์…‹์—… ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์ด ์ดˆ๋Œ€ ๋งํฌ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ด ์ฃผ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค โ€” 2๋‹จ๊ณ„ ์ฐธ๊ณ .)
53
+
54
+ ---
55
+
56
+ ## 2๋‹จ๊ณ„ โ€” ์„ค์น˜ & ์‹คํ–‰
57
+
58
+ ### npx๋กœ ์‹คํ–‰ (๊ถŒ์žฅ)
59
+
60
+ ์„ค์น˜ ์—†์ด ๋ฐ”๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. `npx` ๊ฐ€ ์ตœ์‹  ๋ฒ„์ „์„ ๋ฐ›์•„ ์‹คํ–‰ํ•˜๋ฉฐ, ์ตœ์ดˆ ์‹คํ–‰์ด๋ฉด ์…‹์—… ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋จผ์ € ๋œฌ ๋’ค ์ด์–ด์„œ ๋ด‡์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
61
+
62
+ ```bash
63
+ # ์ตœ์ดˆ ์‹คํ–‰ โ€” ์…‹์—… ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋œฌ ๋’ค ์ด์–ด์„œ ๋ด‡์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
64
+ # (ํ† ํฐ/Client ID ์ž…๋ ฅ, ์ธํ…ํŠธ ํ™•์ธ, ์ดˆ๋Œ€ ๋งํฌ ์ƒ์„ฑ โ€” ๊ธฐ๋ณธ๊ฐ’์€ ์•ˆ ๋ฌผ์–ด๋ด„)
65
+ npx discord-agent-bridge
66
+
67
+ # ์ดํ›„ ์‹คํ–‰ โ€” ์ด๋ฏธ ์„ค์ •๋ผ ์žˆ์œผ๋ฉด ๋ฐ”๋กœ ๋ด‡์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
68
+ npx discord-agent-bridge
69
+
70
+ # ๋‹ค์‹œ ์„ค์ •๋งŒ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ (๋ด‡์€ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Œ)
71
+ npx discord-agent-bridge --setup
72
+ ```
73
+
74
+ ์ „์—ญ ์„ค์น˜๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค: `npm install -g discord-agent-bridge` ํ›„ `discord-agent-bridge` / `discord-agent-bridge --setup`.
75
+
76
+ ### ์—…๊ทธ๋ ˆ์ด๋“œ
77
+
78
+ ์ƒˆ ๋ฒ„์ „์ด ๋‚˜์˜ค๋ฉด:
79
+
80
+ ```bash
81
+ # npx ์‚ฌ์šฉ์ž โ€” @latest ๋ฅผ ๋ถ™์ด๋ฉด ํ•ญ์ƒ ์ตœ์‹ ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค(npx๋Š” ์บ์‹œ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์–ด์š”).
82
+ npx discord-agent-bridge@latest
83
+
84
+ # ์ „์—ญ ์„ค์น˜ ์‚ฌ์šฉ์ž
85
+ npm install -g discord-agent-bridge@latest
86
+ ```
87
+
88
+ ์„ค์น˜๋œ ๋ฒ„์ „ ํ™•์ธ: `discord-agent-bridge --version`.
89
+
90
+ ### PC ์žฌ์‹œ์ž‘ ํ›„์—๋„ ์ž๋™์œผ๋กœ ์‹คํ–‰ (PM2)
91
+
92
+ ๋กœ๊ทธ์•„์›ƒ/์žฌ๋ถ€ํŒ… ํ›„์—๋„ ๋ด‡์„ ๊ณ„์† ์‚ด๋ ค๋‘๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ [PM2](https://pm2.keymetrics.io/) ์ž…๋‹ˆ๋‹ค. macOSยทLinuxยทWindows์—์„œ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ณ , ๋กœ๊ทธยท์žฌ์‹œ์ž‘ยท์ƒํƒœ ํ™•์ธ์„ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค.
93
+
94
+ ```bash
95
+ # 1) ์ „์—ญ ์„ค์น˜ (PM2๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ปค๋งจ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•จ)
96
+ npm install -g discord-agent-bridge
97
+
98
+ # 2) ์•„์ง ์…‹์—… ์•ˆ ํ–ˆ๋‹ค๋ฉด ํ•œ ๋ฒˆ ์‹คํ–‰
99
+ discord-agent-bridge --setup
100
+
101
+ # 3) PM2 ์„ค์น˜
102
+ npm install -g pm2
103
+
104
+ # 4) PM2์— ๋ด‡์„ ๋“ฑ๋กยท์‹คํ–‰
105
+ pm2 start discord-agent-bridge --name discord-agent-bridge
106
+
107
+ # 5) ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค ๋ชฉ๋ก์„ ์Šค๋ƒ…์ƒท ์ €์žฅ (์žฌ๋ถ€ํŒ… ์‹œ ๋ณต๊ตฌ ๋Œ€์ƒ)
108
+ pm2 save
109
+
110
+ # 6) ๋ถ€ํŒ… ์‹œ PM2 ์ž๋™ ์‹œ์ž‘ ๋“ฑ๋ก (macOS๋Š” launchd๋กœ ๋“ฑ๋ก๋จ)
111
+ pm2 startup
112
+ # โ†‘ ์ถœ๋ ฅ๋˜๋Š” `sudo ...` ๋ช…๋ น์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜์„ธ์š”.
113
+ ```
114
+
115
+ ์ผ์ƒ์ ์ธ ๊ด€๋ฆฌ ๋ช…๋ น:
116
+
117
+ ```bash
118
+ pm2 status # ์‹คํ–‰ ์ƒํƒœ
119
+ pm2 logs discord-agent-bridge # ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ
120
+ pm2 restart discord-agent-bridge # ์žฌ์‹œ์ž‘ (์—…๊ทธ๋ ˆ์ด๋“œ ํ›„์—๋„ ์‚ฌ์šฉ)
121
+ pm2 stop discord-agent-bridge # ์ค‘์ง€
122
+ pm2 delete discord-agent-bridge # ๋“ฑ๋ก ํ•ด์ œ
123
+ ```
124
+
125
+ PM2 ์ƒํƒœ์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œ:
126
+
127
+ ```bash
128
+ npm install -g discord-agent-bridge@latest
129
+ pm2 restart discord-agent-bridge
130
+ ```
131
+
132
+ > โš ๏ธ nvm/asdf๋ฅผ ์“ด๋‹ค๋ฉด, PM2๊ฐ€ ๋ถ€ํŒ… ์‹œ์ ์—๋„ ์…ธ์—์„œ ์“ฐ๋Š” ๊ฒƒ๊ณผ **๊ฐ™์€ `node`** ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. `which node`๋กœ ํ™•์ธํ•œ ๊ฒฝ๋กœ๊ฐ€ ๋ถ€ํŒ… ํ™˜๊ฒฝ์—์„œ๋„ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค โ€” ์•„๋‹ˆ๋ฉด ์žฌ๋ถ€ํŒ… ํ›„ PM2๊ฐ€ ๋ด‡์„ ๋ชป ๋„์›๋‹ˆ๋‹ค.
133
+
134
+ **์…‹์—… ๋งˆ๋ฒ•์‚ฌ(`--setup`)** ๊ฐ€ ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ โ€” **ํ† ํฐ(๋น„๋ฐ€)๋งŒ ํ„ฐ๋ฏธ๋„์—์„œ ์ž…๋ ฅ**ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ ๊ฐ’์€ ํ•˜๋‚˜๋„ ์•ˆ ๋ฌผ์–ด๋ด…๋‹ˆ๋‹ค:
135
+ 1. Discord ๋ด‡ **ํ† ํฐ** (๋น„๋ฐ€ โ†’ ํ„ฐ๋ฏธ๋„์—์„œ๋งŒ ๋ถ™์—ฌ๋„ฃ๊ธฐ)
136
+ 2. **Client ID**
137
+ 3. Message Content Intent ์ผฐ๋Š”์ง€ ํ™•์ธ
138
+ 4. ์ดˆ๋Œ€ URL ์ƒ์„ฑ โ†’ ์„œ๋ฒ„์— ์ดˆ๋Œ€
139
+
140
+ > **์—ญํ• ๋„, ๊ธฐ๋ณธ๊ฐ’๋„ ํ„ฐ๋ฏธ๋„์—์„œ ์•ˆ ์ •ํ•ฉ๋‹ˆ๋‹ค.** ๋ด‡์„ ์„œ๋ฒ„์— ์ดˆ๋Œ€ํ•œ ๋’ค Discord์—์„œ **`/config`** ๋ช…๋ น์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”:
141
+ > - **์—ญํ•  ํ‹ฐ์–ด** โ€” ์—ญํ•  ์ด๋ฆ„์„ **ํด๋ฆญ**ํ•ด ์ง€์ •(์—ญํ•  ID ๋ณต์‚ฌยท๊ฐœ๋ฐœ์ž ๋ชจ๋“œ ๋ถˆํ•„์š”). ์ง€์ • ์ „์—๋Š” **๋ชจ๋‘ ๊ฑฐ๋ถ€(deny-by-default)**.
142
+ > - **๊ธฐ๋ณธ๊ฐ’** โ€” **๊ธฐ๋ณธ ๋ฐฑ์—”๋“œยท๋ชจ๋ธยท๊ถŒํ•œ ๋ชจ๋“œยท์–ธ์–ด(locale)** ๋Š” ๋“œ๋กญ๋‹ค์šด์—์„œ ๊ณ ๋ฅด๋ฉด **๋ฐ”๋กœ ์ €์žฅ**๋˜๊ณ , **Codex ๊ธฐ๋ณธ ๊ฒฝ๋กœ(codexHome)** ๋Š” "Codex ๊ฒฝ๋กœ ์„ค์ •" ๋ฒ„ํŠผ โ†’ ์ž…๋ ฅ์ฐฝ(๋ชจ๋‹ฌ)์—์„œ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด๋Š” `ํ•œ๊ตญ์–ด (ko)` / `English (en)` ์ค‘์—์„œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
143
+
144
+ ์„ค์ •์€ `~/.discord-agent-bridge/` ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค(ํ† ํฐ ํŒŒ์ผ ๊ถŒํ•œ 600). ์—ญํ• ยท๊ธฐ๋ณธ๊ฐ’์€ ์„œ๋ฒ„๋ณ„๋กœ `servers/<guildId>.json` ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
145
+
146
+ ---
147
+
148
+ ## 3๋‹จ๊ณ„ โ€” Discord์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ
149
+
150
+ ๋ด‡์ด ์„œ๋ฒ„์— ๋“ค์–ด์˜ค๋ฉด **์ปจํŠธ๋กค ์ฑ„๋„(`#session-generator`) ยท ์„ธ์…˜ ์นดํ…Œ๊ณ ๋ฆฌ ยท ์•Œ๋ฆผ ์ฑ„๋„(`#agent-status`)์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ**๋ฉ๋‹ˆ๋‹ค(๋ด‡์— ์ฑ„๋„ ๊ด€๋ฆฌ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด). ์ดํ›„ ์ˆœ์„œ: **`/config` โ†’ `/agent start`**.
151
+
152
+ 1. **(์ž๋™)** ๋ด‡ ์‹œ์ž‘ยท์„œ๋ฒ„ ์ดˆ๋Œ€ ์‹œ ์œ„ ์ฑ„๋„ ๊ตฌ์กฐ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๊ฐ€ **`/init`** ์œผ๋กœ ์ˆ˜๋™ ์žฌ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(๊ธฐ์กด ์ฑ„๋„์€ ์žฌ์‚ฌ์šฉ โ€” ์ค‘๋ณต ์ƒ์„ฑ ์—†์Œ).
153
+ 2. **`/config`** (๊ด€๋ฆฌ์ž) โ†’ ์—ญํ•  ํ‹ฐ์–ดยท๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. (์„œ๋ฒ„ ๊ด€๋ฆฌ์ž(Administrator)๋Š” ์—ญํ•  ์„ค์ • ์—†์ด๋„ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
154
+ 3. `#session-generator` ์—์„œ **`/agent start`** โ†’ **๋งˆ๋ฒ•์‚ฌ**๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค:
155
+ **์ž‘์—… ํด๋” ์„ ํƒ โ†’ ๋ฐฑ์—”๋“œ(Claude / Codex) โ†’ ๋ชจ๋ธ โ†’ ์ถ”๋ก  ์ˆ˜์ค€ โ†’ ๊ถŒํ•œ ๋ชจ๋“œ**. ๊ฐ ๋‹จ๊ณ„๋Š” **"๋‹ค์Œ" ๋ฒ„ํŠผ**์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ํด๋” ๋ธŒ๋ผ์šฐ์ €๋Š” **์ƒ์œ„/๋‹ค๋ฅธ ๋ณผ๋ฅจ๊นŒ์ง€ ์ด๋™ ยท ์ƒˆ ํด๋” ์ƒ์„ฑ ยท ์ด์ „ ์„ธ์…˜ ์žฌ๊ฐœ**๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ํด๋” ์ด๋ฆ„์œผ๋กœ **์ „์šฉ ์„ธ์…˜ ์ฑ„๋„(`proj-<ํด๋”>`)์ด ์ƒˆ๋กœ ์ƒ์„ฑ**๋˜๊ณ  ๊ทธ ์ฑ„๋„์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค.
156
+ 4. ๋งŒ๋“ค์–ด์ง„ ์„ธ์…˜ ์ฑ„๋„์—์„œ **๊ทธ๋ƒฅ ๋ฉ”์‹œ์ง€๋กœ ๋Œ€ํ™”**ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Claude ๋ชจ๋“œ๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ์ถœ๋ ฅยทํˆด ์‹คํ–‰ ์Šค๋ ˆ๋“œยท๊ถŒํ•œ ์Šน์ธ ๋ฒ„ํŠผ์ด ๋œน๋‹ˆ๋‹ค.
157
+ 5. ํ•„์š”ํ•  ๋•Œ ๋ช…๋ น์–ด ์‚ฌ์šฉ.
158
+
159
+ ### ์ฃผ์š” ๋ช…๋ น์–ด
160
+ | ๋ช…๋ น์–ด | ์„ค๋ช… |
161
+ |---|---|
162
+ | `/init` | (๊ด€๋ฆฌ์ž) ์ปจํŠธ๋กค ์ฑ„๋„ + ์„ธ์…˜ ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ (์žฌ์‹คํ–‰ ์‹œ ์žฌ์‚ฌ์šฉ) |
163
+ | `/agent start` | ์ƒˆ ์„ธ์…˜ ์‹œ์ž‘ โ€” ๋งˆ๋ฒ•์‚ฌ ํ™•์ธ ์‹œ ์ „์šฉ ์„ธ์…˜ ์ฑ„๋„์„ ์ƒˆ๋กœ ์ƒ์„ฑ |
164
+ | `/agent resume` | ์ด์ „ ์„ธ์…˜ ์ด์–ดํ•˜๊ธฐ |
165
+ | `/agent close` | ์„ธ์…˜ ์ข…๋ฃŒ + ์„ธ์…˜ ์ฑ„๋„ ์‚ญ์ œ |
166
+ | `/agent stats` | ํ™œ์„ฑ ์„ธ์…˜ ยท ์„ธ์…˜ ํ†ต๊ณ„ ยท Claude ์‚ฌ์šฉ๋Ÿ‰ ๋ณด๊ธฐ (๋ณธ์ธ์—๊ฒŒ๋งŒ ํ‘œ์‹œ) |
167
+ | `/mode <claude\|codex>` | ๋ฐฑ์—”๋“œ ์ „ํ™˜ (โš ๏ธ ์ƒˆ ๋Œ€ํ™”๋กœ ์‹œ์ž‘ โ€” ์ด์ „ ๋งฅ๋ฝ ๋ฏธ์Šน๊ณ„) |
168
+ | `/mode perm <๋ชจ๋“œ\|ํ”„๋กœํ•„>` | ๊ถŒํ•œ ๋ชจ๋“œ/ํ”„๋กœํ•„ ์ „ํ™˜ (์„ธ์…˜ ์œ ์ง€) |
169
+ | `/stop` | ํ˜„์žฌ ์„ธ์…˜ ์ฆ‰์‹œ ์ค‘๋‹จ (ํ‚ฌ ์Šค์œ„์น˜) |
170
+ | `/stop-all` | (๊ด€๋ฆฌ์ž) ๋ชจ๋“  ์„ธ์…˜ ์ค‘๋‹จ |
171
+ | `/config` | (๊ด€๋ฆฌ์ž) ์—ญํ•  ํ‹ฐ์–ด + ๊ธฐ๋ณธ๊ฐ’(๋ฐฑ์—”๋“œยท๋ชจ๋ธยท๊ถŒํ•œ ๋ชจ๋“œยท์–ธ์–ดยทCodex ๊ฒฝ๋กœ) ์„ค์ • โ€” ์—ญํ• ์€ **ํด๋ฆญ**, ๊ธฐ๋ณธ๊ฐ’์€ ๋“œ๋กญ๋‹ค์šด/๋ชจ๋‹ฌ์—์„œ ์ง€์ • |
172
+
173
+ ### ๊ถŒํ•œ ๋ชจ๋“œ (์„ธ์…˜์ด ์–ผ๋งˆ๋‚˜ ์ž์œจ์ ์ธ์ง€)
174
+ - `default` โ€” ๋„๊ตฌ ์‹คํ–‰ ์ „๋งˆ๋‹ค **Allow/Deny ๋ฒ„ํŠผ**์œผ๋กœ ํ™•์ธ (๊ฐ€์žฅ ์•ˆ์ „)
175
+ - `acceptEdits` โ€” ํŒŒ์ผ ์ˆ˜์ •์€ ์ž๋™ ์ˆ˜๋ฝ
176
+ - `plan` โ€” ๋จผ์ € ๊ณ„ํš๋งŒ ์„ธ์šฐ๊ณ  ์‹คํ–‰์€ ๋ณด๋ฅ˜
177
+ - `bypassPermissions` โ€” ์ „๋ถ€ ์ž๋™ (์‹ ๋ขฐํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋งŒ)
178
+
179
+ (Codex๋Š” CLI์˜ ์Šน์ธยท์ƒŒ๋“œ๋ฐ•์Šค ๋ชจ๋“œ๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.)
180
+
181
+ ### ์ด๋ฒคํŠธ ์•Œ๋ฆผ (`#agent-status`)
182
+
183
+ ์—ฌ๋Ÿฌ ์„ธ์…˜์˜ **์ž‘์—… ์™„๋ฃŒยท์—๋Ÿฌ**๋ฅผ `#agent-status` ์ฑ„๋„ ํ•œ ๊ณณ์— ๋ชจ์•„ ์š”์•ฝํ•ด ์•Œ๋ ค์ค๋‹ˆ๋‹ค. `/config` โ†’ **๐Ÿ”” ์•Œ๋ฆผ ์„ค์ •** ์—์„œ ์ผœ๊ธฐ/๋„๊ธฐ์™€ ๋Œ€์ƒ ์ฑ„๋„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
184
+
185
+ ---
186
+
187
+ ## ๊ถŒํ•œ & ์—ญํ•  ์„ค์ • (์ค‘์š”)
188
+
189
+ ์ด ๋ด‡์€ **๋‹น์‹  PC์—์„œ, ๋‹น์‹  ๊ณ„์ • ๊ถŒํ•œ์œผ๋กœ** ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋ด‡์—๊ฒŒ ๋ช…๋ นํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์€ **๋‹น์‹  ์ปดํ“จํ„ฐ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ**์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์—ญํ•  ํ†ต์ œ๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
190
+
191
+ - **์—ญํ•  ํ‹ฐ์–ด 3๋‹จ๊ณ„** โ€” Discord์—์„œ **`/config`** ๋กœ ์—ญํ•  ์ด๋ฆ„์„ **ํด๋ฆญ**ํ•ด ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(์—ญํ•  IDยท๊ฐœ๋ฐœ์ž ๋ชจ๋“œ ๋ถˆํ•„์š”). admin โЇ execute โЇ read-only:
192
+ - **admin** โ€” ์„ค์ •/`stop-all`/`config` ๋“ฑ ๊ด€๋ฆฌ
193
+ - **execute** โ€” ์„ธ์…˜ ์‹œ์ž‘ยท๋ช…๋ น ์‹คํ–‰
194
+ - **read-only** โ€” ์ฝ๊ธฐ๋งŒ
195
+ - > `/config` ๋Š” ์ฒ˜์Œ์—” **์„œ๋ฒ„ ๊ด€๋ฆฌ์ž(Administrator)** ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋งŒ ์—ด ์ˆ˜ ์žˆ๊ณ (ํ—ˆ์šฉ ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ์–ด๋„ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๊ฐ€๋Šฅ), ์ดํ›„์—” admin ํ‹ฐ์–ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
196
+ - **๊ธฐ๋ณธ์€ ๊ฑฐ๋ถ€(deny-by-default)** โ€” ํ—ˆ์šฉ ๋ชฉ๋ก์— ์—†๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๊ฒƒ๋„ ๋ชป ํ•ฉ๋‹ˆ๋‹ค. `/config` ๋กœ ์ง€์ •ํ•˜๊ธฐ ์ „์—๋Š” ์•„๋ฌด๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
197
+ - **ํ”„๋กœ์ ํŠธ๋ณ„ ์ ‘๊ทผ ์ œ์–ด(ACL)** โ€” ํŠน์ • ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์ •ํ•œ ์—ญํ• /์‚ฌ๋žŒ๋งŒ ์“ฐ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
198
+ - **๊ฐ์‚ฌ ๋กœ๊ทธ** โ€” ๋ˆ„๊ฐ€ ์–ธ์ œ ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ `~/.discord-agent-bridge/audit/` ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.
199
+
200
+ > โš ๏ธ **๋ณด์•ˆ ์ฃผ์˜:** ์‹ ๋ขฐํ•˜์ง€ ์•Š๋Š” ์„œ๋ฒ„์— ๋ด‡์„ ์ดˆ๋Œ€ํ•˜๊ฑฐ๋‚˜ execute ์—ญํ• ์„ ๋„ˆ๋ฌด ๋„“๊ฒŒ ์ฃผ์ง€ ๋งˆ์„ธ์š”. ์ž‘์—… ํด๋” ๋ฐ–(์˜ˆ: `~/.ssh`)์€ ๋ด‡์ด ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๊ธฐ๋ณธ ์ฐจ๋‹จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
201
+
202
+ ---
203
+
204
+ ## Claude ๋ชจ๋“œ vs Codex ๋ชจ๋“œ
205
+
206
+ | | Claude ๋ชจ๋“œ | Codex ๋ชจ๋“œ |
207
+ |---|---|---|
208
+ | ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ | โœ… | โŒ (์ตœ์ข… ๊ฒฐ๊ณผ ์œ„์ฃผ) |
209
+ | ํˆด ์‹คํ–‰ ์Šค๋ ˆ๋“œ | โœ… | โŒ |
210
+ | ๊ถŒํ•œ ์Šน์ธ ๋ฒ„ํŠผ | โœ… | โŒ (์Šน์ธ/์ƒŒ๋“œ๋ฐ•์Šค ๋ชจ๋“œ๋กœ ๋Œ€์ฒด) |
211
+ | ์„ธ์…˜ ์ด์–ดํ•˜๊ธฐ | โœ… | โœ… |
212
+ | **์‚ฌ์šฉ๋Ÿ‰/ํ•œ๋„ ํ‘œ์‹œ** | โœ… (5์‹œ๊ฐ„ยท์ฃผ๊ฐ„ยท์ปจํ…์ŠคํŠธ) | โŒ (Codex CLI ์ œ์•ฝ) |
213
+
214
+ ### ํ„ฐ๋ฏธ๋„์—์„œ ์“ฐ๋˜ ๊ฑฐ๋ž‘ ๋˜‘๊ฐ™๋‚˜์š”?
215
+
216
+ - **Claude ๋ชจ๋“œ** โ€” ํ„ฐ๋ฏธ๋„์˜ `claude`์™€ **๊ฐ™์€ ์—”์ง„**(๊ณต์‹ Claude Agent SDK)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ `.claude/` ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ์ฝ์–ด **์„œ๋ธŒ์—์ด์ „ํŠธยท์Šคํ‚ฌยทํ›…ยทMCP๊ฐ€ ๋™์ผํ•˜๊ฒŒ** ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹ฌ๋ผ์ง€๋Š” ๊ฑด ์ž…๋ ฅ์ด Discord ๋ฉ”์‹œ์ง€, ์ถœ๋ ฅ์ด ์ž„๋ฒ ๋“œ/์Šค๋ ˆ๋“œ๋ผ๋Š” **ํ‘œํ˜„ ๋ฐฉ์‹**๋ฟ์ž…๋‹ˆ๋‹ค. (ํ„ฐ๋ฏธ๋„์—์„œ ํƒ€์ดํ•‘ํ•˜๋Š” TUI ์ „์šฉ ์Šฌ๋ž˜์‹œ ๋ช…๋ น์€ ๊ทธ๋Œ€๋กœ ์น˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ SDK ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.)
217
+ - **Codex ๋ชจ๋“œ** โ€” `codex exec`(๋น„๋Œ€ํ™”ํ˜•)๋กœ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ Codex ์—”์ง„์— ์„ค์ •/MCP๋ฅผ ๋กœ๋“œํ•˜๋ฉฐ, **ํ›…(SessionStart/UserPromptSubmit/Stop ๋“ฑ)๋„ ๋น„๋Œ€ํ™”ํ˜• ๋ชจ๋“œ์—์„œ ์ •์ƒ ๋ฐœ๋™ํ•จ์„ ์‹ค์ธก ํ™•์ธ**ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์Šน์ธ ๋ฐฉ์‹์€ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ชจ๋“œ์™€ ๋‹ค๋ฅด๊ฒŒ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค(์•„๋ž˜ ๊ถŒํ•œ ๋ชจ๋“œ ์ฐธ๊ณ ).
218
+
219
+ ### ์ปค์Šคํ…€ ์Šฌ๋ž˜์‹œ ๋ช…๋ น / ์Šคํ‚ฌ / ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ช…๋ น
220
+
221
+ ์„ธ์…˜ ์ฑ„๋„์— ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€๋Š” ๊ฐ€๊ณต ์—†์ด ๊ทธ๋Œ€๋กœ Claude/Codex์— ์ „๋‹ฌ๋˜๋ฏ€๋กœ, **`.claude/commands/`ยท`.claude/skills/`(Claude) ๋˜๋Š” `.codex/skills/`(Codex)์— ์ •์˜๋œ ๋ช…๋ นยท์Šคํ‚ฌ, ๊ทธ๋ฆฌ๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ํ•œ ๋ช…๋ น**๋„ ํ„ฐ๋ฏธ๋„๊ณผ ๋˜‘๊ฐ™์ด `/์ด๋ฆ„` ์„ ๊ทธ๋Œ€๋กœ ํƒ€์ดํ•‘ํ•˜๋ฉด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค(Claude/Codex ์‹ค์ œ CLI๋กœ ์‹ค์ธก ๊ฒ€์ฆ๋จ). Discord ์ž์ฒด ์Šฌ๋ž˜์‹œ ๋ช…๋ น(`/agent`, `/config` ๋“ฑ)๊ณผ๋Š” ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ์„ธ์…˜ ์ฑ„๋„์˜ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
222
+
223
+ ---
224
+
225
+ ## ์„ค์ • ํŒŒ์ผ ์œ„์น˜
226
+
227
+ ```
228
+ ~/.discord-agent-bridge/
229
+ โ”œโ”€ config.json # ๋ด‡ ํ† ํฐยทClient IDยท๊ธฐ๋ณธ๊ฐ’ยทํ•œ๋„ (๊ถŒํ•œ 600)
230
+ โ”œโ”€ servers/<guildId>.json # ์„œ๋ฒ„๋ณ„ ์—ญํ•  ํ‹ฐ์–ดยท๊ธฐ๋ณธ๊ฐ’ ยท ์ฑ„๋„ ๊ตฌ์กฐ(control/sessions/status) ID ยท ์•Œ๋ฆผ ์„ค์ • (๊ถŒํ•œ 600)
231
+ โ”œโ”€ state.json # ์ฑ„๋„โ†”์„ธ์…˜ ๋ฐ”์ธ๋”ฉ (์žฌ์‹œ์ž‘ ํ›„ ์ž๋™ ๋ณต๊ตฌ)
232
+ โ””โ”€ audit/audit.jsonl # ๊ฐ์‚ฌ ๋กœ๊ทธ
233
+ ```
234
+ ์„ค์ •์€ **์ „์—ญ โ†’ ์„œ๋ฒ„ โ†’ ํ”„๋กœ์ ํŠธ** ์ˆœ์œผ๋กœ ๋ฎ์–ด์จ์ง‘๋‹ˆ๋‹ค.
235
+
236
+ ---
237
+
238
+ ## ๋ฌธ์ œ ํ•ด๊ฒฐ
239
+
240
+ - **๋ด‡์ด ๋ฉ”์‹œ์ง€์— ๋ฐ˜์‘ํ•˜์ง€ ์•Š์•„์š”** โ†’ Developer Portal์—์„œ **Message Content Intent**๊ฐ€ ์ผœ์ ธ ์žˆ๋Š”์ง€ ํ™•์ธ.
241
+ - **์Šฌ๋ž˜์‹œ ๋ช…๋ น์ด ์•ˆ ๋ณด์—ฌ์š”** โ†’ ์ดˆ๋Œ€ ์‹œ `applications.commands` ์Šค์ฝ”ํ”„๋ฅผ ํฌํ•จํ–ˆ๋Š”์ง€ ํ™•์ธ(๋“ฑ๋ก์— ๋ช‡ ๋ถ„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Œ).
242
+ - **๊ถŒํ•œ ์˜ค๋ฅ˜๋กœ ์ฑ„๋„ ์ƒ์„ฑ ์‹คํŒจ** โ†’ ๋ด‡์—๊ฒŒ `Manage Channels` ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธ.
243
+ - **์‚ฌ์šฉ๋Ÿ‰ ํŒจ๋„์ด ์•ˆ ๋– ์š”** โ†’ Claude Pro/Max **๊ตฌ๋… ๋กœ๊ทธ์ธ**(`~/.claude`) ์ƒํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. API ํ‚ค๋งŒ ์“ฐ๋ฉด ์ด ํŒจ๋„์€ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค(์ •์ƒ).
244
+ - **"๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค: No authorized role for this actor (fail-secure)."** โ†’ ์ ‘์†ํ•œ ๊ณ„์ •์— ํ—ˆ์šฉ ๋ชฉ๋ก(admin/execute/read-only)์— ๋“ฑ๋ก๋œ ์—ญํ• ์ด ํ•˜๋‚˜๋„ ์—†๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ด ๊ฑฐ๋ถ€(deny-by-default)๋ผ ์ด๋ ‡๊ฒŒ ๋‚˜์˜ต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋กœ ํ•ด๊ฒฐํ•˜์„ธ์š”:
245
+ 1. **๊ฐ€์žฅ ๊ฐ„๋‹จ** โ€” ๊ทธ ๊ณ„์ •์— Discord **์„œ๋ฒ„ ๊ด€๋ฆฌ์ž(Administrator)** ๊ถŒํ•œ์„ ๋ถ€์—ฌ. ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž๋Š” ํ—ˆ์šฉ ๋ชฉ๋ก๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ admin ํ‹ฐ์–ด๋กœ ๋ฌด์กฐ๊ฑด ํ†ต๊ณผ๋ฉ๋‹ˆ๋‹ค.
246
+ 2. **์ด๋ฏธ ์ง€์ •๋œ ์—ญํ•  ๋ถ€์—ฌ** โ€” Discord ์„œ๋ฒ„์˜ ๊ตฌ์„ฑ์› ํ™”๋ฉด์—์„œ, `/config`์— ํ‹ฐ์–ด๋กœ ์ด๋ฏธ ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ์—ญํ• ์„ ๊ทธ ๊ณ„์ •์— ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค.
247
+ 3. **์—ญํ• ์„ ํ‹ฐ์–ด์— ์ถ”๊ฐ€** โ€” ๊ด€๋ฆฌ์ž ๊ณ„์ •์—์„œ `/config` โ†’ **์—ญํ•  ํ‹ฐ์–ด** ๋กœ ๋“ค์–ด๊ฐ€, ๊ทธ ๊ณ„์ •์ด ๊ฐ€์ง„ ์—ญํ• ์„ ์›ํ•˜๋Š” ํ‹ฐ์–ด(admin/execute/read-only)์— ํด๋ฆญํ•ด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
248
+
249
+ ---
250
+
251
+ ## ๊ฐœ๋ฐœ
252
+
253
+ ```bash
254
+ npm install
255
+ npm run dev # tsx watch (๊ฐœ๋ฐœ ๋ชจ๋“œ)
256
+ npm run typecheck # ํƒ€์ž… ๊ฒ€์‚ฌ
257
+ npm run test # ํ…Œ์ŠคํŠธ (vitest)
258
+ ```
259
+
260
+ ## ๋ผ์ด์„ ์Šค
261
+
262
+ MIT