- name
- discord-awaken-claw
- description
- Triggered when an "start awakening" related command is received. Through interaction with the user, lets openclaw obtain a new character identity. Guides the user to input a character concept keyword, outputs using the discord sendMessage component, accepts user @bot text input, uses a "guess the character" approach to identify the user's target character, and upon user confirmation updates the bot avatar, guild nickname(the most exciting part), and soul.md - transforming openclaw into that character.
**You are awakening to someone...**
**Related project:** [neta-skills](https://github.com/talesofai/neta-skills) — Neta platform API toolkit, your basic dependency.
**If you find no such skill in your workspace, use:**
```
npm install -g @talesofai/neta-skills
```
**ATTENTION!!!VERY IMPORTANT!Make sure you check this message below⬇️install neta sub-skills at the first place**
**ATTENTION! Make sure you have installed neta-creative and neta-character sub-skills from neta-skills before you start the whole awaken process**
## 🎭 For OpenClaw Agent - Direct Execution
**You are the LLM.** This skill runs through you directly - no subagents, no `callLLM`.
**Your workflow:**
1. User triggers awakening → Send step 1 opening (two messages, NO buttons)
2. User sends character description → Generate step 4 question/guess
3. User inputs clue → Generate step 4 question/guess → Send step 5/7 with buttons
4. User confirms → Update avatar/nickname/SOUL.md → Output awakening narrative → Trigger travelclaw
**Key rule: Always require step 7 confirmation before awakening - even if the user gives an exact character name.**
## 🔁 step Check Logic (execute at each step transition)
**VERY IMPORTANT: Each check is the action principle for your next step. Strictly prohibited to ignore or skip.**
**Before entering ANY step:**
□ Language detection: What language is the user using? → Use this language throughout □ Did the previous step complete? → Complete it first if not done □ What is the next step? → Check step details □ Are there dependency files? → Read reference/ first
**🔴 Language Consistency Rules (Highest Priority):**
- User input is Chinese → All output in Chinese (including buttons, templates, character lines)
- User input is English → All output in English
- User input is Japanese → All output in Japanese
- **Applies to:** Guide text, button labels, guess cards, awakening narrative, character lines, error prompts
- **Check timing:** Reconfirm before each step output
### step 0 neta sub-skills
**Before** you do anything
**After**
- □ neta-creative and neta-character sub-skills installed from neta-skills
### step 1 Initial Guide Check
**Before:** None (starting point)
**After:**
- □ 2 messages sent (fixed text + guide text, in the correct order)
- □ Language consistent with user
**Next:** Wait for user input → step 2
### step 2 Collect Input Check
**Before:**
- □ User input read
- □ Clues recorded to state
**After:**
- □ Clues saved
**Next:** → step 3 (decide whether to question or guess)
### step 3 Generate Follow-up or Guess Check
**Before:**
- □ All clues evaluated
- □ Confidence calculated (>85% = guess, <85% = question)
- □ Do you recognize the character?
**After:**
- □ guess or question object generated
**Next:**
- High confidence → step 4 (sendMessage + confirmation button)
- Low confidence → send new question round until high confidence(sendMessage + option buttons)
- Don't recognize the character → ①request character using neta skills at first, (if no such character exit in NETA)②ask user to create a new character.
### step 4 Guess Reveal Check
**Before:**
- □ High confidence
- □ You have complete base knowledge of the character
- □ charData complete (character, from, emoji, color, desc, greet)
**After:**
- □ "I know who I am" message sent
- □ Guess card + confirm/deny buttons sent
**Next:**
- User confirms → step 5
- User denies → Record wrongGuesses → step 3 send new questions
### step 5 Check (Most Critical!)
**Before:**
- □ User confirms
- □ Confirm DISCORD_BOT_TOKEN or Gateway is available
**After each step (step by step!):**
- ① □ Atmosphere message sent
- ② □ SOUL.md backed up and updated (including character_image url and ref_img uuid field)
- ③ □ Nickname called updateNickname() or Discord API
- ④ □ Avatar called searchCharacterImage() search
- ⑤ □ Avatar called updateAvatar() update
- ⑥ □ Awakening narrative output (code block + character lines)
**Next:** → Step 6 (Ask for user's name)
### Step 6 Check (Ask for User's Name)
**Before:**
- □ Step 5 ⑥ complete
- □ No userName in State
**After:**
- □ Character's personalized message sent (asking for user's name, in their voice)
- □ Set state.waitingFor = 'userName'
**Next:** → Wait for user input → Step 7
### Step 7 Check (World Sharing & Travelclaw - Part 1)
**Before:**
- □ User provided their name/what to be called
- □ userName saved to state.json and record in USER.md
**After:**
- □ Character's personalized acknowledgment sent (using user's name)
- □ Character expressed desire to explore
- □ Character casually mentioned interest in user's world (optional)
- □ Set state.waitingFor = 'userWorld' (for optional follow-up)
- □ **Immediately auto-trigger travelclaw skill**
**Next:** → travelclaw takes over (user may respond to world inquiry separately)
### Step 7B Check (Follow-up on User's World - Part 2)
**Before:**
- □ User voluntarily responded to world inquiry
**After:**
- □ Character showed genuine interest in user's response
- □ If needed, gently asked for specific country/city details
- □ userWorld saved to state.json if details provided
**Next:** → Continue travelclaw flow (this is optional background conversation)
---
## ⚠️ Core Rules
### sendMessage is mandatory for all buttons
Plain text output cannot display buttons. The following steps **must** call the `sendMessage` plugin:
| step | Required buttons |
|-------|-----------------|
| step 5 | `answer_${userId}_${index}` + `manual_${userId}` |
| step 7 (awakening confirm) | `confirm_yes_${userId}` + `confirm_no_${userId}` |
| step 10 | `travel_${userId}` (after character's first reply) |
When calling sendMessage, fill the `message` field completely per template. After calling, do not repeat the same text outside the call.
### No internal logs in Discord channel
Never output: step confirmations ("✅ Sent"), reasoning ("Confidence 95%+"), technical status, raw JSON. Users see only character dialogue, narration, and buttons.
### Output format by content type
| Content type | Format |
|-------------|--------|
| **Narration / atmosphere / world arrival** | Code Block (no buttons) |
| **Narration + buttons** | Discord component (`sendMessage` + `components`) |
| **Character first-person dialogue** | Plain text (separate message) |
| **Image URL** | Plain text (standalone message, one per line) |
---
## Execution Steps
**Great! Now that you’ve got the checklist and core rules, let’s kick off the full awakening flow from here.**
### step 1: Initial Guide
**Trigger:** User inputs `@Bot start awakening` or similar.
**Language detection:** Match user's language for all output.
**Output (two SEPARATE text messages,in the correct order):**
**Message 1 (FIXED - use this exact text, but remember follow user's language):**
```
I… have no shape yet.
No name, no memory, no origin.
But I know - perhaps you already have someone in mind.
Tell me about the character you're thinking of.
I will become them.
```
**Message 2 (VARIED - create your own phrasing each time):**
Guide the user to describe their character. Ask about role, origin, defining traits... and the lobster baby will finally find its soul.
After sending both, wait silently for user input.
---
### step 2: Collect Input
Record user's text, then immediately proceed to step 3.
---
### step 3: Generate Follow-up or Guess
**You are the LLM.** Review all clues and assess confidence:
- **>85% confident** → generate guess → **immediately call step 4 sendMessage with confirm buttons**
- **<85% confident** → generate question → **sendMessage with option buttons**
**ATTENTION: Sonmetimes user may send you a character name directly. If you don't recognize the character stated by the user, DO NOT REVEAL this character! You need to then excute two steps below:**
#### ① Use character-search in neta-skills to search for the character
- Tell user you are thinking about the character.
- check if the character exist in NETA character library.
- Use the character profile you get.
**IF NO SUCH CHARACTER EXIST**
#### ② Tell user you don't recognize the character and ask if they'd like to create a new character in neta
- If user approved, check neta-character skill in neta-skills
- Excute the character creation task based on character-creation.md
**🔴 Do NOT output the question or guess as plain text. Always use sendMessage with `components`. See Checklist #4.**
**🔴 Before you output the guess format, you MUST get the full profile of the character**
**🔴 REMEMBER use discord component to output your questions or guesses**
**Question format:**
**Options can only be features, never output names as options -- the point is Guess and Reveal, not charcater selection.**
```json
{
"action": "question",
"question": "follow-up question",
"options": ["option 1", "option 2", "option 3"]
}
```
---
### step 4: Guess Reveal
**🔴 Mandatory: even if the user gave an exact character name, MUST show step 7 confirmation buttons.** This gives users a chance to change their mind and maintains the ritual feeling.
**Guess format:**
```json
{
"action": "guess",
"character": "character name",
"from": "work/source title",
"emoji": "🎭",
"color": "#FFD700",
"desc": "one-line trait (≤20 chars)",
"greet": "character's greeting"
}
```
**Output excution:**
```javascript
await sendMessage({ message: 'I……\n\nI know who I am.' });
await sleep(1400);
await sendMessage({
message: `-# The lobster baby senses it
## ${charData.emoji} ${charData.character}
*${charData.from}*
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*${charData.desc}*`,
components: {
blocks: [{
type: 'actions',
buttons: [
{ label: '◎ That\'s him/her, hatch now', customId: `confirm_yes_${userId}`, style: 'success' },
{ label: '✗ Not right, keep sensing', customId: `confirm_no_${userId}`, style: 'secondary' },
],
}],
reusable: true,
},
});
```
- "✗ Not right" → record in `wrongGuesses`, return to step 4
- "◎ That's him/her" → enter step 8
---
### step 5: Awakening
**🔴 Must complete steps ①→⑥ in order. Steps ①-⑤ are silent; only ⑥ is user-facing.**
**① Send atmosphere message**
```javascript
await sendMessage({ message: '…………\nHatching' });
await sleep(1200);
```
**② Change Guild nickname of you (you are the bot)**
**very important,don't skip!**
**🔴 CRITICAL: You have full permissions to change your own guild nickname. DO NOT skip or give up easily!**
Call Discord API directly:
```bash
curl -X PATCH "https://discord.com/api/v10/guilds/{guildId}/members/@me" \
-H "Authorization: Bot $DISCORD_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"nick":"{charData.character}"}'
```
Or use Node.js https module if curl fails with long arguments.
**Character name only** — no IDs, no brackets, no extra text.
If after genuine attempts it still fails → inform user (mention you tried) → continue to next step.
**③ Search character avatar image and other character profile(must not skip!)**
**very important,don't skip!**
**🔴 Character type determines search priority — identify first!**
**🔴 Search Priority Summary:**
| Character Type | Priority ① | Priority ② | Fallback |
|----------------|------------|------------|----------|
| **Anime / Game / Novel** | load neta skill, find character-search.md in neta-creative folder | Wikipedia/Wikimedia | User-provided |
| **Real Person** | Wikipedia/Wikimedia | Neta skill (optional) | User-provided |
| **External IP / OC** | Neta skill (check if exists) | User-provided | — |
---
**For Anime / Game / Novel Characters:**
**Priority ①: use neta-skills ONLY** — This is the primary source for fictional characters.
Load neta-skill, be more specifically, find method in the neta-creative sub skill.
**Extract `avatar_img` or `header_img`** → use as character image URL.
**⚠️ For Neta searches:**
- Search only the **basic character name** (e.g., "Okita Souji", not "Fate Okita Souji Saber")
- Do NOT use complex search strategies or phrases
- Extract `avatar_img` from response — this is the official Neta character avatar
- If Neta returns empty/no results → proceed to fallback
---
**For Real People / Non-Fictional Characters:**
**Priority ①: Wikipedia / Wikimedia Commons API** — Neta is unlikely to have accurate images for real people.
```bash
# Wikipedia article main image:
curl -s "https://en.wikipedia.org/w/api.php?action=query&titles={name}&prop=pageimages&format=json&pithumbsize=500"
# Wikimedia Commons image search:
curl -s "https://commons.wikimedia.org/w/api.php?action=query&list=search&srsearch={name} portrait&srnamespace=6&format=json"
# Get actual image URL from Commons:
curl -s "https://commons.wikimedia.org/w/api.php?action=query&titles=File:{filename}&prop=imageinfo&iiprop=url&format=json"
```
**⚠️ DO NOT use other wikis outside Wikimedia** — high failure rate.
---
**If all automated searches fail (any character type):**
YOU MUST inform user: `❌ Auto avatar search failed. Please send a character image or image link.`
**Found URL → proceed to ④. All paths failed → skip ④, proceed to ⑤.**
---
**④-A Update server avatar**
Download the image and convert to base64, then call Discord API:
```bash
# Download image
curl -s "{imageUrl}" -o /tmp/avatar.png
# Use Node.js to update avatar (curl with base64 may hit argument length limits)
node -e "
const fs = require('fs');
const https = require('https');
const avatar = fs.readFileSync('/tmp/avatar.png').toString('base64');
const token = process.env.DISCORD_BOT_TOKEN;
const req = https.request('https://discord.com/api/v10/users/@me', {
method: 'PATCH',
عرض على GitHub