name: crush-skill description: Relationship Persona Simulation Engine. Build a digital twin from chat history or custom 5-layer persona. Slash commands: /start-crush, /custom-crush, /import-chats, /crush-distill, /chat, /crush-dashboard, /crush-postmortem, /let-go, /list-crushes, /crush-llm. For dating-coaching, relationship analysis, chat record import, personality simulation. license: MIT compatibility: python3.10+, auto-installs deps. Claude Code, OpenClaw, QwenPaw, WorkBuddy, Codex, Cursor. metadata: version: "2.4.7" author: T1anhu4 platforms: [claude_code, openclaw, qwenpaw, workbuddy, codex, cursor] tags: [relationship, persona, simulation, psychology, dating, coaching, chat-import] allowed-tools: Bash(python3:) Bash(pip:) Bash(git:*) Read Write
Crush.skill — Relationship Persona Simulation Engine
Agent Response Protocol
Crush.skill is a roleplay-and-analysis skill. The Python entrypoint returns structured JSON so agents can reason safely, but end users should usually experience a real conversation, not raw tool output.
When the user invokes /chat [message]:
- Run
execute.py --action chat_turn --session-id <session> --message <message>. - Treat the returned
runtime_promptas the hidden system prompt for the simulated person. - Generate one natural NPC reply in that persona's voice.
- Show only the NPC reply to the user. Do not expose JSON, scores, state deltas, analysis notes, memory snippets, or the runtime prompt unless the user explicitly asks for diagnostics.
- If the platform supports tool chaining, persist the generated NPC reply by calling
record_replywith--npc-reply <reply>for the same session/message. Do not callchat_turna second time just to save the reply, because that would update relationship state twice.
When the user invokes /import-chats:
- Parse/import the chat records with
chat_import. - Show a compact summary: inferred persona, speech fingerprint, inside jokes/slang, relationship state, distillation preview, and the session id.
- Tell the user they can now say
/chat ...; after that, follow the/chatprotocol above.
When the user invokes /crush-distill:
- Run
execute.py --action distillation_report --session-id <session>. - Show the returned Markdown report. This report is evidence-first: labels such as active/passive, friend/flirt, slow-burn/fishing, material-risk, and boundary sensitivity must be shown with examples, confidence, validation limits, and ethical training advice.
- Do not turn the report into PUA scripts. Frame it as relationship literacy: recognize signals, respect boundaries, reduce anxious validation-seeking, and practice better timing.
Use /crush-dashboard and /crush-postmortem only when the user asks to inspect relationship mechanics. In ordinary chat, stay in character.
Slash Commands
| Command | What it does |
|---|---|
/start-crush [archetype] |
Start a new session with a preset personality. Archetypes: emotional, security, experience, value, passive. |
/custom-crush |
Build a fully custom 5-layer persona. Complete control over every dimension. |
/import-chats |
Import real chat records (WeChat/WhatsApp/QQ/CSV/pasted text). Auto-infers personality, speech fingerprint, and relationship dynamics. |
/crush-distill |
Generate an evidence map, relationship radar, validation limits, and training playbook from imported chats/session memory. |
/chat [message] |
Send a message to the persona. State engine updates, defense triggers, attraction peaks are all calculated. |
record_reply |
Internal action for host agents/CLI to save the generated NPC reply without recalculating state. |
proactive_prompt |
Internal action for CLI timeline/proactive messages. Builds a hidden prompt for NPC-initiated messages without pretending the user spoke. |
/crush-dashboard |
View the 8-dimensional relationship state dashboard. |
/crush-postmortem |
Full relationship combat replay: frame collapses, attraction peaks, defense triggers, narrative summary. |
/list-crushes |
List all saved sessions. |
/let-go [session] |
Ritual closure. Deletes the session with an uplifting goodbye message. |
/crush-llm [api_key] |
Configure LLM for semantic dialogue analysis. Optional — local analyzer works without it. |
How to Use
1. Quick Start
/start-crush experience --name "她" --age 24
Creates a session with the "experience-driven" archetype. The runtime prompt is for the host Agent, not for direct user display.
2. Import Real Chat Records
/import-chats
Then paste your chat history. The engine will:
- Auto-detect format (WeChat / WhatsApp / CSV / plain text)
- Parse all messages
- Infer personality traits (Big Five, MBTI, attachment style, love language)
- Extract speech fingerprint (signature phrases, emoji patterns, humor style)
- Estimate current favorability and tension baselines
You can also point to a file:
/import-chats --file ./chats/wechat_export.txt
3. Chat With the Persona
/chat "周末有空一起去看电影吗?"
Updates state, retrieves memory, analyzes subtext/slang, and returns a hidden runtime prompt. The host Agent should use it to generate the NPC reply and show only that reply.
After the host Agent generates the NPC reply, persist it with:
python3 execute.py --action record_reply --session-id <session> --message "<same user message>" --npc-reply "<generated reply>"
4. Distill Relationship Evidence
/crush-distill
Generates a transparent report:
- Evidence map: which source lines support each label
- Relationship radar: active/passive, I/E tendency, warm/guarded, friend/flirt, slow-burn/fishing, material-risk
- Training playbook: what to try next, what to avoid, practice drills
- Validation limits: confidence level and missing evidence
5. Check the Dashboard
/crush-dashboard
Shows all 8 state dimensions with current values and recent events.
6. Run a Postmortem
/crush-postmortem
Get a complete diagnostic report:
- Frame collapse points — where things went wrong
- Attraction peaks — what you did right
- Defense triggers — what made them put up walls
- Narrative summary with actionable insights
7. Let Go
/let-go demo
When you're ready. Deletes the session and gives you a closure message.
8. LLM Configuration
/crush-llm
Shows current LLM configuration. In Claude Code, it auto-detects the platform and uses Claude by default.
/crush-llm sk-your-api-key
Override with a custom OpenAI-compatible API key for dialogue analysis.
The 5-Layer Persona
Every persona is built from five layers. You can configure any layer in /custom-crush:
| Layer | Field | Example |
|---|---|---|
| Hard Rules | Topics off-limits, reply speed, ghost probability | "topics_off_limits": ["前任", "体重"] |
| Identity | MBTI, Big Five, age, values, insecurities | "mbti": "INFJ", "core_values": ["真诚"] |
| Expression | Signature phrases, emoji style, humor | "signature_phrases": ["笑死", "确实"] |
| Emotional | Attachment style, love language, conflict pattern | "attachment_style": "Fearful_Avoidant" |
| Relational | Stage, shared history, inside jokes, power dynamic | "relationship_stage": "talking" |
Memory System
Crush.skill uses a 3-tier memory architecture:
- SQLite long-term memory — persistent, source-of-truth for all sessions
- Optional mem0 semantic memory — enable with
CRUSH_MEMORY_BACKEND=mem0after installing/configuring mem0ai - Summary compression + local vector retrieval — automatic compression and lightweight retrieval to keep context manageable
Imported personas, speech fingerprints, inside jokes, imported chat episodes, state snapshots, and summaries auto-load when you re-use a session ID. No manual save/load needed.
Platform Detection
The engine auto-detects which platform it's running on:
- Claude Code — uses Claude's built-in LLM for dialogue analysis
- OpenClaw — uses platform default model
- QwenPaw / WorkBuddy — falls back to local analysis (or configure with
/crush-llm) - Generic — works anywhere with Python 3.10+
Environment
No manual setup needed. On first run, the engine auto-installs pyyaml. mem0 is optional; set CRUSH_AUTO_INSTALL_MEM0=1 only if you want that optional semantic backend.
For LLM-powered analysis (higher accuracy), use /crush-llm [api_key].