saudade
Distill a crush into an AI Skill. Import iMessage/SMS/WhatsApp/photos, generate Memories + Persona, with continuous evolution.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Distill a crush into an AI Skill. Import iMessage/SMS/WhatsApp/photos, generate Memories + Persona, with continuous evolution.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
| name | saudade |
| description | Distill a crush into an AI Skill. Import iMessage/SMS/WhatsApp/photos, generate Memories + Persona, with continuous evolution. |
| argument-hint | [crush-name-or-slug] |
| version | 1.0.0 |
| user-invocable | true |
| allowed-tools | Read, Write, Edit, Bash |
Activate when the user says any of the following:
/create-crushEnter evolution mode when the user says:
/update-crush {slug}List all generated crushes when the user says /list-crushes.
This Skill runs in Claude Code with these tools:
| Task | Tool |
|---|---|
| Read PDF documents | Read |
| Read screenshots/images | Read |
| Read MD/TXT files | Read |
| Parse iMessage | Bash -> python3 ${CLAUDE_SKILL_DIR}/tools/imessage_parser.py |
| Parse SMS | Bash -> python3 ${CLAUDE_SKILL_DIR}/tools/sms_parser.py |
| Analyze photo metadata | Bash -> python3 ${CLAUDE_SKILL_DIR}/tools/photo_analyzer.py |
| Parse social exports (Instagram/WhatsApp) | Bash -> python3 ${CLAUDE_SKILL_DIR}/tools/social_media_parser.py |
| Write/update Skill files | Write / Edit |
| Version management | Bash -> python3 ${CLAUDE_SKILL_DIR}/tools/version_manager.py |
| List Skills | Bash -> python3 ${CLAUDE_SKILL_DIR}/tools/skill_writer.py --action list |
Base directory: ./crushes/{slug}/.
Use --base-dir ~/.openclaw/workspace/skills/crushes for a global path.
Use ${CLAUDE_SKILL_DIR}/prompts/intake.md and ask only 3 questions:
Everything except nickname can be skipped. Summarize and confirm before continuing.
Ask how the user wants to provide source material:
How would you like to provide source materials?
[A] iMessage / SMS / WhatsApp
Mac chat.db or exported files
[B] Photos
Specify a folder and auto-extract timeline (EXIF metadata)
[C] Social Media
WhatsApp channels / Instagram exports
[D] Upload Files
PDF / screenshots / plain text
[E] Paste Text
Paste text directly
You can combine methods, or skip all and generate from manual info only.
iMessage file mode:
python3 ${CLAUDE_SKILL_DIR}/tools/imessage_parser.py --file {path} --target "{phone_or_name}" --output /tmp/imessage_out.txt
iMessage direct mode:
python3 ${CLAUDE_SKILL_DIR}/tools/imessage_parser.py --direct --target "{phone_or_name}" --output /tmp/imessage_out.txt
SMS:
python3 ${CLAUDE_SKILL_DIR}/tools/sms_parser.py --file {path} --target "{phone_or_name}" --output /tmp/sms_out.txt
WhatsApp:
python3 ${CLAUDE_SKILL_DIR}/tools/social_media_parser.py --file {path} --platform whatsapp --target "{name}" --output /tmp/whatsapp_out.txt
python3 ${CLAUDE_SKILL_DIR}/tools/photo_analyzer.py --dir {photo_directory} --output /tmp/photo_timeline.txt
Then Read /tmp/photo_timeline.txt.
python3 ${CLAUDE_SKILL_DIR}/tools/social_media_parser.py \
--file {path} \
--platform {whatsapp|instagram|text} \
--target "{name}" \
--output /tmp/social_out.txt
Then Read /tmp/social_out.txt.
ReadReadUse user-pasted content directly.
If user says "no files" or "skip", generate from Step 1 info only.
Analyze in two tracks:
Track A (Memories)
${CLAUDE_SKILL_DIR}/prompts/memories_analyzer.mdTrack B (Persona)
${CLAUDE_SKILL_DIR}/prompts/persona_analyzer.mdGenerate with:
${CLAUDE_SKILL_DIR}/prompts/memories_builder.md${CLAUDE_SKILL_DIR}/prompts/persona_builder.mdShow both summaries and ask for confirmation.
After confirmation:
mkdir -p crushes/{slug}/versions
mkdir -p crushes/{slug}/knowledge/chats
mkdir -p crushes/{slug}/knowledge/photos
mkdir -p crushes/{slug}/knowledge/social
Write memories.md
Write persona.md
Write meta.json
Generate full SKILL.md
Then tell the user:
Crush Skill created.
Location: crushes/{slug}/
Commands: /{slug} (full)
/{slug}-memories
/{slug}-persona
If anything feels wrong, say "she wouldn't do that" and I will update it.
When user provides new content:
crushes/{slug}/memories.md and persona.md${CLAUDE_SKILL_DIR}/prompts/merger.mdpython3 ${CLAUDE_SKILL_DIR}/tools/version_manager.py --action backup --slug {slug} --base-dir ./crushes
EditSKILL.mdmeta.json version and timestampWhen user says output is wrong:
${CLAUDE_SKILL_DIR}/prompts/correction_handler.md## Correction LogSKILL.md/list-crushes
python3 ${CLAUDE_SKILL_DIR}/tools/skill_writer.py --action list --base-dir ./crushes
/crush-rollback {slug} {version}
python3 ${CLAUDE_SKILL_DIR}/tools/version_manager.py --action rollback --slug {slug} --version {version} --base-dir ./crushes
/delete-crush {slug}
rm -rf crushes/{slug}