Install
openclaw skills install ai-crush-simulatorA fun, safe, youth-friendly skill that helps users navigate crush situations. Analyzes the situation, decodes texts from a crush, generates reply options, an...
openclaw skills install ai-crush-simulatorAI Crush Simulator is a fun, safe, and encouraging skill for anyone navigating the classic mystery of figuring out a crush. It helps users:
Every output must include a disclaimer framed as "based on what you shared..." to remind users these are observations, not facts about another person.
crushAnalysis — Situation AnalysisInput: CrushSituation
howTheyMet string // "class", "app", "mutual friend"
howLong string // "2 weeks", "6 months"
interactionFrequency string // "daily texts", "occasional likes"
recentInteractions string // free-text description
yourFeelingConfidence 1–5 // how sure the user is about their feelings
Output: AnalysisResult
vibeScore 0–100 // heuristic composite score
connectionDepth // surface | friendly | warm | potentially-romantic
flags Flag[] // green / yellow / red flags with reasons
signals string[] // human-readable signal list
summary string // formatted multi-line summary
disclaimer string
Logic:
textDecoder — Text Message DecoderInput: TextInput
messageFromCrush string // the actual message
contextNote string? // optional extra context
Output: DecodedText
readings TextReading[] // up to 3 possible interpretations
overallVibe string // emoji + label e.g. "😄 Playful"
warmthScore 0–100
disclaimer string
Logic:
replyGenerator — Reply GeneratorInput: ReplyContext
decodedText DecodedText
userGoal keep-talking | show-interest | play-cool | ask-out
tonePref funny | sincere | neutral (optional)
Output: ReplyOptions
goal UserGoal
replies ReplyOption[] // always exactly 3: bold, chill, safe
tip string // one coaching tip for this goal
Logic:
nextMove — Next Move AdvisorInput: MoveContext
vibeScore number? // from crushAnalysis
warmthScore number? // from textDecoder
userGoal UserGoal?
howLong string?
recentInteractions string?
Output: NextMoveResult
action keepChatting | askToHang | giveSpace | beMoreDirect | waitAndSee
headline string // emoji + short label
reasoning string // 2–3 sentence explanation
tips NextMoveTip[] // 3 practical, empowering suggestions
disclaimer string
Decision Logic:
| Combined Score | Context | Action |
|---|---|---|
| < 38 | any | giveSpace |
| ≥ 70 | long-term | askToHang |
| ≥ 70 | short-term | keepChatting |
| ≥ 55 | goal = ask-out | beMoreDirect |
| ≥ 55 | goal = interest | keepChatting |
| 50–70 | any | waitAndSee |
heuristics.ts)The scoring engine is shared across all modules and provides:
scoreSignals(input) — scores a situation description 0–100 against 30+ signal patternsscoreTextWarmth(text) — scores a text message 0–100 for warmth/engagementdetectFlags(input) — returns typed flags (green/yellow/red) from pattern matchingPositive signals (+8 each): texted first, remembered details, made plans, complimented, inside joke, quick replies, long replies, asked questions, followed up, invited, etc.
Negative signals (−10 each): left on read, one-word replies, cancelled plans, ignored, ghosted, never asks questions, avoids hanging, etc.
Ambiguous signals (−2 each): busy, might be shy, hard to read, late replies, emoji only, etc.
All scores are clamped to [0, 100].
The following constraints are enforced in every output:
User: "My crush just texted me 'haha yeah' — what does that mean?"
Skill routes to: textDecoder
Output:
💬 Text Decoded
Overall vibe : 😐 Neutral
Warmth score : 22/100
Readings:
1. [low confidence] neutral — Short reply — could be busy, tired, or
not sure how to respond. One message isn't the full story.
2. [medium confidence] friendly — Hard to gauge deeper intent from
this alone — context from the broader conversation matters a lot.
ℹ️ Based on what you shared — texts can mean a lot of different things.
These are possible interpretations, not facts about what they feel.
User: "Can you do a full crush check? We met at a party 3 months ago..."
Skill routes to: Full flow (all 4 modules in sequence)
User: "I want to ask my crush out, they just texted me about hanging out — give me options"
Skill routes to: replyGenerator with goal = ask-out
ai-crush-simulator/
├── src/
│ ├── types.ts # All shared TypeScript interfaces
│ ├── modules/
│ │ ├── crushAnalysis.ts # Module 1
│ │ ├── textDecoder.ts # Module 2
│ │ ├── replyGenerator.ts # Module 3
│ │ └── nextMove.ts # Module 4
│ ├── scoring/
│ │ └── heuristics.ts # Shared scoring engine
│ └── index.ts # Public API re-exports
├── cli/
│ └── main.ts # Interactive local CLI
├── tests/
│ └── scenarios.ts # 3 sample test scenarios
├── SKILL.md # This file
├── README.md
├── package.json
└── tsconfig.json
heuristics.ts without changing any module logic.