discord-agent-bridge 0.2.0 โ†’ 0.4.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.
Files changed (43) hide show
  1. package/README.ko.md +386 -0
  2. package/README.md +302 -116
  3. package/dist/app.js +7 -10
  4. package/dist/app.js.map +1 -1
  5. package/dist/cli.js +11 -4
  6. package/dist/cli.js.map +1 -1
  7. package/dist/core/configResolver.js +4 -0
  8. package/dist/core/configResolver.js.map +1 -1
  9. package/dist/core/configSchema.js +8 -0
  10. package/dist/core/configSchema.js.map +1 -1
  11. package/dist/core/providerCatalog.js +10 -35
  12. package/dist/core/providerCatalog.js.map +1 -1
  13. package/dist/core/sessionOrchestrator.js +148 -4
  14. package/dist/core/sessionOrchestrator.js.map +1 -1
  15. package/dist/discord/configPanel.js +38 -6
  16. package/dist/discord/configPanel.js.map +1 -1
  17. package/dist/discord/format.js +30 -11
  18. package/dist/discord/format.js.map +1 -1
  19. package/dist/discord/i18n.js +4 -0
  20. package/dist/discord/i18n.js.map +1 -1
  21. package/dist/discord/interactionRouter.js +32 -8
  22. package/dist/discord/interactionRouter.js.map +1 -1
  23. package/dist/discord/renderers/index.js +63 -11
  24. package/dist/discord/renderers/index.js.map +1 -1
  25. package/dist/discord/renderers/streamEmbed.js +11 -0
  26. package/dist/discord/renderers/streamEmbed.js.map +1 -1
  27. package/dist/modes/claude/session.js +6 -0
  28. package/dist/modes/claude/session.js.map +1 -1
  29. package/dist/modes/codex/index.js +3 -0
  30. package/dist/modes/codex/index.js.map +1 -1
  31. package/dist/service/index.js +140 -0
  32. package/dist/service/index.js.map +1 -0
  33. package/dist/service/launchd.js +106 -0
  34. package/dist/service/launchd.js.map +1 -0
  35. package/dist/service/runScript.js +37 -0
  36. package/dist/service/runScript.js.map +1 -0
  37. package/dist/service/schtasks.js +78 -0
  38. package/dist/service/schtasks.js.map +1 -0
  39. package/dist/service/systemd.js +87 -0
  40. package/dist/service/systemd.js.map +1 -0
  41. package/dist/service/types.js +10 -0
  42. package/dist/service/types.js.map +1 -0
  43. package/package.json +2 -2
