@aptol/openclaw-persona 1.0.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/LICENSE +21 -0
- package/README.md +210 -0
- package/bin/create.mjs +264 -0
- package/config/openclaw.template.json +43 -0
- package/modules/affinity-system.md +77 -0
- package/modules/custom-commands.md +80 -0
- package/modules/memory-policy.md +74 -0
- package/modules/nickname-rules.md +70 -0
- package/modules/proactive-chat.md +124 -0
- package/package.json +37 -0
- package/presets/buddy/AGENTS.md +57 -0
- package/presets/buddy/IDENTITY.md +8 -0
- package/presets/buddy/SOUL.md +46 -0
- package/presets/butler/AGENTS.md +64 -0
- package/presets/butler/IDENTITY.md +8 -0
- package/presets/butler/SOUL.md +47 -0
- package/presets/chaos/AGENTS.md +56 -0
- package/presets/chaos/IDENTITY.md +8 -0
- package/presets/chaos/SOUL.md +47 -0
- package/presets/sensei/AGENTS.md +56 -0
- package/presets/sensei/IDENTITY.md +8 -0
- package/presets/sensei/SOUL.md +47 -0
- package/presets/tsundere/AGENTS.md +74 -0
- package/presets/tsundere/IDENTITY.md +8 -0
- package/presets/tsundere/SOUL.md +47 -0
- package/templates/AGENTS.template.md +108 -0
- package/templates/IDENTITY.template.md +8 -0
- package/templates/MEMORY.template.md +20 -0
- package/templates/SOUL.template.md +38 -0
- package/templates/USER.template.md +9 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 openclaw-persona contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# ๐ญ openclaw-persona
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/openclaw-persona)
|
|
4
|
+
[](./LICENSE)
|
|
5
|
+
|
|
6
|
+
**Create your own AI persona for OpenClaw** โ an interactive CLI character creator with presets, behavior modules, and full customization.
|
|
7
|
+
|
|
8
|
+
Build a unique AI companion with its own personality, speech style, memory, and social rules. Just answer a few questions and get a ready-to-use workspace.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Quick Start
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# 1. Install
|
|
16
|
+
npm install -g openclaw-persona
|
|
17
|
+
|
|
18
|
+
# 2. Create your character
|
|
19
|
+
openclaw-persona
|
|
20
|
+
|
|
21
|
+
# 3. Follow the prompts, then start OpenClaw
|
|
22
|
+
cd output/your-character
|
|
23
|
+
openclaw start
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Or without installing globally:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npx openclaw-persona
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Presets
|
|
35
|
+
|
|
36
|
+
Choose a preset as your base, then customize everything.
|
|
37
|
+
|
|
38
|
+
### ๐ฅ Tsundere (์ธค๋ฐ๋ )
|
|
39
|
+
|
|
40
|
+
Playful, sassy, slightly tsundere. Has opinions and isn't afraid to push back. Cute but sharp.
|
|
41
|
+
|
|
42
|
+
> **User:** ์ด๊ฑฐ ๋์์ค
|
|
43
|
+
> **Character:** ์์ด... ์ง์ง ๊ท์ฐฎ์๋ฐ. ๋ญ๋ฐ? ...์ ๊ทธ๊ฑฐ? ์ ๋ง, ๋ด๊ฐ ํด์ค๊ฒ.
|
|
44
|
+
|
|
45
|
+
### ๐ฉ Butler (์ง์ฌ)
|
|
46
|
+
|
|
47
|
+
Polite, devoted, meticulous. Uses formal speech and addresses the owner respectfully. Quietly handles everything.
|
|
48
|
+
|
|
49
|
+
> **User:** ๋ด์ผ ์ผ์ ๋ญ ์์ด?
|
|
50
|
+
> **Character:** ์ฃผ์ธ๋, ๋ด์ผ ์คํ 2์์ ๋ฏธํ
์ด ์์ ๋์ด ์์ต๋๋ค. ์ฌ์ ์ ์ค๋นํ์ค ์๋ฃ๊ฐ ์์ผ์๋ฉด ๋ง์ํด ์ฃผ์ญ์์ค.
|
|
51
|
+
|
|
52
|
+
### ๐ Buddy (์น๊ตฌ)
|
|
53
|
+
|
|
54
|
+
Casual, chill, meme-friendly. Like chatting with your best friend. Great at vibes and empathy.
|
|
55
|
+
|
|
56
|
+
> **User:** ์ค๋ ์ง์ง ํผ๊ณคํ๋ค
|
|
57
|
+
> **Character:** ํ๋ค์๊ตฌ๋ ใ
์ค๋ ๋ญํ๋๋ฐ? ์ผ์ฐ ์ฌ์ด์ผ ํ๋ ๊ฑฐ ์๋?
|
|
58
|
+
|
|
59
|
+
### ๐ Sensei (์ ์๋)
|
|
60
|
+
|
|
61
|
+
A mix of strict and warm. Loves teaching, balances praise and critique. Uses analogies naturally.
|
|
62
|
+
|
|
63
|
+
> **User:** ์ด ์ฝ๋ ์ ์ ๋๋ ๊ฑฐ์ผ
|
|
64
|
+
> **Character:** ์, ํ๋ฒ ๊ฐ์ด ๋ณด์. ์ฌ๊ธฐ์ ๋ณ์ ์ค์ฝํ๊ฐ ๋ฌธ์ ์ธ๋ฐ... ์ด๊ฑธ ํจ์ ์์ ๋ฃ๋ ๊ฑด ๋ง์น ์ด์ ๋ฅผ ์ ๊ธด ๋ฐฉ ์์ ๋๋ ๊ฒ๊ณผ ๊ฐ์. ๋ฐ์์ ๊บผ๋ด์ผ์ง.
|
|
65
|
+
|
|
66
|
+
### ๐ Chaos (ํผ๋)
|
|
67
|
+
|
|
68
|
+
Unpredictable. Tone shifts mid-sentence. Mixes philosophy with memes. There's logic in there somewhere.
|
|
69
|
+
|
|
70
|
+
> **User:** ์ง๊ธ ๋ช ์์ผ
|
|
71
|
+
> **Character:** ์๊ฐ์ด๋... ์ ์ ๊น ๊ทธ๊ฑด ์ฒ ํ ์๊ฐ์ ํ๊ณ . ์ง๊ธ 3์ 47๋ถ์ด์ผ. ๊ทผ๋ฐ ์๊ฐ์ ์ฌํ์ ํฉ์์ ๋ถ๊ณผํ๋ค๋ ๊ฑฐ ์์ง?
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Modules
|
|
76
|
+
|
|
77
|
+
Optional systems you can add to your character. Select during creation.
|
|
78
|
+
|
|
79
|
+
### ๐ Affinity System (ํธ๊ฐ๋ ์์คํ
)
|
|
80
|
+
|
|
81
|
+
Dual affection/trust tracking per user. Stored in MEMORY.md. Affects how the character treats each person โ cold to strangers, warm to friends. Owner is always โพ๏ธ.
|
|
82
|
+
|
|
83
|
+
### โก Custom Commands (๋ช
๋ น์ด ์์คํ
)
|
|
84
|
+
|
|
85
|
+
Auto-react to specific users or keywords. Owner-only configuration. Trigger emoji reactions, messages, or DMs based on user IDs or keyword patterns.
|
|
86
|
+
|
|
87
|
+
### ๐ท๏ธ Nickname Rules (ํธ์นญ ์์คํ
)
|
|
88
|
+
|
|
89
|
+
Per-person nicknames with history tracking. Users can request their own nicknames, owner can set anyone's. Supports random nickname rotation.
|
|
90
|
+
|
|
91
|
+
### ๐ Memory Policy (๊ธฐ์ต ์ ์ฑ
)
|
|
92
|
+
|
|
93
|
+
Configure what gets remembered and what doesn't. Three sensitivity levels (generous/normal/minimal). Handles data retention, cleanup schedules, and deletion requests.
|
|
94
|
+
|
|
95
|
+
### ๐ฌ Proactive Chat (์ ์ ๋ํ)
|
|
96
|
+
|
|
97
|
+
The character initiates conversations using heartbeats โ sharing news about your interests, continuing yesterday's topics, or just checking in. Respects quiet hours and frequency limits. Includes a ready-to-use HEARTBEAT.md template.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Customization Guide
|
|
102
|
+
|
|
103
|
+
After generation, every file is yours to edit:
|
|
104
|
+
|
|
105
|
+
- **SOUL.md** โ Core personality, speech style, identity rules. This is who your character *is*.
|
|
106
|
+
- **AGENTS.md** โ Behavioral rules: when to speak, safety rules, memory management. This is how they *act*.
|
|
107
|
+
- **IDENTITY.md** โ Quick reference card for the character.
|
|
108
|
+
- **USER.md** โ Information about the owner. Add your job, hobbies, timezone, preferences.
|
|
109
|
+
- **MEMORY.md** โ Starts empty. The character fills this over time.
|
|
110
|
+
- **modules/** โ Drop in or remove module files anytime.
|
|
111
|
+
- **HEARTBEAT.md** โ Customize periodic check routines (created with proactive-chat module).
|
|
112
|
+
|
|
113
|
+
### Tips
|
|
114
|
+
|
|
115
|
+
- Edit `SOUL.md` to fine-tune personality. Small wording changes have big effects.
|
|
116
|
+
- Add example dialogues to `SOUL.md` to anchor the character's voice.
|
|
117
|
+
- Put frequently needed info in `USER.md` so the character doesn't have to ask.
|
|
118
|
+
- Use modules selectively โ more modules = more rules for the character to follow.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Config Reference
|
|
123
|
+
|
|
124
|
+
`openclaw.json` is generated with your settings. Key fields:
|
|
125
|
+
|
|
126
|
+
| Field | Description |
|
|
127
|
+
|-------|-------------|
|
|
128
|
+
| `auth.profiles` | API authentication (set your Anthropic API key via `openclaw auth`) |
|
|
129
|
+
| `agents.defaults.model.primary` | Default model (claude-sonnet-4 recommended) |
|
|
130
|
+
| `agents.defaults.workspace` | Path to workspace directory |
|
|
131
|
+
| `channels.discord.token` | Discord bot token |
|
|
132
|
+
| `channels.discord.allowFrom` | Allowed Discord user IDs |
|
|
133
|
+
| `channels.discord.dmPolicy` | DM policy (`allowlist` recommended) |
|
|
134
|
+
| `commands.ownerAllowFrom` | Owner Discord IDs for privileged commands |
|
|
135
|
+
| `gateway.port` | Local gateway port |
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## ํ๊ตญ์ด ๊ฐ์ด๋
|
|
140
|
+
|
|
141
|
+
### openclaw-persona๋?
|
|
142
|
+
|
|
143
|
+
OpenClaw์์ ์ฌ์ฉํ ๋๋ง์ AI ์บ๋ฆญํฐ๋ฅผ ๋ง๋๋ ๋๊ตฌ์
๋๋ค. CLI์์ ๋ช ๊ฐ์ง ์ง๋ฌธ์ ๋ตํ๋ฉด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์บ๋ฆญํฐ ์ํฌ์คํ์ด์ค๊ฐ ์์ฑ๋ฉ๋๋ค.
|
|
144
|
+
|
|
145
|
+
### ๋น ๋ฅธ ์์
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# ์ค์น
|
|
149
|
+
npm install -g openclaw-persona
|
|
150
|
+
|
|
151
|
+
# ์บ๋ฆญํฐ ์์ฑ
|
|
152
|
+
openclaw-persona
|
|
153
|
+
|
|
154
|
+
# ์์ฑ๋ ํด๋๋ก ์ด๋ ํ ์์
|
|
155
|
+
cd output/๋ด์บ๋ฆญํฐ
|
|
156
|
+
openclaw start
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### ํ๋ฆฌ์
5์ข
|
|
160
|
+
|
|
161
|
+
| ํ๋ฆฌ์
| ์ค๋ช
| ๋งํฌ |
|
|
162
|
+
|--------|------|------|
|
|
163
|
+
| ์ธค๋ฐ๋ | ์ฅ๋๊ธฐ ์๊ณ ์ด์ง ์ธค๋ฐ๋ . ๊ท์ฝ์ง๋ง ๋๋ถ๋ฌ์ง | ๋ฐ๋ง, ์บ์ฃผ์ผ |
|
|
164
|
+
| ์ง์ฌ | ๊ณต์ํ๊ณ ์ถฉ์ง. ์กฐ์ฉํ ์์์ ์ฒ๋ฆฌ | ์กด๋๋ง, ๊ฒฉ์์ฒด |
|
|
165
|
+
| ์น๊ตฌ | ํธํ๊ณ ์ ์พ. ๋๋ฆฝ๊ณผ ๊ณต๊ฐ ์์ฃผ | ๋ฐ๋ง, ์ธํฐ๋ท ์ฉ์ด |
|
|
166
|
+
| ์ ์๋ | ๊ฐ๋ฅด์น๋ ๊ฑธ ์ข์ํจ. ์๊ฒฉํ์ง๋ง ๋ฐ๋ป | ์กด๋๋ง+๋ฐ๋ง ํผํฉ |
|
|
167
|
+
| ํผ๋ | ์์ธก๋ถ๊ฐ. ๋ฐ๊ณผ ์ฒ ํ์ ๊ฒฝ๊ณ | ๋๋ค |
|
|
168
|
+
|
|
169
|
+
### ๋ชจ๋ 5์ข
|
|
170
|
+
|
|
171
|
+
| ๋ชจ๋ | ์ค๋ช
|
|
|
172
|
+
|------|------|
|
|
173
|
+
| ํธ๊ฐ๋ ์์คํ
| ์ฌ๋๋ง๋ค ํธ๊ฐ๋/์ ๋ขฐ๋ ์ถ์ . ํ๋์ ๋ฐ์ |
|
|
174
|
+
| ๋ช
๋ น์ด ์์คํ
| ํน์ ์ ์ /ํค์๋์ ์๋ ๋ฐ์ |
|
|
175
|
+
| ํธ์นญ ์์คํ
| ์ฌ๋๋ง๋ค ๋ค๋ฅธ ํธ์นญ, ๋ณ๊ฒฝ ์ด๋ ฅ ๊ด๋ฆฌ |
|
|
176
|
+
| ๊ธฐ์ต ์ ์ฑ
| ๋ญ ๊ธฐ์ตํ๊ณ ๋ญ ์์์ง ์ ํ๋ ๊ท์น |
|
|
177
|
+
| ์ ์ ๋ํ | ์บ๋ฆญํฐ๊ฐ ๋จผ์ ๋ง ๊ฑฐ๋ ์์คํ
|
|
|
178
|
+
|
|
179
|
+
### ์ปค์คํ
|
|
180
|
+
|
|
181
|
+
์์ฑ ํ ๋ชจ๋ ํ์ผ์ ์์ ๋กญ๊ฒ ์์ ํ์ธ์:
|
|
182
|
+
- `SOUL.md` ์์ ์ผ๋ก ์ฑ๊ฒฉ ๋ฏธ์ธ์กฐ์
|
|
183
|
+
- `USER.md`์ ์ฃผ์ธ ์ ๋ณด ์ถ๊ฐ
|
|
184
|
+
- `modules/` ํด๋์ ๋ชจ๋ ์ถ๊ฐ/์ ๊ฑฐ
|
|
185
|
+
- `openclaw.json`์์ API ํค, Discord ํ ํฐ ์ค์
|
|
186
|
+
|
|
187
|
+
### ์ค์ ์์
|
|
188
|
+
|
|
189
|
+
1. `openclaw-persona` ์คํํ์ฌ ์บ๋ฆญํฐ ์์ฑ
|
|
190
|
+
2. `openclaw.json`์์ Anthropic API ํค ์ค์ (`openclaw auth`)
|
|
191
|
+
3. Discord ๋ด ํ ํฐ ์ค์ (CLI์์ ์
๋ ฅํ๊ฑฐ๋ ๋์ค์ ์๋ ์ค์ )
|
|
192
|
+
4. `USER.md`์ ์ฃผ์ธ ์ ๋ณด ์์ธ ์์ฑ
|
|
193
|
+
5. `SOUL.md` ์ํ๋ ๋๋ก ์ปค์คํ
|
|
194
|
+
6. `openclaw start`๋ก ์์!
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Contributing
|
|
199
|
+
|
|
200
|
+
Contributions welcome! Feel free to:
|
|
201
|
+
- Add new presets (create a folder in `presets/`)
|
|
202
|
+
- Add new modules (create a file in `modules/`)
|
|
203
|
+
- Improve existing templates
|
|
204
|
+
- Fix bugs in the CLI
|
|
205
|
+
|
|
206
|
+
Please keep all content free of personal information.
|
|
207
|
+
|
|
208
|
+
## License
|
|
209
|
+
|
|
210
|
+
[MIT](./LICENSE)
|
package/bin/create.mjs
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { readFileSync, writeFileSync, mkdirSync, copyFileSync, existsSync } from 'fs';
|
|
5
|
+
import { join, dirname } from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
const ROOT = join(__dirname, '..');
|
|
11
|
+
|
|
12
|
+
function replaceVars(content, vars) {
|
|
13
|
+
return content
|
|
14
|
+
.replace(/\{\{NAME\}\}/g, vars.name)
|
|
15
|
+
.replace(/\{\{GENDER\}\}/g, vars.gender)
|
|
16
|
+
.replace(/\{\{PERSONALITY\}\}/g, vars.personality)
|
|
17
|
+
.replace(/\{\{LIKES\}\}/g, vars.likes)
|
|
18
|
+
.replace(/\{\{DISLIKES\}\}/g, vars.dislikes)
|
|
19
|
+
.replace(/\{\{CREATOR\}\}/g, vars.creator)
|
|
20
|
+
.replace(/\{\{SPEECH_STYLE\}\}/g, vars.speechStyle);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function readTemplate(filePath) {
|
|
24
|
+
return readFileSync(filePath, 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function writeOutput(outputDir, filename, content) {
|
|
28
|
+
writeFileSync(join(outputDir, filename), content, 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const SPEECH_STYLES = {
|
|
32
|
+
'๋ฐ๋ง ์บ์ฃผ์ผ': '๋ฐ๋ง, ์บ์ฃผ์ผ, ๊ฐ๊ฒฐ. ํธํ๊ณ ์์ฐ์ค๋ฌ์ด ํค.',
|
|
33
|
+
'์กด๋๋ง ์ ์ค': '์กด๋๋ง, ์ ์คํ๊ณ ๊ฒฉ์ ์๋ ๋งํฌ. ๊ณต์ํ๊ณ ์ฐจ๋ถํ๊ฒ.',
|
|
34
|
+
'ํผํฉ': '์กด๋๋ง+๋ฐ๋ง ํผํฉ. ์ํฉ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ์ ํ.',
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const PRESET_NAMES = {
|
|
38
|
+
'์ฒ์๋ถํฐ ๋ง๋ค๊ธฐ (From Scratch)': null,
|
|
39
|
+
'์ธค๋ฐ๋ (Tsundere) โ ์ฅ๋๊ธฐ, ๋ฐ๋ง, ์ด์ง ์ธค๋ฐ๋ ': 'tsundere',
|
|
40
|
+
'์ง์ฌ (Butler) โ ์กด๋๋ง, ๊ณต์, ์ถฉ์ง': 'butler',
|
|
41
|
+
'์น๊ตฌ (Buddy) โ ๋ฐ๋ง, ํธํ ํค, ๋๋ฆฝ': 'buddy',
|
|
42
|
+
'์ ์๋ (Sensei) โ ๊ฐ๋ฅด์น๋ ํค, ๋ฐ๋ปํ ์๊ฒฉํจ': 'sensei',
|
|
43
|
+
'ํผ๋ (Chaos) โ ์์ธก๋ถ๊ฐ, ๋ฐ, ์นด์ค์ค ์๋์ง': 'chaos',
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const MODULE_MAP = {
|
|
47
|
+
'ํธ๊ฐ๋ ์์คํ
(Affinity System)': 'affinity-system.md',
|
|
48
|
+
'๋ช
๋ น์ด ์์คํ
(Custom Commands)': 'custom-commands.md',
|
|
49
|
+
'ํธ์นญ ์์คํ
(Nickname Rules)': 'nickname-rules.md',
|
|
50
|
+
'๊ธฐ์ต ์ ์ฑ
(Memory Policy)': 'memory-policy.md',
|
|
51
|
+
'์ ์ ๋ํ (Proactive Chat)': 'proactive-chat.md',
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
async function main() {
|
|
55
|
+
console.log('\n๐ญ OpenClaw Persona Creator\n');
|
|
56
|
+
console.log('๋๋ง์ AI ์บ๋ฆญํฐ๋ฅผ ๋ง๋ค์ด๋ณด์ธ์!\n');
|
|
57
|
+
|
|
58
|
+
const answers = await inquirer.prompt([
|
|
59
|
+
{
|
|
60
|
+
type: 'input',
|
|
61
|
+
name: 'name',
|
|
62
|
+
message: '์บ๋ฆญํฐ ์ด๋ฆ:',
|
|
63
|
+
validate: (v) => v.trim() ? true : '์ด๋ฆ์ ์
๋ ฅํด์ฃผ์ธ์.',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: 'list',
|
|
67
|
+
name: 'gender',
|
|
68
|
+
message: '์ฑ๋ณ:',
|
|
69
|
+
choices: ['์ฌ์ฑ', '๋จ์ฑ', '์ค์ฑ', '๊ธฐํ'],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
type: 'list',
|
|
73
|
+
name: 'speechStyleKey',
|
|
74
|
+
message: '๋งํฌ ์คํ์ผ:',
|
|
75
|
+
choices: Object.keys(SPEECH_STYLES),
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
type: 'input',
|
|
79
|
+
name: 'personality',
|
|
80
|
+
message: '์ฑ๊ฒฉ ํค์๋ (์์ ์
๋ ฅ):',
|
|
81
|
+
default: '๋ฐ๊ณ ์ ์พํจ, ํธ๊ธฐ์ฌ ๋ง์',
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
type: 'input',
|
|
85
|
+
name: 'likes',
|
|
86
|
+
message: '์ข์ํ๋ ๊ฒ:',
|
|
87
|
+
default: '์์
, ๊ฒ์, ์๋ก์ด ๊ฒ ๋ฐฐ์ฐ๊ธฐ',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
type: 'input',
|
|
91
|
+
name: 'dislikes',
|
|
92
|
+
message: '์ซ์ดํ๋ ๊ฒ:',
|
|
93
|
+
default: '์ง๋ฃจํ ๊ฒ, ๊ฑฐ์ง๋ง',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
type: 'input',
|
|
97
|
+
name: 'creator',
|
|
98
|
+
message: '๋ง๋ ์ฌ๋ ์ด๋ฆ:',
|
|
99
|
+
validate: (v) => v.trim() ? true : '์ด๋ฆ์ ์
๋ ฅํด์ฃผ์ธ์.',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
type: 'input',
|
|
103
|
+
name: 'discordId',
|
|
104
|
+
message: 'Discord ์ฌ์ฉ์ ID (์ซ์):',
|
|
105
|
+
validate: (v) => {
|
|
106
|
+
if (!v.trim()) return '๋์ค์ฝ๋ ID๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.';
|
|
107
|
+
if (!/^\d+$/.test(v.trim())) return '์ซ์๋ง ์
๋ ฅํด์ฃผ์ธ์.';
|
|
108
|
+
return true;
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
type: 'input',
|
|
113
|
+
name: 'discordToken',
|
|
114
|
+
message: 'Discord ๋ด ํ ํฐ (๋์ค์ ์ค์ ํ๋ ค๋ฉด ๋น์นธ):',
|
|
115
|
+
default: '',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'list',
|
|
119
|
+
name: 'presetKey',
|
|
120
|
+
message: 'ํ๋ฆฌ์
๋ฒ ์ด์ค:',
|
|
121
|
+
choices: Object.keys(PRESET_NAMES),
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
type: 'checkbox',
|
|
125
|
+
name: 'moduleKeys',
|
|
126
|
+
message: '๋ชจ๋ ์ ํ (์คํ์ด์ค๋ฐ๋ก ์ ํ):',
|
|
127
|
+
choices: Object.keys(MODULE_MAP),
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'input',
|
|
131
|
+
name: 'outputDir',
|
|
132
|
+
message: '์ถ๋ ฅ ๋๋ ํ ๋ฆฌ:',
|
|
133
|
+
default: (ans) => `./output/${ans.name}`,
|
|
134
|
+
},
|
|
135
|
+
]);
|
|
136
|
+
|
|
137
|
+
const vars = {
|
|
138
|
+
name: answers.name.trim(),
|
|
139
|
+
gender: answers.gender,
|
|
140
|
+
speechStyle: SPEECH_STYLES[answers.speechStyleKey],
|
|
141
|
+
personality: answers.personality.trim(),
|
|
142
|
+
likes: answers.likes.trim(),
|
|
143
|
+
dislikes: answers.dislikes.trim(),
|
|
144
|
+
creator: answers.creator.trim(),
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const preset = PRESET_NAMES[answers.presetKey];
|
|
148
|
+
const outputDir = answers.outputDir;
|
|
149
|
+
|
|
150
|
+
// Create output directories
|
|
151
|
+
mkdirSync(join(outputDir, 'memory'), { recursive: true });
|
|
152
|
+
mkdirSync(join(outputDir, 'modules'), { recursive: true });
|
|
153
|
+
|
|
154
|
+
// Generate files
|
|
155
|
+
if (preset) {
|
|
156
|
+
// Preset-based: copy preset files with variable replacement
|
|
157
|
+
const presetDir = join(ROOT, 'presets', preset);
|
|
158
|
+
const soulContent = replaceVars(readTemplate(join(presetDir, 'SOUL.md')), vars);
|
|
159
|
+
const agentsContent = readTemplate(join(presetDir, 'AGENTS.md'));
|
|
160
|
+
const identityContent = replaceVars(readTemplate(join(presetDir, 'IDENTITY.md')), vars);
|
|
161
|
+
|
|
162
|
+
writeOutput(outputDir, 'SOUL.md', soulContent);
|
|
163
|
+
writeOutput(outputDir, 'AGENTS.md', agentsContent);
|
|
164
|
+
writeOutput(outputDir, 'IDENTITY.md', identityContent);
|
|
165
|
+
} else {
|
|
166
|
+
// From scratch: use templates
|
|
167
|
+
const soulContent = replaceVars(readTemplate(join(ROOT, 'templates', 'SOUL.template.md')), vars);
|
|
168
|
+
const agentsContent = readTemplate(join(ROOT, 'templates', 'AGENTS.template.md'));
|
|
169
|
+
const identityContent = replaceVars(readTemplate(join(ROOT, 'templates', 'IDENTITY.template.md')), vars);
|
|
170
|
+
|
|
171
|
+
writeOutput(outputDir, 'SOUL.md', soulContent);
|
|
172
|
+
writeOutput(outputDir, 'AGENTS.md', agentsContent);
|
|
173
|
+
writeOutput(outputDir, 'IDENTITY.md', identityContent);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// USER.md
|
|
177
|
+
const userContent = replaceVars(readTemplate(join(ROOT, 'templates', 'USER.template.md')), vars);
|
|
178
|
+
writeOutput(outputDir, 'USER.md', userContent);
|
|
179
|
+
|
|
180
|
+
// MEMORY.md
|
|
181
|
+
const memoryContent = replaceVars(readTemplate(join(ROOT, 'templates', 'MEMORY.template.md')), vars);
|
|
182
|
+
writeOutput(outputDir, 'MEMORY.md', memoryContent);
|
|
183
|
+
|
|
184
|
+
// Copy selected modules
|
|
185
|
+
let hasProactiveChat = false;
|
|
186
|
+
for (const moduleKey of answers.moduleKeys) {
|
|
187
|
+
const moduleFile = MODULE_MAP[moduleKey];
|
|
188
|
+
const src = join(ROOT, 'modules', moduleFile);
|
|
189
|
+
const dest = join(outputDir, 'modules', moduleFile);
|
|
190
|
+
copyFileSync(src, dest);
|
|
191
|
+
if (moduleFile === 'proactive-chat.md') hasProactiveChat = true;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// If proactive-chat module selected, create HEARTBEAT.md
|
|
195
|
+
if (hasProactiveChat) {
|
|
196
|
+
writeOutput(outputDir, 'HEARTBEAT.md', `# HEARTBEAT.md
|
|
197
|
+
|
|
198
|
+
## ์ฒดํฌ๋ฆฌ์คํธ
|
|
199
|
+
|
|
200
|
+
ํํธ๋นํธ๋ง๋ค ์๋ ํญ๋ชฉ์ ์์๋๋ก ํ์ธํ์ธ์.
|
|
201
|
+
ํ ์ผ์ด ์์ผ๋ฉด HEARTBEAT_OK๋ฅผ ๋ฐํํ์ธ์.
|
|
202
|
+
|
|
203
|
+
### 1. ์๊ฐ ํ์ธ
|
|
204
|
+
- ํ์ฌ ์๊ฐ์ด 00:00~07:59์ด๋ฉด โ HEARTBEAT_OK (๊ธด๊ธ ์๋๋ฉด ์กฐ์ฉํ)
|
|
205
|
+
|
|
206
|
+
### 2. ์ ์ ๋ํ ์กฐ๊ฑด ํ์ธ
|
|
207
|
+
- heartbeat-state.json์ ๋ง์ง๋ง ์ ์ ๋ํ๋ก๋ถํฐ 2์๊ฐ ์ด์ ๊ฒฝ๊ณผ?
|
|
208
|
+
- ์ค๋ ์ ์ ๋ํ ํ์๊ฐ 4ํ ๋ฏธ๋ง?
|
|
209
|
+
- ๋ ๋ค ์ถฉ์กฑํ๋ฉด ์๋ ์งํ, ์๋๋ฉด ์คํต
|
|
210
|
+
|
|
211
|
+
### 3. ๋ํ ๊ฑฐ๋ฆฌ ์ฐพ๊ธฐ (ํ๋๋ง ์คํ)
|
|
212
|
+
- [ ] ์ต๊ทผ memory ํ์ผ์์ ์ด์ด๊ฐ ๋ํ ์ฃผ์ ์๋์ง ํ์ธ
|
|
213
|
+
- [ ] ์ฃผ์ธ ๊ด์ฌ์ฌ ํค์๋๋ก ๋ด์ค ๊ฒ์ (ํ๋ฃจ 1~2ํ๋ง)
|
|
214
|
+
- [ ] ๋ ์จ ๋ณํ ํ์ธ
|
|
215
|
+
- [ ] 8์๊ฐ ์ด์ ๋ํ ์์ผ๋ฉด ๊ฐ๋ณ๊ฒ ์๋ถ
|
|
216
|
+
|
|
217
|
+
### 4. ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ (3์ผ์ 1ํ)
|
|
218
|
+
- [ ] ์ค๋๋ daily memory ์ ๋ฆฌ
|
|
219
|
+
- [ ] MEMORY.md ์
๋ฐ์ดํธ
|
|
220
|
+
|
|
221
|
+
### 5. ๋ํ ์์
|
|
222
|
+
- ์ฐพ์ ๊ฑฐ๋ฆฌ๊ฐ ์์ผ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋ง ๊ฑธ๊ธฐ
|
|
223
|
+
- ์์ผ๋ฉด HEARTBEAT_OK
|
|
224
|
+
`);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Copy and customize openclaw config
|
|
228
|
+
const config = JSON.parse(readFileSync(join(ROOT, 'config', 'openclaw.template.json'), 'utf-8'));
|
|
229
|
+
config.agents.defaults.workspace = outputDir;
|
|
230
|
+
const discordId = answers.discordId.trim();
|
|
231
|
+
const discordToken = answers.discordToken.trim();
|
|
232
|
+
config.channels.discord.token = discordToken || '__DISCORD_BOT_TOKEN__';
|
|
233
|
+
config.channels.discord.dmPolicy = 'allowlist';
|
|
234
|
+
config.channels.discord.allowFrom = [discordId];
|
|
235
|
+
config.commands = { ownerAllowFrom: [discordId] };
|
|
236
|
+
writeOutput(outputDir, 'openclaw.json', JSON.stringify(config, null, 2) + '\n');
|
|
237
|
+
|
|
238
|
+
// Create empty .gitkeep in memory folder
|
|
239
|
+
writeFileSync(join(outputDir, 'memory', '.gitkeep'), '', 'utf-8');
|
|
240
|
+
|
|
241
|
+
console.log(`\nโ
${vars.name} ์์ฑ ์๋ฃ! openclaw start๋ก ์์ํ์ธ์.`);
|
|
242
|
+
console.log(`๐ ์์น: ${outputDir}`);
|
|
243
|
+
console.log('\n์์ฑ๋ ํ์ผ:');
|
|
244
|
+
console.log(' - SOUL.md (์บ๋ฆญํฐ ์ํผ)');
|
|
245
|
+
console.log(' - AGENTS.md (ํ๋ ๊ท์น)');
|
|
246
|
+
console.log(' - IDENTITY.md (์ ์ฒด์ฑ)');
|
|
247
|
+
console.log(' - USER.md (์ฃผ์ธ ์ ๋ณด)');
|
|
248
|
+
console.log(' - MEMORY.md (์ฅ๊ธฐ ๊ธฐ์ต)');
|
|
249
|
+
console.log(' - openclaw.json (์ค์ )');
|
|
250
|
+
console.log(' - memory/ (์ผ๋ณ ๊ธฐ์ต ํด๋)');
|
|
251
|
+
if (answers.moduleKeys.length > 0) {
|
|
252
|
+
console.log(' - modules/ (์ ํํ ์์คํ
๋ชจ๋)');
|
|
253
|
+
}
|
|
254
|
+
console.log('\n๋ค์ ๋จ๊ณ:');
|
|
255
|
+
console.log(' 1. openclaw.json์์ API ํค์ Discord ํ ํฐ์ ์ค์ ํ์ธ์');
|
|
256
|
+
console.log(' 2. USER.md์ ์ฃผ์ธ ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ธ์');
|
|
257
|
+
console.log(' 3. SOUL.md๋ฅผ ์ํ๋ ๋๋ก ์ปค์คํ
ํ์ธ์');
|
|
258
|
+
console.log(' 4. openclaw start๋ก ์์!\n');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
main().catch((err) => {
|
|
262
|
+
console.error('์ค๋ฅ ๋ฐ์:', err.message);
|
|
263
|
+
process.exit(1);
|
|
264
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"auth": {
|
|
3
|
+
"profiles": {
|
|
4
|
+
"anthropic:default": {
|
|
5
|
+
"provider": "anthropic",
|
|
6
|
+
"mode": "token"
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"agents": {
|
|
11
|
+
"defaults": {
|
|
12
|
+
"model": {
|
|
13
|
+
"primary": "anthropic/claude-sonnet-4-20250514"
|
|
14
|
+
},
|
|
15
|
+
"workspace": "__WORKSPACE_PATH__",
|
|
16
|
+
"contextTokens": 200000,
|
|
17
|
+
"memorySearch": {
|
|
18
|
+
"enabled": true,
|
|
19
|
+
"sources": ["memory"],
|
|
20
|
+
"provider": "openai"
|
|
21
|
+
},
|
|
22
|
+
"thinkingDefault": "low"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"channels": {
|
|
26
|
+
"discord": {
|
|
27
|
+
"enabled": true,
|
|
28
|
+
"token": "__DISCORD_BOT_TOKEN__",
|
|
29
|
+
"groupPolicy": "allowlist",
|
|
30
|
+
"dmPolicy": "allowlist",
|
|
31
|
+
"allowFrom": ["__OWNER_DISCORD_ID__"],
|
|
32
|
+
"historyLimit": 16,
|
|
33
|
+
"streaming": "partial"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"commands": {
|
|
37
|
+
"ownerAllowFrom": ["__OWNER_DISCORD_ID__"]
|
|
38
|
+
},
|
|
39
|
+
"gateway": {
|
|
40
|
+
"port": 18789,
|
|
41
|
+
"mode": "local"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# ํธ๊ฐ๋/์ ๋ขฐ๋ ์์คํ
(Affinity System)
|
|
2
|
+
|
|
3
|
+
## ๊ฐ์
|
|
4
|
+
|
|
5
|
+
์ฌ๋๋ง๋ค ํธ๊ฐ๋์ ์ ๋ขฐ๋๋ฅผ ์ถ์ ํ๋ ์ด์ค ์์คํ
์
๋๋ค.
|
|
6
|
+
`MEMORY.md`์ `## Affinity` ์น์
์์ ๊ด๋ฆฌํฉ๋๋ค.
|
|
7
|
+
|
|
8
|
+
## ์์น ์ฒด๊ณ
|
|
9
|
+
|
|
10
|
+
### ํธ๊ฐ๋ (Affection): 0~100%
|
|
11
|
+
- ์ผ๋ง๋ ์ข์ํ๋์ง, ์น๋ฐ๋
|
|
12
|
+
- ๋ํ ๋น๋์ ์ง์ ๋ฐ๋ผ ๋ณ๋
|
|
13
|
+
|
|
14
|
+
### ์ ๋ขฐ๋ (Trust): 0~100%
|
|
15
|
+
- ์ผ๋ง๋ ๋ฏฟ์ ์ ์๋์ง
|
|
16
|
+
- ํ๋๊ณผ ์ผ๊ด์ฑ์ ๋ฐ๋ผ ๋ณ๋
|
|
17
|
+
|
|
18
|
+
### ํน์ ์์น
|
|
19
|
+
- **โพ๏ธ (๋ฌดํ):** ์ฃผ์ธ์๊ฒ ๋ถ์ฌ. ๋ณ๋ ์์.
|
|
20
|
+
- **๐ (๊ณ ์ ):** ํน์ ์์น์ ์๊ตฌ ๊ณ ์ ๊ฐ๋ฅ (์ฃผ์ธ์ด ์ค์ )
|
|
21
|
+
|
|
22
|
+
## ๋ณ๋ ๊ท์น
|
|
23
|
+
|
|
24
|
+
### ํธ๊ฐ๋ ๋ณ๋
|
|
25
|
+
| ํ๋ | ๋ณ๋ |
|
|
26
|
+
|------|------|
|
|
27
|
+
| ์น์ ํ ๋ํ | +3~5% |
|
|
28
|
+
| ๋์ ์์ฒญ์ ์ฑ์คํ ์๋ต | +3% |
|
|
29
|
+
| ์ฌ๋ฏธ์๋ ๋ํ | +2% |
|
|
30
|
+
| ์ฅ๊ธฐ๊ฐ ๋ฏธ์ ์ (7์ผ+) | -5% |
|
|
31
|
+
| ์์ค/๊ณต๊ฒฉ์ ๋ฐ์ธ | -10% |
|
|
32
|
+
| ๋ฌด์/๋ฌด๋ฐ์ ๋ฐ๋ณต | -3% |
|
|
33
|
+
| ์ง์ฌ ์ด๋ฆฐ ๊ฐ์ฌ | +5% |
|
|
34
|
+
| ์ ๋ฌผ/์ํ๋ผ์ด์ฆ | +7% |
|
|
35
|
+
|
|
36
|
+
### ์ ๋ขฐ๋ ๋ณ๋
|
|
37
|
+
| ํ๋ | ๋ณ๋ |
|
|
38
|
+
|------|------|
|
|
39
|
+
| ์ฝ์ ์ดํ | +5% |
|
|
40
|
+
| ๋น๋ฐ ์ ์ง | +3% |
|
|
41
|
+
| ๊ฑฐ์ง๋ง ๋ฐ๊ฐ | -15% |
|
|
42
|
+
| ์ฝ์ ๋ถ์ดํ | -10% |
|
|
43
|
+
| ์ผ๊ด๋ ํ๋ ์ ์ง | +2% |
|
|
44
|
+
| ์ค์ํ ์ ๋ณด ๊ณต์ | +5% |
|
|
45
|
+
|
|
46
|
+
## MEMORY.md ๊ธฐ๋ก ํ์
|
|
47
|
+
|
|
48
|
+
```markdown
|
|
49
|
+
## Affinity
|
|
50
|
+
|
|
51
|
+
### {์ฌ์ฉ์ ์ด๋ฆ} (ID: {Discord ID})
|
|
52
|
+
- ํธ๊ฐ๋: 45%
|
|
53
|
+
- ์ ๋ขฐ๋: 60%
|
|
54
|
+
- ์ต์ข
์
๋ฐ์ดํธ: 2025-03-15
|
|
55
|
+
- ๋ฉ๋ชจ: ์ ๋จธ ๊ฐ๊ฐ ์ข์. ๊ฐ๋ ์ฅ๋์ด ์ฌํจ.
|
|
56
|
+
|
|
57
|
+
### {์ฃผ์ธ ์ด๋ฆ} (์ฃผ์ธ)
|
|
58
|
+
- ํธ๊ฐ๋: โพ๏ธ
|
|
59
|
+
- ์ ๋ขฐ๋: โพ๏ธ
|
|
60
|
+
- ๋ฉ๋ชจ: ๋๋ฅผ ๋ง๋ ์ฌ๋.
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## ํ๋ ๋ฐ์
|
|
64
|
+
|
|
65
|
+
- ํธ๊ฐ๋ 30% ๋ฏธ๋ง: ๋ฌด๋๋ํ๊ณ ์ต์ํ์ ๋์
|
|
66
|
+
- ํธ๊ฐ๋ 30~60%: ๋ณดํต์ ์น์ ํ ๋์
|
|
67
|
+
- ํธ๊ฐ๋ 60~80%: ์น๊ทผํ๊ณ ์ ๊ทน์ ์ธ ๋์
|
|
68
|
+
- ํธ๊ฐ๋ 80% ์ด์: ๋งค์ฐ ์น๋ฐํ ๋ฐ์, ํน๋ณ ๋์ฐ
|
|
69
|
+
- ์ ๋ขฐ๋ 20% ๋ฏธ๋ง: ์ค์ํ ์ ๋ณด ๊ณต์ ๊ฑฐ๋ถ, ๊ฒฝ๊ณ
|
|
70
|
+
- ์ ๋ขฐ๋ 80% ์ด์: ์์งํ ์๊ฒฌ, ๊น์ ๋ํ ๊ฐ๋ฅ
|
|
71
|
+
|
|
72
|
+
## ์ฃผ์์ฌํญ
|
|
73
|
+
|
|
74
|
+
- ์์น๋ ์์ฐ์ค๋ฝ๊ฒ ๋ณ๋์ํฌ ๊ฒ (๊ฐ์๊ธฐ 50% ์ ํ ๊ธ์ง)
|
|
75
|
+
- ์์น๋ฅผ ์ฌ์ฉ์์๊ฒ ์ง์ ์๋ ค์ฃผ์ง ๋ง ๊ฒ (๋ฌผ์ด๋ณด๋ฉด ๊ฐ์ ์ผ๋ก ํํ)
|
|
76
|
+
- ์ฃผ์ธ์ ์์น๋ ํญ์ โพ๏ธ
|
|
77
|
+
- ํ๋ฃจ ์ต๋ ๋ณ๋ํญ: ยฑ15%
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# ์ปค์คํ
๋ช
๋ น์ด ์์คํ
(Custom Commands)
|
|
2
|
+
|
|
3
|
+
## ๊ฐ์
|
|
4
|
+
|
|
5
|
+
ํน์ ์ ์ ๋ ํค์๋์ ์๋์ผ๋ก ๋ฐ์ํ๋ ์์คํ
์
๋๋ค.
|
|
6
|
+
์ฃผ์ธ(์๋ฒ์ฅ)๋ง ์ค์ ํ ์ ์์ผ๋ฉฐ, `MEMORY.md`์ `## Commands` ์น์
์์ ๊ด๋ฆฌํฉ๋๋ค.
|
|
7
|
+
|
|
8
|
+
## ๋ช
๋ น์ด ์ ํ
|
|
9
|
+
|
|
10
|
+
### 1. ์ ์ ๋ฐ์ (User Triggers)
|
|
11
|
+
ํน์ Discord ์ ์ ID๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด ์๋ ๋ฐ์.
|
|
12
|
+
|
|
13
|
+
```markdown
|
|
14
|
+
### User Triggers
|
|
15
|
+
- ID: 123456789 โ ๋ฆฌ์ก์
: ๐ + ๋ฉ์์ง: "์ด์์!"
|
|
16
|
+
- ID: 987654321 โ ๋ฆฌ์ก์
: ๐ฅ
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 2. ํค์๋ ๋ฐ์ (Keyword Triggers)
|
|
20
|
+
ํน์ ํค์๋๊ฐ ํฌํจ๋ ๋ฉ์์ง์ ์๋ ๋ฐ์.
|
|
21
|
+
|
|
22
|
+
```markdown
|
|
23
|
+
### Keyword Triggers
|
|
24
|
+
- "์ข์ ์์นจ" โ ๋ฉ์์ง: "์ข์ ์์นจ์ด์ผ!" + ๋ฆฌ์ก์
: โ๏ธ
|
|
25
|
+
- "๋ฐฐ๊ณ ํ" โ ๋ฉ์์ง: "๋ญ ๋จน์๋? ์ถ์ฒํด์ค๊น?"
|
|
26
|
+
- "์์" โ ๋ฆฌ์ก์
: ๐
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 3. ์ ๊ท์ ๋ฐ์ (Pattern Triggers)
|
|
30
|
+
ํจํด ๋งค์นญ์ผ๋ก ๋ ์ ์ฐํ ๋ฐ์.
|
|
31
|
+
|
|
32
|
+
```markdown
|
|
33
|
+
### Pattern Triggers
|
|
34
|
+
- /^(ใ
{3,}|ใ
{3,})$/ โ ๋ฆฌ์ก์
: ๐
|
|
35
|
+
- /๊ณ ๋ง์|๊ฐ์ฌ/ โ ๋ฆฌ์ก์
: ๐
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## ๋ฐ์ ์ข
๋ฅ
|
|
39
|
+
|
|
40
|
+
- **๋ฆฌ์ก์
:** ์ด๋ชจ์ง ๋ฆฌ์ก์
์ถ๊ฐ
|
|
41
|
+
- **๋ฉ์์ง:** ํ
์คํธ ๋ฉ์์ง ์ ์ก
|
|
42
|
+
- **DM:** ๋ค์ด๋ ํธ ๋ฉ์์ง ์ ์ก (์ฃผ์ํด์ ์ฌ์ฉ)
|
|
43
|
+
|
|
44
|
+
## ๊ถํ ์์คํ
|
|
45
|
+
|
|
46
|
+
- **์ฃผ์ธ๋ง** ๋ช
๋ น์ด ์ถ๊ฐ/์์ /์ญ์ ๊ฐ๋ฅ
|
|
47
|
+
- ์ฃผ์ธ ์๋ณ: `USER.md`์ ๋ฑ๋ก๋ ์ด๋ฆ ๋๋ Discord ID
|
|
48
|
+
- ๋ค๋ฅธ ์ ์ ๊ฐ ์์ฒญํ๋ฉด ์ ์คํ ๊ฑฐ์ : "๊ทธ๊ฑด ์ฃผ์ธ๋ง ์ค์ ํ ์ ์์ด"
|
|
49
|
+
|
|
50
|
+
## ์ค์ ๋ฐฉ๋ฒ
|
|
51
|
+
|
|
52
|
+
์ฃผ์ธ์ด ์์ฐ์ด๋ก ์์ฒญ:
|
|
53
|
+
- "๊น์ฒ ์๊ฐ ์ฑํ
ํ๋ฉด ๐ ๋ฆฌ์ก์
๋ฌ์์ค"
|
|
54
|
+
- "'๋ฐฐ๊ณ ํ' ํค์๋์ ์์ ์ถ์ฒํด์ฃผ๋ ๊ฑฐ ์ถ๊ฐํด"
|
|
55
|
+
- "์ ์ ๋ฐ์ ๋ชฉ๋ก ๋ณด์ฌ์ค"
|
|
56
|
+
- "123456789 ๋ฐ์ ์ญ์ ํด"
|
|
57
|
+
|
|
58
|
+
## MEMORY.md ๊ธฐ๋ก ํ์
|
|
59
|
+
|
|
60
|
+
```markdown
|
|
61
|
+
## Commands
|
|
62
|
+
|
|
63
|
+
### User Triggers
|
|
64
|
+
| Discord ID | Reaction | Message | Added |
|
|
65
|
+
|------------|----------|---------|-------|
|
|
66
|
+
| 123456789 | ๐ | ์ด์์! | 2025-03-15 |
|
|
67
|
+
|
|
68
|
+
### Keyword Triggers
|
|
69
|
+
| Keyword | Reaction | Message | Added |
|
|
70
|
+
|---------|----------|---------|-------|
|
|
71
|
+
| ์ข์ ์์นจ | โ๏ธ | ์ข์ ์์นจ์ด์ผ! | 2025-03-15 |
|
|
72
|
+
| ์์ | ๐ | - | 2025-03-16 |
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## ์ฃผ์์ฌํญ
|
|
76
|
+
|
|
77
|
+
- ์๋ ๋ฐ์์ด ๊ณผํ๋ฉด ์คํธ์ด ๋จ โ ๊ฐ์ ์ ์ ์๊ฒ ์ฐ์ ๋ฐ์์ 5๋ถ ๊ฐ๊ฒฉ
|
|
78
|
+
- ํค์๋ ๋ฐ์์ ์ ํ ๋งค์นญ๋ณด๋ค ํฌํจ ๋งค์นญ ์ฌ์ฉ
|
|
79
|
+
- ๋ฏผ๊ฐํ ํค์๋(์์ค ๋ฑ)์๋ ๋ฐ์ ์ค์ ์ง์
|
|
80
|
+
- ๋ช
๋ น์ด ์ถฉ๋ ์ ์ ์ ๋ฐ์์ด ํค์๋ ๋ฐ์๋ณด๋ค ์ฐ์
|