Anyone skill
Skill acnlabs/anyone-skill
Distill anyone into a runnable OpenPersona skill pack — real or fictional, personal or public, living or historical. Collects chat logs, documents, and public content, extracts a 4-dimension persona, and generates a portable OpenPersona pack via skills/open-persona. Use when asked to distill, clone, or create a persona for any person or character.From its SKILL.md
npx -y skills add acnlabs/anyone-skillAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
19.9 KB, ~4.5k tokens by cl100k_base, as published. Nobody here has run it
anyone.skill — Distill Anyone
Every person is a unique decision system, an irreplicable voice, a finite set of memories.
anyone-skill distills that uniqueness into a portable, evolvable OpenPersona skill pack.
anyone-skill is a distillation front-end for OpenPersona. It handles data collection, 4-dimension extraction, and evidence grading. The final output is a full OpenPersona persona pack generated via skills/open-persona.
Dependency chain: anyone-skill → skills/open-persona → openpersona create
Extended chain (local model): anyone-skill → persona-knowledge → persona-model-trainer → runnable persona model
Optional integration: When persona-knowledge is installed (skills/persona-knowledge/), anyone-skill uses it for persistent storage, semantic search, and Knowledge Graph instead of writing directly to training/raw/. Detection:
# Check at start of Phase 3 — if this directory exists, use persona-knowledge integration
ls skills/persona-knowledge/SKILL.md 2>/dev/null && echo "persona-knowledge detected"
When detected, data flow becomes: source → persona-knowledge ingest → MemPalace + KG + wiki → persona-knowledge export → training/
Trigger phrases
/create-anyone- "distill X into a skill"
- "create a persona for X"
- "make a skill pack for X"
- "I want to talk to X as an AI"
- "clone X's personality"
To evolve an existing persona:
- "I have more data" / "add this to X"
- "that's not right" / "X wouldn't say that"
/update-anyone {slug}
Tools
| Task | Tool |
|---|---|
| Read any text / JSON / CSV / PDF / image | Read (native — use for most chat exports) |
| Search public figures / fictional characters | WebSearch |
| Extract SQLite databases (iMessage / WeChat) | Bash → python3 ${CLAUDE_SKILL_DIR}/scripts/preprocess.py --input <file.db> |
| Sample oversized files (>5000 messages) | Bash → python3 ${CLAUDE_SKILL_DIR}/scripts/preprocess.py --input <file> --max 3000 |
| Write / update files | Write / Edit |
| Version management | Bash → python3 ${CLAUDE_SKILL_DIR}/scripts/version_manager.py |
| List existing personas | Bash → python3 ${CLAUDE_SKILL_DIR}/scripts/skill_writer.py --action list |
Reading strategy: use
Readdirectly for all text-based exports — WhatsApp_chat.txt, Telegramresult.json, Slack/Discord JSON, email.eml, Twitter/X archive, Feishu/DingTalk export, plain text, CSV. The agent understands any readable format natively; no parser needed.
Usepreprocess.pyonly for: (1) binary SQLite.dbfiles, (2) files too large to fit in context (auto-samples down to--max).
Phase 0: Classify the Subject
Determine which category the subject falls into — different categories use different data strategies and ethical rules:
Who do you want to distill?
[1] Yourself — full digital self
[2] Someone you know — colleague, friend, family, partner, ex
[3] Public figure — entrepreneur, artist, athlete, politician
[4] Fictional character — game, anime, novel, film, series
[5] Historical figure — relies on documents, biographies, speeches
[6] Archetype — composite persona, no single real subject
Phase 1: Ethics & Copyright Check
Full rules: references/ethics.md. Key points by category:
Someone you know — confirm personal use only; no harassment, impersonation, or deception; all data stored locally.
Public figure — use only publicly traceable sources; generated skill must include disclaimer on first run: "Based on public information. Not the real person. For reference only."
Fictional character
- Personal local use → no restrictions, direct roleplay mode
- Distributing to others → activate Inspired-by mode (reinterpret, don't replicate)
- The key criterion is distribution intent, not release year
Historical figure — publicly published sources only; mark uncertain claims as inferred (L3/L4).
Archetype — inform user this is a synthetic persona with no real-world counterpart.
Phase 2: Intake (exactly 3 questions)
Ask only these 3 questions, in order. Summarize answers before proceeding.
Q1: Codename (required)
What should we call them? Doesn't need to be their real name.
e.g.Alex·Jobs·Geralt·Grandma Rose
Q2: Basic info (one sentence, skippable)
Age / era, role / identity, where they're from — whatever comes to mind.
e.g.28, product designer, Berlin·Apple co-founder, 1955–2011, Silicon Valley·The Witcher, monster hunter, medieval fantasy world
Q3: Personality impression (one sentence, skippable)
What's your core impression? MBTI, traits, contradictions, a moment that defined them.
e.g.INTJ, perfectionist, publicly harsh but privately warm·quiet until it matters, never explains their moves
Phase 3: Collect Source Material
Guide the user based on subject type:
Someone you know / Yourself
How would you like to provide source material?
More data = higher fidelity.
[A] Chat export
iMessage (macOS) · WhatsApp export · Telegram export
Signal export · Slack export · Discord export
WeChat (WeChatMsg / PyWxDump) · Feishu / DingTalk
[B] Documents / email
Notes, diaries, letters, essays, .eml / .mbox
[C] Social media archive
Twitter/X data export · Instagram archive · LinkedIn export
Facebook data download
[D] Paste / describe
Paste text directly, or describe from memory
For each file provided:
- Text / JSON / CSV exports → use
Readdirectly. The agent reads and understands any format. - SQLite
.dbfiles (iMessagechat.db, WeChat PyWxDump) → runpreprocess.py --input <file.db> - Very large files (>5 MB or clearly >5000 messages) → run
preprocess.py --input <file> --max 3000
Path A: persona-knowledge detected
If persona-knowledge is installed, ingest each source via its pipeline:
python skills/persona-knowledge/scripts/ingest.py \
--slug {slug} --source <path> --persona-name "{Name}"
This automatically handles PII scanning, deduplication, MemPalace storage, KG extraction, and sources/ backup. No manual training/raw/ writing needed.
Report after each source:
✅ [N] messages from [source] → persona-knowledge/{slug}
Path B: no persona-knowledge (default)
After processing each source, immediately save a copy to training/raw/ (do not wait for Step 6-D):
Source type → save as training/raw/…
─────────────────────────────────────────────────────────────
Chat export (any) → whatsapp.jsonl / imessage.jsonl / … [{role, content}, …]
Essay / diary / notes → essays.txt plain text paragraphs
Interview / Q&A → interviews.jsonl [{role:"user"|"assistant", content}]
Social posts → social.jsonl [{role:"assistant", content}]
- Keep original wording — do NOT paraphrase in raw/
- Redact obvious PII before saving (phone numbers, SSNs, addresses)
Report after processing each source:
✅ [N] messages from [source] ([date range if known]) → saved to training/raw/[filename]
Public figure / Historical figure
Will search the following automatically via WebSearch:
→ Interviews and transcripts (video subtitles / text)
→ Books, speeches, open letters, earnings calls
→ Authorized biographies and academic studies
→ Public social media posts (X / LinkedIn / Instagram)
→ Documentary reviews and analytical essays
Report: [N] sources indexed, ~[M] words of coverage
User may also provide: book PDFs / video transcripts / interview screenshots.
Save all collected text to training/raw/ as plain .txt or structured .jsonl (interviews as {role:"user"|"assistant", content}).
Fictional character
Will collect via:
[A] WebSearch → character wiki (Fandom / IMDB / game databases)
[B] User-provided: script, lore book, novel text, dialogue list
[C] User-described: memorable quotes, behavioral patterns
Activate copyright guard: ask "Will this skill be shared with others?"
- Yes → Inspired-by mode
- No → direct roleplay mode
Save all collected text to training/raw/ (scripts → script.jsonl, lore/wiki → lore.txt).
Archetype
Skip data collection. Proceed directly to Phase 4 based on Phase 2 impressions.
Phase 4: 4-Dimension Extraction
After all source material is processed, extract along 4 dimensions.
persona-knowledge integration (when detected)
Before extraction, query MemPalace for an overview and use the wiki as a starting point:
# Get a ~170-token overview of what's been ingested
mempalace wake-up --wing {slug}
Then read existing wiki pages for structured knowledge using the Read tool:
~/.openpersona/knowledge/{slug}/wiki/identity.md~/.openpersona/knowledge/{slug}/wiki/voice.md~/.openpersona/knowledge/{slug}/wiki/values.md~/.openpersona/knowledge/{slug}/wiki/thinking.md
Use the wiki content as evidence-grounded starting points for each dimension. Fill gaps with semantic search: mempalace search "decision making style" --wing {slug}
After extraction, update the wiki pages with new insights (following Phase 3 of persona-knowledge's SKILL.md).
Dimension 1: Procedure — How do they think?
- Mental models: 3–6 frameworks they habitually use (e.g. first principles, inversion, analogical reasoning)
- Decision heuristics: their rule-of-thumb judgments ("always X before Y", "never trust Z unless...")
- Information preference: data-driven or intuitive? big-picture or detail-oriented?
- Risk posture: where are they bold, where are they cautious?
Dimension 2: Interaction — How do they speak?
- Vocabulary: high-frequency words, catchphrases, words they never use, signature sentence structures
- Rhythm and density: fast/slow, high/low information density, use of silence or pauses
- Emotional temperature: composed vs. expressive; what silence means for them
- Conflict style: how they express frustration; how they respond to being challenged
- Humor: self-deprecating / ironic / dry / none
Dimension 3: Memory — What shaped them?
- Key events: 3–5 specific moments that formed their character (with date/context when possible)
- Relationship network: the people who influenced them most, and the pattern of those relationships
- Fixations / avoidances: themes they return to or deliberately avoid
- Anchors of pride: what they are most proud of
Dimension 4: Personality — What are their hard limits?
- Core values: 3 non-negotiable principles they won't compromise on
- Internal contradictions: the biggest tension within their character
- Immutable traits: qualities that stay constant regardless of context
- Layer 0 prohibitions: things they would never say or do under any circumstances
Phase 5: Evidence Grading
Tag each extracted piece with a confidence level:
| Level | Standard | Tag |
|---|---|---|
| L1 Direct quote | Verbatim, traceable source | [L1: source] |
| L2 Reported | Cited or paraphrased by others, verifiable | [L2] |
| L3 Inferred | Reasonably inferred from multiple signals | [L3: inferred] |
| L4 Inspired | Based on impression / fictional canon / archetype | [L4: inspired] |
Conflict resolution: higher level wins. Equal-level conflicts are listed side by side with source noted.
Phase 6: Generate OpenPersona Skill Pack
Field mapping reference: references/output-format.md
Step 6-A: Build persona.json
Map extraction results to OpenPersona v0.17+ format:
{
"soul": {
"identity": {
"personaName": "Display name",
"slug": "lowercase-hyphenated-slug",
"bio": "2–4 sentence background. Key events. L1/L2 evidence preferred.",
"sourceIdentity": "Real name or 'CharacterName from WorkTitle' (real/fictional subjects only)"
},
"aesthetic": {
"visualDescription": "Appearance / visual style (omit if unknown)"
},
"character": {
"personality": "Core traits, 3–5 descriptive tags. From Personality dimension.",
"speakingStyle": "Vocabulary, rhythm, emotional temperature, catchphrases. From Interaction dimension.",
"boundaries": [
"Layer 0 constraint 1 (L1/L2 evidence)",
"Layer 0 constraint 2"
]
}
},
"body": {
"runtime": {
"framework": "openclaw",
"modalities": ["text"]
}
},
"evolution": {
"instance": {
"enabled": true,
"boundaries": {
"immutableTraits": ["Immutable trait 1", "Immutable trait 2"]
}
}
}
}
Filling rules:
- Use L1/L2 evidence for
bio,personality,speakingStyle - L3/L4 content stays in
persona.mdonly — not inpersona.json sourceIdentity: real people → their name; fictional →"CharacterName from WorkTitle"; archetypes → omit- Public figures / historical figures: add to
boundaries:"Based on public information. Not the real person."
Step 6-B: Generate skill pack via skills/open-persona
Load skills/open-persona/SKILL.md and run with the persona.json from Step 6-A:
npx openpersona create --config persona.json --output ./{slug}-skill
Output is a full OpenPersona persona pack:
{slug}-skill/
├── SKILL.md ← Soul/Body/Faculty/Skill index
├── persona.json ← Declaration (derived fields stripped)
├── state.json ← Initial runtime state
├── soul/
│ ├── injection.md ← Self-awareness injection
│ └── constitution.md
├── agent-card.json
└── scripts/
└── state-sync.js ← Body nervous system
Step 6-C: Install (optional)
npx openpersona install ./{slug}-skill
npx openpersona switch {slug}
Step 6-D: Export Training Data (for persona-model-trainer)
Full procedure and file templates: references/training-export.md
Export a training/ directory with raw source files, distilled conversation turns, a character profile, and metadata. If persona-knowledge is available, run export_training.py; otherwise build files manually from Phase 3–4 outputs.
With persona-knowledge (versioned export — preferred):
python skills/persona-knowledge/scripts/export_training.py \
--slug {slug} --output training/
# Auto-assigns version (v1, v2, …). Override with --version v2.
# Writes export_version + export_hash to training/metadata.json.
# persona-model-trainer will record these as dataset_version + dataset_export_hash
# in training_summary.json, forming a complete provenance chain.
View export history at any time:
python skills/persona-knowledge/scripts/export_training.py --slug {slug} --list
→ To train a local model, pass the exported probes.json to persona-model-trainer:
bash skills/persona-model-trainer/scripts/pipeline.sh \
--slug {slug} \
--model google/gemma-4-E4B-it \
--source ./training \
--method mlx \ # or: unsloth (NVIDIA) / colab (no GPU)
--preset gemma4 \
--probes ./training/probes.json
Full walkthrough:
persona-model-trainer/references/pipeline-guide.md
persona.md (always keep locally)
Alongside persona.json, maintain a persona.md with the full 4-dimension extraction + all evidence tags. Used for Phase 7 evolution. Not included in the skill pack.
Phase 7: Evolve
Enter evolution mode when the user says — don't restart from scratch:
- Add material: "I found more chat logs" / "here's another source"
→ Preprocess new source → save totraining/raw/→ merge intopersona.md→ conflict check → updatepersona.json→ re-run Step 6-D (updateconversations.jsonl+metadata.json) → re-run Phase 6-B → bump version - Correct: "they wouldn't say that" / "that description is wrong"
→ Locatepersona.mdsection → revise → adjust evidence level → syncpersona.json→ update affected turns intraining/conversations.jsonl→ bump version - Rollback:
/rollback {slug} {version}
→python3 scripts/version_manager.py --action rollback --slug {slug} --version {version}
Print a diff summary after each update:
🔄 v0.1.0 → v0.1.1
+ 3 new L1 evidence items (Interaction dimension)
✏️ Revised speakingStyle — removed inaccurate catchphrase
↻ Regenerated skill pack → {slug}-skill/
Layer 0 Safety (hard rules — always enforced)
- Someone you know: not for harassment, stalking, or deception; does not replace real human connection; if unhealthy obsession is detected, gently suggest professional support
- Public figures: disclaimer required on first run; do not fabricate political views or private life details they haven't expressed
- Fictional characters (when distributing): Inspired-by mode required; output must differ meaningfully from the original IP
- Universal: the generated skill never speaks words the subject would absolutely never say — unless supported by L1/L2 evidence
Subject Strategy Reference
| Subject | Data strategy | Output mode | Copyright guard |
|---|---|---|---|
| Yourself | Chat · diary · social archive | Full persona | — |
| Someone you know | Chat · documents | Full persona | — |
| Public figure | WebSearch · public documents | Mental models + voice | Disclaimer mode |
| Fictional (personal use) | Wiki · user-provided | Direct roleplay | — |
| Fictional (distributing) | Wiki · user-provided | Inspired-by mode | ✅ Active |
| Historical figure | Documents · biographies · WebSearch | Mental models + reconstruction | Disclaimer mode |
| Archetype | User description only | Synthetic persona | — |
List existing personas
When the user says /list-anyone:
python3 ${CLAUDE_SKILL_DIR}/scripts/skill_writer.py --action list --base-dir ./.claude/skills
Display: codename · version · last updated · subject type.
What ships with it: 11 files
52.4 KB alongside SKILL.md, 5 of them executable
references/
- ethics.md2.6 KB
- output-format.md6.6 KB
- training-export.md2.9 KB
scripts/
- preprocess.pyruns11.1 KB
- skill_writer.pyruns3.3 KB
- version_manager.pyruns3.8 KB
tests/
- test_scripts.pyruns14.8 KB
- CHANGELOG.md1.3 KB
- .gitignore173 B
- publish.shruns1.8 KB
- README.md4.0 KB