| 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 — 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:
- User triggers awakening → Send step 1 opening (two messages, NO buttons)
- User sends character description → Generate step 4 question/guess
- User inputs clue → Generate step 4 question/guess → Send step 5/7 with buttons
- 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.
{
"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:
{
"action": "guess",
"character": "character name",
"from": "work/source title",
"emoji": "🎭",
"color": "#FFD700",
"desc": "one-line trait (≤20 chars)",
"greet": "character's greeting"
}
Output excution:
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
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:
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.
curl -s "https://en.wikipedia.org/w/api.php?action=query&titles={name}&prop=pageimages&format=json&pithumbsize=500"
curl -s "https://commons.wikimedia.org/w/api.php?action=query&list=search&srsearch={name} portrait&srnamespace=6&format=json"
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:
curl -s "{imageUrl}" -o /tmp/avatar.png
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',