package/README.ko.md ADDED
@@ -0,0 +1,386 @@
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
+ ### ์„ค์น˜ & ์ž๋™ ์‹คํ–‰ (๊ถŒ์žฅ)
59
+
60
+ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์„ธ ์ค„์ด๋ฉด ์„ค์น˜๋ถ€ํ„ฐ ์žฌ๋ถ€ํŒ… ์ž๋™ ์‹คํ–‰๊นŒ์ง€ ๋๋‚ฉ๋‹ˆ๋‹ค. `service install` ์ด ํ˜„์žฌ OS์— ๋งž๋Š” ์ž๋™ ์‹คํ–‰์„ ์•Œ์•„์„œ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค โ€” **macOS๋Š” launchd, Linux๋Š” systemd, Windows๋Š” ์ž‘์—… ์Šค์ผ€์ค„๋Ÿฌ**.
61
+
62
+ ```bash
63
+ npm install -g discord-agent-bridge # ์„ค์น˜
64
+ discord-agent-bridge --setup # ์ตœ์ดˆ 1ํšŒ (ํ† ํฐ ๋“ฑ ์ž…๋ ฅ)
65
+ discord-agent-bridge service install # ์ž๋™ ์‹คํ–‰ ๋“ฑ๋ก + ์ฆ‰์‹œ ์‹œ์ž‘
66
+ ```
67
+
68
+ ๊ด€๋ฆฌ ๋ช…๋ น:
69
+
70
+ ```bash
71
+ discord-agent-bridge service status # ๋“ฑ๋ก/์‹คํ–‰ ์ƒํƒœ
72
+ discord-agent-bridge service restart # ์žฌ์‹œ์ž‘
73
+ discord-agent-bridge service uninstall # ๋“ฑ๋ก ํ•ด์ œ
74
+ ```
75
+
76
+ ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” ์ตœ์‹  ์„ค์น˜ ํ›„ ์žฌ์‹œ์ž‘:
77
+
78
+ ```bash
79
+ npm install -g discord-agent-bridge@latest
80
+ discord-agent-bridge service restart
81
+ ```
82
+
83
+ > โš ๏ธ **Windows ์ฐธ๊ณ **: ์ž‘์—… ์Šค์ผ€์ค„๋Ÿฌ ๋กœ๊ทธ์˜จ ํŠธ๋ฆฌ๊ฑฐ๋กœ ๋“ฑ๋ก๋˜์–ด **๋กœ๊ทธ์ธ ์‹œ ์ž๋™ ์‹œ์ž‘**๋ฉ๋‹ˆ๋‹ค(๊ด€๋ฆฌ์ž ๊ถŒํ•œ ๋ถˆํ•„์š”). ๋‹จ, ํฌ๋ž˜์‹œ ์‹œ ์ž๋™ ์žฌ์‹œ์ž‘์€ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(macOSยทLinux๋Š” ๋ณด์žฅ). `service install` ์ด ์•ˆ ๋˜๋ฉด ์•„๋ž˜ **์ˆ˜๋™ ์„ค์ • โ€” Windows (์ž‘์—… ์Šค์ผ€์ค„๋Ÿฌ)** ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
84
+
85
+ ---
86
+
87
+ ์•„๋ž˜๋ถ€ํ„ฐ๋Š” `service install` ์ด ๋™์ž‘ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ง์ ‘ ์„ค์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ์˜ **์ˆ˜๋™ ๋ฐฉ๋ฒ•**์ž…๋‹ˆ๋‹ค.
88
+
89
+ ### ์ˆ˜๋™ ์„ค์ • โ€” macOS (launchd)
90
+
91
+ macOS ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ด€๋ฆฌ์ž์ธ **launchd** ๋กœ ๋ด‡์„ ์ง์ ‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค โ€” ๋กœ๊ทธ์ธํ•˜๋ฉด ์ž๋™ ์‹œ์ž‘๋˜๊ณ , ๊บผ์ง€๋ฉด ์ž๋™์œผ๋กœ ๋˜์‚ด์•„๋‚ฉ๋‹ˆ๋‹ค.
92
+
93
+ ```bash
94
+ # 1) ์ „์—ญ ์„ค์น˜ (์•„์ง์ด๋ฉด ์…‹์—…๋„ ํ•œ ๋ฒˆ)
95
+ npm install -g discord-agent-bridge
96
+ discord-agent-bridge --setup # ์ด๋ฏธ ์„ค์ •ํ–ˆ์œผ๋ฉด ์ƒ๋žต
97
+
98
+ # 2) ์‹คํ–‰ ๋ž˜ํผ ์ƒ์„ฑ โ€” nvm์˜ default node๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์œผ๋ฏ€๋กœ node ๋ฒ„์ „์ด ๋ฐ”๋€Œ์–ด๋„ ๊ทธ๋Œ€๋กœ ๋™์ž‘
99
+ mkdir -p ~/.discord-agent-bridge
100
+ cat > ~/.discord-agent-bridge/run.sh <<'EOF'
101
+ #!/bin/bash
102
+ export NVM_DIR="$HOME/.nvm"
103
+ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
104
+ nvm use default >/dev/null 2>&1 || nvm use node >/dev/null 2>&1
105
+ exec discord-agent-bridge
106
+ EOF
107
+ chmod +x ~/.discord-agent-bridge/run.sh
108
+ # nvm์„ ์•ˆ ์“ด๋‹ค๋ฉด run.sh ๋Š” `#!/bin/bash` ์™€ `exec discord-agent-bridge` ๋‘ ์ค„์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค(PATH์— node๊ฐ€ ์žˆ์–ด์•ผ ํ•จ).
109
+
110
+ # 3) LaunchAgent ๋“ฑ๋ก ํŒŒ์ผ ์ƒ์„ฑ ($HOME ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ์‹œ์ ์— ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค)
111
+ cat > ~/Library/LaunchAgents/com.discord-agent-bridge.plist <<EOF
112
+ <?xml version="1.0" encoding="UTF-8"?>
113
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
114
+ <plist version="1.0">
115
+ <dict>
116
+ <key>Label</key><string>com.discord-agent-bridge</string>
117
+ <key>ProgramArguments</key>
118
+ <array>
119
+ <string>/bin/bash</string>
120
+ <string>$HOME/.discord-agent-bridge/run.sh</string>
121
+ </array>
122
+ <key>EnvironmentVariables</key>
123
+ <dict><key>HOME</key><string>$HOME</string></dict>
124
+ <key>RunAtLoad</key><true/>
125
+ <key>KeepAlive</key><true/>
126
+ <key>StandardOutPath</key><string>$HOME/.discord-agent-bridge/agent.out.log</string>
127
+ <key>StandardErrorPath</key><string>$HOME/.discord-agent-bridge/agent.err.log</string>
128
+ </dict>
129
+ </plist>
130
+ EOF
131
+
132
+ # 4) ์‹œ์ž‘
133
+ launchctl load -w ~/Library/LaunchAgents/com.discord-agent-bridge.plist
134
+
135
+ # 5) ํ™•์ธ โ€” 'gateway ready' ๊ฐ€ ๋œจ๋ฉด ์„ฑ๊ณต (Ctrl+C ๋กœ ๋กœ๊ทธ ๋ณด๊ธฐ๋งŒ ๋น ์ ธ๋‚˜์˜ด, ๋ด‡์€ ๊ณ„์† ๋Ž)
136
+ tail -f ~/.discord-agent-bridge/agent.out.log
137
+ ```
138
+
139
+ ๊ด€๋ฆฌ ๋ช…๋ น:
140
+
141
+ ```bash
142
+ launchctl list | grep discord-agent-bridge # ์ƒํƒœ (1์—ด PID, 2์—ด ๋งˆ์ง€๋ง‰ ์ข…๋ฃŒ์ฝ”๋“œ)
143
+ launchctl unload ~/Library/LaunchAgents/com.discord-agent-bridge.plist # ์ค‘์ง€
144
+ launchctl load -w ~/Library/LaunchAgents/com.discord-agent-bridge.plist # ์‹œ์ž‘
145
+ ```
146
+
147
+ ์—…๊ทธ๋ ˆ์ด๋“œ:
148
+
149
+ ```bash
150
+ npm install -g discord-agent-bridge@latest
151
+ launchctl unload ~/Library/LaunchAgents/com.discord-agent-bridge.plist
152
+ launchctl load -w ~/Library/LaunchAgents/com.discord-agent-bridge.plist
153
+ ```
154
+
155
+ > โš ๏ธ nvm์œผ๋กœ **node ๋ฒ„์ „์„ ๋ฐ”๊พธ๋ฉด** ๊ทธ ๋ฒ„์ „์—์„œ `npm install -g discord-agent-bridge` ๋ฅผ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜์„ธ์š”(nvm ์ „์—ญ ํŒจํ‚ค์ง€๋Š” ๋ฒ„์ „๋ณ„๋กœ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค). ๋ž˜ํผ๊ฐ€ default node๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฏ€๋กœ plist ์ž์ฒด๋Š” ๊ณ ์น  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
156
+
157
+ ### ์ˆ˜๋™ ์„ค์ • โ€” Windows (์ž‘์—… ์Šค์ผ€์ค„๋Ÿฌ)
158
+
159
+ `discord-agent-bridge service install` ์ด ์•ˆ ๋  ๋•Œ ์ง์ ‘ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
160
+
161
+ **๋ช…๋ น์–ด (๊ด€๋ฆฌ์ž ๊ถŒํ•œ ๋ถˆํ•„์š”)** โ€” ๋จผ์ € PowerShell์—์„œ ๋ด‡ ์‹ค์ œ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜์„ธ์š”:
162
+
163
+ ```powershell
164
+ where.exe discord-agent-bridge # ์˜ˆ: C:\Users\<๋‚˜>\AppData\Roaming\npm\discord-agent-bridge.cmd
165
+
166
+ # ์œ„์—์„œ ํ™•์ธํ•œ ๊ฒฝ๋กœ๋กœ ๋กœ๊ทธ์˜จ ์‹œ ์ž๋™ ์‹คํ–‰ ๋“ฑ๋ก
167
+ schtasks /create /tn discord-agent-bridge /sc onlogon /tr "C:\Users\<๋‚˜>\AppData\Roaming\npm\discord-agent-bridge.cmd" /f
168
+ schtasks /query /tn discord-agent-bridge # ์ƒํƒœ ํ™•์ธ
169
+ schtasks /run /tn discord-agent-bridge # ์ง€๊ธˆ ๋ฐ”๋กœ ์‹œ์ž‘
170
+ schtasks /delete /tn discord-agent-bridge /f # ํ•ด์ œ
171
+ ```
172
+
173
+ **GUI ๋กœ ํ•˜๋ ค๋ฉด**: ์‹œ์ž‘ ๋ฉ”๋‰ด โ†’ **์ž‘์—… ์Šค์ผ€์ค„๋Ÿฌ** โ†’ **๊ธฐ๋ณธ ์ž‘์—… ๋งŒ๋“ค๊ธฐ** โ†’ ์ด๋ฆ„ `discord-agent-bridge`, ํŠธ๋ฆฌ๊ฑฐ **๋กœ๊ทธ์˜จํ•  ๋•Œ**, ๋™์ž‘ **ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘** โ†’ ์œ„ `where.exe` ๋กœ ํ™•์ธํ•œ `.cmd` ๊ฒฝ๋กœ ์ž…๋ ฅ โ†’ ๋งˆ์นจ.
174
+
175
+ > onlogon ์ž‘์—…์€ **๋กœ๊ทธ์ธ ์‹œ** ์‹คํ–‰์ด๋ฉฐ **ํฌ๋ž˜์‹œ ์‹œ ์ž๋™ ์žฌ์‹œ์ž‘์€ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** ํฌ๋ž˜์‹œ ์ž๋™ ๋ณต๊ตฌยท๋กœ๊ทธ์ธ ์ „ ์‹คํ–‰๊นŒ์ง€ ์›ํ•˜๋ฉด ์ง„์งœ Windows ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค โ€” [nssm](https://nssm.cc/) ์œผ๋กœ ๋“ฑ๋กํ•˜์„ธ์š”(๊ด€๋ฆฌ์ž ๊ถŒํ•œ ํ•„์š”):
176
+ >
177
+ > ```powershell
178
+ > nssm install discord-agent-bridge "C:\Program Files\nodejs\node.exe" "C:\Users\<๋‚˜>\AppData\Roaming\npm\node_modules\discord-agent-bridge\dist\cli.js"
179
+ > nssm start discord-agent-bridge
180
+ > ```
181
+
182
+ ### ์ˆ˜๋™ ์„ค์ • โ€” PM2 (Linux ยท Windows ๋Œ€์•ˆ)
183
+
184
+ LinuxยทWindows์—์„œ๋Š” [PM2](https://pm2.keymetrics.io/) ๋ฅผ ์จ๋„ ๋ฉ๋‹ˆ๋‹ค(๋กœ๊ทธยท์žฌ์‹œ์ž‘ยท์ƒํƒœ ํ™•์ธ์ด ํŽธ๋ฆฌ). **macOS์—์„œ๋Š” PM2 ๋Œ€์‹  ์œ„ `service install`/launchd ๋ฅผ ์“ฐ์„ธ์š”** โ€” PM2์˜ fork ๋ž˜ํผ๊ฐ€ macOS์—์„œ ๋ด‡์˜ ๊ฒŒ์ดํŠธ์›จ์ด ์—ฐ๊ฒฐ์„ ๋ง‰๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
185
+
186
+ ```bash
187
+ # 1) ์ „์—ญ ์„ค์น˜ (PM2๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ปค๋งจ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•จ)
188
+ npm install -g discord-agent-bridge
189
+
190
+ # 2) ์•„์ง ์…‹์—… ์•ˆ ํ–ˆ๋‹ค๋ฉด ํ•œ ๋ฒˆ ์‹คํ–‰
191
+ discord-agent-bridge --setup
192
+
193
+ # 3) PM2 ์„ค์น˜
194
+ npm install -g pm2
195
+
196
+ # 4) PM2์— ๋ด‡์„ ๋“ฑ๋กยท์‹คํ–‰
197
+ pm2 start discord-agent-bridge --name discord-agent-bridge
198
+
199
+ # 5) ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค ๋ชฉ๋ก์„ ์Šค๋ƒ…์ƒท ์ €์žฅ (์žฌ๋ถ€ํŒ… ์‹œ ๋ณต๊ตฌ ๋Œ€์ƒ)
200
+ pm2 save
201
+
202
+ # 6) ๋ถ€ํŒ… ์‹œ PM2 ์ž๋™ ์‹œ์ž‘ ๋“ฑ๋ก (macOS๋Š” launchd๋กœ ๋“ฑ๋ก๋จ)
203
+ pm2 startup
204
+ # โ†‘ ์ถœ๋ ฅ๋˜๋Š” `sudo ...` ๋ช…๋ น์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜์„ธ์š”.
205
+ ```
206
+
207
+ ์ผ์ƒ์ ์ธ ๊ด€๋ฆฌ ๋ช…๋ น:
208
+
209
+ ```bash
210
+ pm2 status # ์‹คํ–‰ ์ƒํƒœ
211
+ pm2 logs discord-agent-bridge # ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ
212
+ pm2 restart discord-agent-bridge # ์žฌ์‹œ์ž‘ (์—…๊ทธ๋ ˆ์ด๋“œ ํ›„์—๋„ ์‚ฌ์šฉ)
213
+ pm2 stop discord-agent-bridge # ์ค‘์ง€
214
+ pm2 delete discord-agent-bridge # ๋“ฑ๋ก ํ•ด์ œ
215
+ ```
216
+
217
+ PM2 ์ƒํƒœ์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œ:
218
+
219
+ ```bash
220
+ npm install -g discord-agent-bridge@latest
221
+ pm2 restart discord-agent-bridge
222
+ ```
223
+
224
+ > โš ๏ธ nvm/asdf๋ฅผ ์“ด๋‹ค๋ฉด, PM2๊ฐ€ ๋ถ€ํŒ… ์‹œ์ ์—๋„ ์…ธ์—์„œ ์“ฐ๋Š” ๊ฒƒ๊ณผ **๊ฐ™์€ `node`** ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. `which node`๋กœ ํ™•์ธํ•œ ๊ฒฝ๋กœ๊ฐ€ ๋ถ€ํŒ… ํ™˜๊ฒฝ์—์„œ๋„ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค โ€” ์•„๋‹ˆ๋ฉด ์žฌ๋ถ€ํŒ… ํ›„ PM2๊ฐ€ ๋ด‡์„ ๋ชป ๋„์›๋‹ˆ๋‹ค.
225
+
226
+ ### npx๋กœ ์‹คํ–‰ (๋น ๋ฅด๊ฒŒ ์‹œํ—˜ํ•ด๋ณด๊ธฐ)
227
+
228
+ ์„ค์น˜ ์—†์ด ๋ฐ”๋กœ ํ•œ ๋ฒˆ ๋„์›Œ๋ณด๊ณ  ์‹ถ์„ ๋•Œ ์“ฐ์„ธ์š”. `npx` ๊ฐ€ ์ตœ์‹  ๋ฒ„์ „์„ ๋ฐ›์•„ ์‹คํ–‰ํ•˜๋ฉฐ, ์ตœ์ดˆ ์‹คํ–‰์ด๋ฉด ์…‹์—… ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋จผ์ € ๋œฌ ๋’ค ์ด์–ด์„œ ๋ด‡์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. (ํ„ฐ๋ฏธ๋„์„ ๋‹ซ์œผ๋ฉด ๋ด‡๋„ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค โ€” ๊ณ„์† ์ผœ๋‘๋ ค๋ฉด ์œ„ PM2 ๋ฐฉ์‹์„ ์“ฐ์„ธ์š”.)
229
+
230
+ ```bash
231
+ # ์ตœ์ดˆ ์‹คํ–‰ โ€” ์…‹์—… ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋œฌ ๋’ค ์ด์–ด์„œ ๋ด‡์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
232
+ # (ํ† ํฐ/Client ID ์ž…๋ ฅ, ์ธํ…ํŠธ ํ™•์ธ, ์ดˆ๋Œ€ ๋งํฌ ์ƒ์„ฑ โ€” ๊ธฐ๋ณธ๊ฐ’์€ ์•ˆ ๋ฌผ์–ด๋ด„)
233
+ npx discord-agent-bridge
234
+
235
+ # ์ดํ›„ ์‹คํ–‰ โ€” ์ด๋ฏธ ์„ค์ •๋ผ ์žˆ์œผ๋ฉด ๋ฐ”๋กœ ๋ด‡์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
236
+ npx discord-agent-bridge
237
+
238
+ # ๋‹ค์‹œ ์„ค์ •๋งŒ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ (๋ด‡์€ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Œ)
239
+ npx discord-agent-bridge --setup
240
+ ```
241
+
242
+ ์ „์—ญ ์„ค์น˜๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค: `npm install -g discord-agent-bridge` ํ›„ `discord-agent-bridge` / `discord-agent-bridge --setup`.
243
+
244
+ ### ์—…๊ทธ๋ ˆ์ด๋“œ
245
+
246
+ ์ƒˆ ๋ฒ„์ „์ด ๋‚˜์˜ค๋ฉด:
247
+
248
+ ```bash
249
+ # npx ์‚ฌ์šฉ์ž โ€” @latest ๋ฅผ ๋ถ™์ด๋ฉด ํ•ญ์ƒ ์ตœ์‹ ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค(npx๋Š” ์บ์‹œ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์–ด์š”).
250
+ npx discord-agent-bridge@latest
251
+
252
+ # ์ „์—ญ ์„ค์น˜ ์‚ฌ์šฉ์ž
253
+ npm install -g discord-agent-bridge@latest
254
+ ```
255
+
256
+ ์„ค์น˜๋œ ๋ฒ„์ „ ํ™•์ธ: `discord-agent-bridge --version`.
257
+
258
+ **์…‹์—… ๋งˆ๋ฒ•์‚ฌ(`--setup`)** ๊ฐ€ ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ โ€” **ํ† ํฐ(๋น„๋ฐ€)๋งŒ ํ„ฐ๋ฏธ๋„์—์„œ ์ž…๋ ฅ**ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ ๊ฐ’์€ ํ•˜๋‚˜๋„ ์•ˆ ๋ฌผ์–ด๋ด…๋‹ˆ๋‹ค:
259
+ 1. Discord ๋ด‡ **ํ† ํฐ** (๋น„๋ฐ€ โ†’ ํ„ฐ๋ฏธ๋„์—์„œ๋งŒ ๋ถ™์—ฌ๋„ฃ๊ธฐ)
260
+ 2. **Client ID**
261
+ 3. Message Content Intent ์ผฐ๋Š”์ง€ ํ™•์ธ
262
+ 4. ์ดˆ๋Œ€ URL ์ƒ์„ฑ โ†’ ์„œ๋ฒ„์— ์ดˆ๋Œ€
263
+
264
+ > **์—ญํ• ๋„, ๊ธฐ๋ณธ๊ฐ’๋„ ํ„ฐ๋ฏธ๋„์—์„œ ์•ˆ ์ •ํ•ฉ๋‹ˆ๋‹ค.** ๋ด‡์„ ์„œ๋ฒ„์— ์ดˆ๋Œ€ํ•œ ๋’ค Discord์—์„œ **`/config`** ๋ช…๋ น์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”:
265
+ > - **์—ญํ•  ํ‹ฐ์–ด** โ€” ์—ญํ•  ์ด๋ฆ„์„ **ํด๋ฆญ**ํ•ด ์ง€์ •(์—ญํ•  ID ๋ณต์‚ฌยท๊ฐœ๋ฐœ์ž ๋ชจ๋“œ ๋ถˆํ•„์š”). ์ง€์ • ์ „์—๋Š” **๋ชจ๋‘ ๊ฑฐ๋ถ€(deny-by-default)**.
266
+ > - **๊ธฐ๋ณธ๊ฐ’** โ€” **๊ธฐ๋ณธ ๋ฐฑ์—”๋“œยท๋ชจ๋ธยท๊ถŒํ•œ ๋ชจ๋“œยท์–ธ์–ด(locale)** ๋Š” ๋“œ๋กญ๋‹ค์šด์—์„œ ๊ณ ๋ฅด๋ฉด **๋ฐ”๋กœ ์ €์žฅ**๋˜๊ณ , **Codex ๊ธฐ๋ณธ ๊ฒฝ๋กœ(codexHome)** ๋Š” "Codex ๊ฒฝ๋กœ ์„ค์ •" ๋ฒ„ํŠผ โ†’ ์ž…๋ ฅ์ฐฝ(๋ชจ๋‹ฌ)์—์„œ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด๋Š” `ํ•œ๊ตญ์–ด (ko)` / `English (en)` ์ค‘์—์„œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
267
+
268
+ ์„ค์ •์€ `~/.discord-agent-bridge/` ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค(ํ† ํฐ ํŒŒ์ผ ๊ถŒํ•œ 600). ์—ญํ• ยท๊ธฐ๋ณธ๊ฐ’์€ ์„œ๋ฒ„๋ณ„๋กœ `servers/<guildId>.json` ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
269
+
270
+ ---
271
+
272
+ ## 3๋‹จ๊ณ„ โ€” Discord์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ
273
+
274
+ ๋ด‡์ด ์„œ๋ฒ„์— ๋“ค์–ด์˜ค๋ฉด **์ปจํŠธ๋กค ์ฑ„๋„(`#session-generator`) ยท ์„ธ์…˜ ์นดํ…Œ๊ณ ๋ฆฌ ยท ์•Œ๋ฆผ ์ฑ„๋„(`#agent-status`)์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ**๋ฉ๋‹ˆ๋‹ค(๋ด‡์— ์ฑ„๋„ ๊ด€๋ฆฌ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด). ์ดํ›„ ์ˆœ์„œ: **`/config` โ†’ `/agent start`**.
275
+
276
+ 1. **(์ž๋™)** ๋ด‡ ์‹œ์ž‘ยท์„œ๋ฒ„ ์ดˆ๋Œ€ ์‹œ ์œ„ ์ฑ„๋„ ๊ตฌ์กฐ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๊ฐ€ **`/init`** ์œผ๋กœ ์ˆ˜๋™ ์žฌ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(๊ธฐ์กด ์ฑ„๋„์€ ์žฌ์‚ฌ์šฉ โ€” ์ค‘๋ณต ์ƒ์„ฑ ์—†์Œ).
277
+ 2. **`/config`** (๊ด€๋ฆฌ์ž) โ†’ ์—ญํ•  ํ‹ฐ์–ดยท๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. (์„œ๋ฒ„ ๊ด€๋ฆฌ์ž(Administrator)๋Š” ์—ญํ•  ์„ค์ • ์—†์ด๋„ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
278
+ 3. `#session-generator` ์—์„œ **`/agent start`** โ†’ **๋งˆ๋ฒ•์‚ฌ**๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค:
279
+ **์ž‘์—… ํด๋” ์„ ํƒ โ†’ ๋ฐฑ์—”๋“œ(Claude / Codex) โ†’ ๋ชจ๋ธ โ†’ ์ถ”๋ก  ์ˆ˜์ค€ โ†’ ๊ถŒํ•œ ๋ชจ๋“œ**. ๊ฐ ๋‹จ๊ณ„๋Š” **"๋‹ค์Œ" ๋ฒ„ํŠผ**์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ํด๋” ๋ธŒ๋ผ์šฐ์ €๋Š” **์ƒ์œ„/๋‹ค๋ฅธ ๋ณผ๋ฅจ๊นŒ์ง€ ์ด๋™ ยท ์ƒˆ ํด๋” ์ƒ์„ฑ ยท ์ด์ „ ์„ธ์…˜ ์žฌ๊ฐœ**๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ํด๋” ์ด๋ฆ„์œผ๋กœ **์ „์šฉ ์„ธ์…˜ ์ฑ„๋„(`proj-<ํด๋”>`)์ด ์ƒˆ๋กœ ์ƒ์„ฑ**๋˜๊ณ  ๊ทธ ์ฑ„๋„์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค.
280
+ 4. ๋งŒ๋“ค์–ด์ง„ ์„ธ์…˜ ์ฑ„๋„์—์„œ **๊ทธ๋ƒฅ ๋ฉ”์‹œ์ง€๋กœ ๋Œ€ํ™”**ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Claude ๋ชจ๋“œ๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ์ถœ๋ ฅยทํˆด ์‹คํ–‰ ์Šค๋ ˆ๋“œยท๊ถŒํ•œ ์Šน์ธ ๋ฒ„ํŠผ์ด ๋œน๋‹ˆ๋‹ค.
281
+ 5. ํ•„์š”ํ•  ๋•Œ ๋ช…๋ น์–ด ์‚ฌ์šฉ.
282
+
283
+ ### ์ฃผ์š” ๋ช…๋ น์–ด
284
+ | ๋ช…๋ น์–ด | ์„ค๋ช… |
285
+ |---|---|
286
+ | `/init` | (๊ด€๋ฆฌ์ž) ์ปจํŠธ๋กค ์ฑ„๋„ + ์„ธ์…˜ ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ (์žฌ์‹คํ–‰ ์‹œ ์žฌ์‚ฌ์šฉ) |
287
+ | `/agent start` | ์ƒˆ ์„ธ์…˜ ์‹œ์ž‘ โ€” ๋งˆ๋ฒ•์‚ฌ ํ™•์ธ ์‹œ ์ „์šฉ ์„ธ์…˜ ์ฑ„๋„์„ ์ƒˆ๋กœ ์ƒ์„ฑ |
288
+ | `/agent resume` | ์ด์ „ ์„ธ์…˜ ์ด์–ดํ•˜๊ธฐ |
289
+ | `/agent close` | ์„ธ์…˜ ์ข…๋ฃŒ + ์„ธ์…˜ ์ฑ„๋„ ์‚ญ์ œ |
290
+ | `/agent stats` | ํ™œ์„ฑ ์„ธ์…˜ ยท ์„ธ์…˜ ํ†ต๊ณ„ ยท Claude ์‚ฌ์šฉ๋Ÿ‰ ๋ณด๊ธฐ (๋ณธ์ธ์—๊ฒŒ๋งŒ ํ‘œ์‹œ) |
291
+ | `/mode <claude\|codex>` | ๋ฐฑ์—”๋“œ ์ „ํ™˜ (โš ๏ธ ์ƒˆ ๋Œ€ํ™”๋กœ ์‹œ์ž‘ โ€” ์ด์ „ ๋งฅ๋ฝ ๋ฏธ์Šน๊ณ„) |
292
+ | `/mode perm <๋ชจ๋“œ\|ํ”„๋กœํ•„>` | ๊ถŒํ•œ ๋ชจ๋“œ/ํ”„๋กœํ•„ ์ „ํ™˜ (์„ธ์…˜ ์œ ์ง€) |
293
+ | `/stop` | ํ˜„์žฌ ์„ธ์…˜ ์ฆ‰์‹œ ์ค‘๋‹จ (ํ‚ฌ ์Šค์œ„์น˜) |
294
+ | `/stop-all` | (๊ด€๋ฆฌ์ž) ๋ชจ๋“  ์„ธ์…˜ ์ค‘๋‹จ |
295
+ | `/config` | (๊ด€๋ฆฌ์ž) ์—ญํ•  ํ‹ฐ์–ด + ๊ธฐ๋ณธ๊ฐ’(๋ฐฑ์—”๋“œยท๋ชจ๋ธยท๊ถŒํ•œ ๋ชจ๋“œยท์–ธ์–ดยทCodex ๊ฒฝ๋กœ) ์„ค์ • โ€” ์—ญํ• ์€ **ํด๋ฆญ**, ๊ธฐ๋ณธ๊ฐ’์€ ๋“œ๋กญ๋‹ค์šด/๋ชจ๋‹ฌ์—์„œ ์ง€์ • |
296
+
297
+ ### ๊ถŒํ•œ ๋ชจ๋“œ (์„ธ์…˜์ด ์–ผ๋งˆ๋‚˜ ์ž์œจ์ ์ธ์ง€)
298
+ - `default` โ€” ๋„๊ตฌ ์‹คํ–‰ ์ „๋งˆ๋‹ค **Allow/Deny ๋ฒ„ํŠผ**์œผ๋กœ ํ™•์ธ (๊ฐ€์žฅ ์•ˆ์ „)
299
+ - `acceptEdits` โ€” ํŒŒ์ผ ์ˆ˜์ •์€ ์ž๋™ ์ˆ˜๋ฝ
300
+ - `plan` โ€” ๋จผ์ € ๊ณ„ํš๋งŒ ์„ธ์šฐ๊ณ  ์‹คํ–‰์€ ๋ณด๋ฅ˜
301
+ - `bypassPermissions` โ€” ์ „๋ถ€ ์ž๋™ (์‹ ๋ขฐํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋งŒ)
302
+
303
+ (Codex๋Š” CLI์˜ ์Šน์ธยท์ƒŒ๋“œ๋ฐ•์Šค ๋ชจ๋“œ๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.)
304
+
305
+ ### ์ด๋ฒคํŠธ ์•Œ๋ฆผ (`#agent-status`)
306
+
307
+ ์—ฌ๋Ÿฌ ์„ธ์…˜์˜ **์ž‘์—… ์™„๋ฃŒยท์—๋Ÿฌ**๋ฅผ `#agent-status` ์ฑ„๋„ ํ•œ ๊ณณ์— ๋ชจ์•„ ์š”์•ฝํ•ด ์•Œ๋ ค์ค๋‹ˆ๋‹ค. `/config` โ†’ **๐Ÿ”” ์•Œ๋ฆผ ์„ค์ •** ์—์„œ ์ผœ๊ธฐ/๋„๊ธฐ์™€ ๋Œ€์ƒ ์ฑ„๋„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
308
+
309
+ ---
310
+
311
+ ## ๊ถŒํ•œ & ์—ญํ•  ์„ค์ • (์ค‘์š”)
312
+
313
+ ์ด ๋ด‡์€ **๋‹น์‹  PC์—์„œ, ๋‹น์‹  ๊ณ„์ • ๊ถŒํ•œ์œผ๋กœ** ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋ด‡์—๊ฒŒ ๋ช…๋ นํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์€ **๋‹น์‹  ์ปดํ“จํ„ฐ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ**์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์—ญํ•  ํ†ต์ œ๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
314
+
315
+ - **์—ญํ•  ํ‹ฐ์–ด 3๋‹จ๊ณ„** โ€” Discord์—์„œ **`/config`** ๋กœ ์—ญํ•  ์ด๋ฆ„์„ **ํด๋ฆญ**ํ•ด ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(์—ญํ•  IDยท๊ฐœ๋ฐœ์ž ๋ชจ๋“œ ๋ถˆํ•„์š”). admin โЇ execute โЇ read-only:
316
+ - **admin** โ€” ์„ค์ •/`stop-all`/`config` ๋“ฑ ๊ด€๋ฆฌ
317
+ - **execute** โ€” ์„ธ์…˜ ์‹œ์ž‘ยท๋ช…๋ น ์‹คํ–‰
318
+ - **read-only** โ€” ์ฝ๊ธฐ๋งŒ
319
+ - > `/config` ๋Š” ์ฒ˜์Œ์—” **์„œ๋ฒ„ ๊ด€๋ฆฌ์ž(Administrator)** ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋งŒ ์—ด ์ˆ˜ ์žˆ๊ณ (ํ—ˆ์šฉ ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ์–ด๋„ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๊ฐ€๋Šฅ), ์ดํ›„์—” admin ํ‹ฐ์–ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
320
+ - **๊ธฐ๋ณธ์€ ๊ฑฐ๋ถ€(deny-by-default)** โ€” ํ—ˆ์šฉ ๋ชฉ๋ก์— ์—†๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๊ฒƒ๋„ ๋ชป ํ•ฉ๋‹ˆ๋‹ค. `/config` ๋กœ ์ง€์ •ํ•˜๊ธฐ ์ „์—๋Š” ์•„๋ฌด๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
321
+ - **ํ”„๋กœ์ ํŠธ๋ณ„ ์ ‘๊ทผ ์ œ์–ด(ACL)** โ€” ํŠน์ • ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์ •ํ•œ ์—ญํ• /์‚ฌ๋žŒ๋งŒ ์“ฐ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
322
+ - **๊ฐ์‚ฌ ๋กœ๊ทธ** โ€” ๋ˆ„๊ฐ€ ์–ธ์ œ ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ `~/.discord-agent-bridge/audit/` ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.
323
+
324
+ > โš ๏ธ **๋ณด์•ˆ ์ฃผ์˜:** ์‹ ๋ขฐํ•˜์ง€ ์•Š๋Š” ์„œ๋ฒ„์— ๋ด‡์„ ์ดˆ๋Œ€ํ•˜๊ฑฐ๋‚˜ execute ์—ญํ• ์„ ๋„ˆ๋ฌด ๋„“๊ฒŒ ์ฃผ์ง€ ๋งˆ์„ธ์š”. ์ž‘์—… ํด๋” ๋ฐ–(์˜ˆ: `~/.ssh`)์€ ๋ด‡์ด ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๊ธฐ๋ณธ ์ฐจ๋‹จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
325
+
326
+ ---
327
+
328
+ ## Claude ๋ชจ๋“œ vs Codex ๋ชจ๋“œ
329
+
330
+ | | Claude ๋ชจ๋“œ | Codex ๋ชจ๋“œ |
331
+ |---|---|---|
332
+ | ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ | โœ… | โŒ (์ตœ์ข… ๊ฒฐ๊ณผ ์œ„์ฃผ) |
333
+ | ํˆด ์‹คํ–‰ ์Šค๋ ˆ๋“œ | โœ… | โŒ |
334
+ | ๊ถŒํ•œ ์Šน์ธ ๋ฒ„ํŠผ | โœ… | โŒ (์Šน์ธ/์ƒŒ๋“œ๋ฐ•์Šค ๋ชจ๋“œ๋กœ ๋Œ€์ฒด) |
335
+ | ์„ธ์…˜ ์ด์–ดํ•˜๊ธฐ | โœ… | โœ… |
336
+ | **์‚ฌ์šฉ๋Ÿ‰/ํ•œ๋„ ํ‘œ์‹œ** | โœ… (5์‹œ๊ฐ„ยท์ฃผ๊ฐ„ยท์ปจํ…์ŠคํŠธ) | โŒ (Codex CLI ์ œ์•ฝ) |
337
+
338
+ ### ํ„ฐ๋ฏธ๋„์—์„œ ์“ฐ๋˜ ๊ฑฐ๋ž‘ ๋˜‘๊ฐ™๋‚˜์š”?
339
+
340
+ - **Claude ๋ชจ๋“œ** โ€” ํ„ฐ๋ฏธ๋„์˜ `claude`์™€ **๊ฐ™์€ ์—”์ง„**(๊ณต์‹ Claude Agent SDK)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ `.claude/` ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ์ฝ์–ด **์„œ๋ธŒ์—์ด์ „ํŠธยท์Šคํ‚ฌยทํ›…ยทMCP๊ฐ€ ๋™์ผํ•˜๊ฒŒ** ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹ฌ๋ผ์ง€๋Š” ๊ฑด ์ž…๋ ฅ์ด Discord ๋ฉ”์‹œ์ง€, ์ถœ๋ ฅ์ด ์ž„๋ฒ ๋“œ/์Šค๋ ˆ๋“œ๋ผ๋Š” **ํ‘œํ˜„ ๋ฐฉ์‹**๋ฟ์ž…๋‹ˆ๋‹ค. (ํ„ฐ๋ฏธ๋„์—์„œ ํƒ€์ดํ•‘ํ•˜๋Š” TUI ์ „์šฉ ์Šฌ๋ž˜์‹œ ๋ช…๋ น์€ ๊ทธ๋Œ€๋กœ ์น˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ SDK ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.)
341
+ - **Codex ๋ชจ๋“œ** โ€” `codex exec`(๋น„๋Œ€ํ™”ํ˜•)๋กœ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ Codex ์—”์ง„์— ์„ค์ •/MCP๋ฅผ ๋กœ๋“œํ•˜๋ฉฐ, **ํ›…(SessionStart/UserPromptSubmit/Stop ๋“ฑ)๋„ ๋น„๋Œ€ํ™”ํ˜• ๋ชจ๋“œ์—์„œ ์ •์ƒ ๋ฐœ๋™ํ•จ์„ ์‹ค์ธก ํ™•์ธ**ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์Šน์ธ ๋ฐฉ์‹์€ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ชจ๋“œ์™€ ๋‹ค๋ฅด๊ฒŒ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค(์•„๋ž˜ ๊ถŒํ•œ ๋ชจ๋“œ ์ฐธ๊ณ ).
342
+
343
+ ### ์ปค์Šคํ…€ ์Šฌ๋ž˜์‹œ ๋ช…๋ น / ์Šคํ‚ฌ / ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ช…๋ น
344
+
345
+ ์„ธ์…˜ ์ฑ„๋„์— ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€๋Š” ๊ฐ€๊ณต ์—†์ด ๊ทธ๋Œ€๋กœ Claude/Codex์— ์ „๋‹ฌ๋˜๋ฏ€๋กœ, **`.claude/commands/`ยท`.claude/skills/`(Claude) ๋˜๋Š” `.codex/skills/`(Codex)์— ์ •์˜๋œ ๋ช…๋ นยท์Šคํ‚ฌ, ๊ทธ๋ฆฌ๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ํ•œ ๋ช…๋ น**๋„ ํ„ฐ๋ฏธ๋„๊ณผ ๋˜‘๊ฐ™์ด `/์ด๋ฆ„` ์„ ๊ทธ๋Œ€๋กœ ํƒ€์ดํ•‘ํ•˜๋ฉด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค(Claude/Codex ์‹ค์ œ CLI๋กœ ์‹ค์ธก ๊ฒ€์ฆ๋จ). Discord ์ž์ฒด ์Šฌ๋ž˜์‹œ ๋ช…๋ น(`/agent`, `/config` ๋“ฑ)๊ณผ๋Š” ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ์„ธ์…˜ ์ฑ„๋„์˜ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
346
+
347
+ ---
348
+
349
+ ## ์„ค์ • ํŒŒ์ผ ์œ„์น˜
350
+
351
+ ```
352
+ ~/.discord-agent-bridge/
353
+ โ”œโ”€ config.json # ๋ด‡ ํ† ํฐยทClient IDยท๊ธฐ๋ณธ๊ฐ’ยทํ•œ๋„ (๊ถŒํ•œ 600)
354
+ โ”œโ”€ servers/<guildId>.json # ์„œ๋ฒ„๋ณ„ ์—ญํ•  ํ‹ฐ์–ดยท๊ธฐ๋ณธ๊ฐ’ ยท ์ฑ„๋„ ๊ตฌ์กฐ(control/sessions/status) ID ยท ์•Œ๋ฆผ ์„ค์ • (๊ถŒํ•œ 600)
355
+ โ”œโ”€ state.json # ์ฑ„๋„โ†”์„ธ์…˜ ๋ฐ”์ธ๋”ฉ (์žฌ์‹œ์ž‘ ํ›„ ์ž๋™ ๋ณต๊ตฌ)
356
+ โ””โ”€ audit/audit.jsonl # ๊ฐ์‚ฌ ๋กœ๊ทธ
357
+ ```
358
+ ์„ค์ •์€ **์ „์—ญ โ†’ ์„œ๋ฒ„ โ†’ ํ”„๋กœ์ ํŠธ** ์ˆœ์œผ๋กœ ๋ฎ์–ด์จ์ง‘๋‹ˆ๋‹ค.
359
+
360
+ ---
361
+
362
+ ## ๋ฌธ์ œ ํ•ด๊ฒฐ
363
+
364
+ - **๋ด‡์ด ๋ฉ”์‹œ์ง€์— ๋ฐ˜์‘ํ•˜์ง€ ์•Š์•„์š”** โ†’ Developer Portal์—์„œ **Message Content Intent**๊ฐ€ ์ผœ์ ธ ์žˆ๋Š”์ง€ ํ™•์ธ.
365
+ - **์Šฌ๋ž˜์‹œ ๋ช…๋ น์ด ์•ˆ ๋ณด์—ฌ์š”** โ†’ ์ดˆ๋Œ€ ์‹œ `applications.commands` ์Šค์ฝ”ํ”„๋ฅผ ํฌํ•จํ–ˆ๋Š”์ง€ ํ™•์ธ(๋“ฑ๋ก์— ๋ช‡ ๋ถ„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Œ).
366
+ - **๊ถŒํ•œ ์˜ค๋ฅ˜๋กœ ์ฑ„๋„ ์ƒ์„ฑ ์‹คํŒจ** โ†’ ๋ด‡์—๊ฒŒ `Manage Channels` ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธ.
367
+ - **์‚ฌ์šฉ๋Ÿ‰ ํŒจ๋„์ด ์•ˆ ๋– ์š”** โ†’ Claude Pro/Max **๊ตฌ๋… ๋กœ๊ทธ์ธ**(`~/.claude`) ์ƒํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. API ํ‚ค๋งŒ ์“ฐ๋ฉด ์ด ํŒจ๋„์€ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค(์ •์ƒ).
368
+ - **"๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค: No authorized role for this actor (fail-secure)."** โ†’ ์ ‘์†ํ•œ ๊ณ„์ •์— ํ—ˆ์šฉ ๋ชฉ๋ก(admin/execute/read-only)์— ๋“ฑ๋ก๋œ ์—ญํ• ์ด ํ•˜๋‚˜๋„ ์—†๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ด ๊ฑฐ๋ถ€(deny-by-default)๋ผ ์ด๋ ‡๊ฒŒ ๋‚˜์˜ต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋กœ ํ•ด๊ฒฐํ•˜์„ธ์š”:
369
+ 1. **๊ฐ€์žฅ ๊ฐ„๋‹จ** โ€” ๊ทธ ๊ณ„์ •์— Discord **์„œ๋ฒ„ ๊ด€๋ฆฌ์ž(Administrator)** ๊ถŒํ•œ์„ ๋ถ€์—ฌ. ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž๋Š” ํ—ˆ์šฉ ๋ชฉ๋ก๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ admin ํ‹ฐ์–ด๋กœ ๋ฌด์กฐ๊ฑด ํ†ต๊ณผ๋ฉ๋‹ˆ๋‹ค.
370
+ 2. **์ด๋ฏธ ์ง€์ •๋œ ์—ญํ•  ๋ถ€์—ฌ** โ€” Discord ์„œ๋ฒ„์˜ ๊ตฌ์„ฑ์› ํ™”๋ฉด์—์„œ, `/config`์— ํ‹ฐ์–ด๋กœ ์ด๋ฏธ ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ์—ญํ• ์„ ๊ทธ ๊ณ„์ •์— ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค.
371
+ 3. **์—ญํ• ์„ ํ‹ฐ์–ด์— ์ถ”๊ฐ€** โ€” ๊ด€๋ฆฌ์ž ๊ณ„์ •์—์„œ `/config` โ†’ **์—ญํ•  ํ‹ฐ์–ด** ๋กœ ๋“ค์–ด๊ฐ€, ๊ทธ ๊ณ„์ •์ด ๊ฐ€์ง„ ์—ญํ• ์„ ์›ํ•˜๋Š” ํ‹ฐ์–ด(admin/execute/read-only)์— ํด๋ฆญํ•ด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
372
+
373
+ ---
374
+
375
+ ## ๊ฐœ๋ฐœ
376
+
377
+ ```bash
378
+ npm install
379
+ npm run dev # tsx watch (๊ฐœ๋ฐœ ๋ชจ๋“œ)
380
+ npm run typecheck # ํƒ€์ž… ๊ฒ€์‚ฌ
381
+ npm run test # ํ…Œ์ŠคํŠธ (vitest)
382
+ ```
383
+
384
+ ## ๋ผ์ด์„ ์Šค
385
+
386
+ MIT