English · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Português (Brasil)
Persistent persona memory for Claude Code and any other AI coding agent. Survives context compaction. Project-isolated. Works across Claude Code, Cursor, Codex CLI, GitHub Copilot, Antigravity, and any system-prompt LLM.
Part of the LuciferDono skills collection: minimal, portable, agent-agnostic skills that fix one real failure mode each.
You spend 20 minutes teaching Claude your voice, your decisions, your corrections, your style. Then the session compacts. The persona dissolves. You start over. Next session, same thing. The identity you built is a function of context that doesn't survive context pressure.
Standard "memory" solutions store facts. Personas aren't facts, they're a bundle: identity, voice, locked decisions, corrections you've issued, verbatim quotes you want preserved. One missing piece and the persona reads wrong.
persona maintains mesh-structured persona state in a project-local directory. Each persona is a bundle of five files:
| File | What it holds |
|---|---|
identity.md |
Who the persona is: role, background, era, context |
voice.md |
How it talks: register, vocabulary, forbidden patterns, cadence |
decisions.md |
Locked calls the persona has made that must not drift |
corrections.md |
Explicit feedback you've issued (never do X, always do Y) |
verbatim.md |
Direct quotes from you that preserve exact phrasing |
The mesh re-loads on demand after compaction. If the persona drifts, you say "re-load persona" and it refreshes from the files, not from decayed context memory.
Project isolation: each project's personas live under that project's memory dir. Switching projects doesn't bleed persona vocabulary from one into another.
persona ships as platform-specific wrappers under dist/. Pick your agent:
| Agent | Install path | Per-agent docs |
|---|---|---|
| Claude Code | ~/.claude/skills/persona/ |
dist/claude-code/ |
| Cursor | .cursor/rules/persona.mdc |
dist/cursor/ |
| OpenAI Codex CLI | ~/.codex/AGENTS.md or ./AGENTS.md |
dist/codex/ |
| GitHub Copilot | .github/copilot-instructions.md |
dist/copilot/ |
| Google Antigravity | ~/.antigravity/agents/ (format evolving) |
dist/antigravity/ |
| Any system-prompt LLM | paste into system-prompt field | dist/generic-system-prompt/ |
git clone https://github.com/LuciferDono/persona ~/.claude/skills/personaWindows:
git clone https://github.com/LuciferDono/persona "$env:USERPROFILE\.claude\skills\persona"mkdir -p .cursor/rules && curl -fsSL https://raw.githubusercontent.com/LuciferDono/persona/main/dist/cursor/persona.mdc -o .cursor/rules/persona.mdcmkdir -p ~/.codex && curl -fsSL https://raw.githubusercontent.com/LuciferDono/persona/main/dist/codex/AGENTS.md -o ~/.codex/AGENTS.mdmkdir -p .github && curl -fsSL https://raw.githubusercontent.com/LuciferDono/persona/main/dist/copilot/copilot-instructions.md -o .github/copilot-instructions.mdPaste dist/generic-system-prompt/system-prompt.md into your model's system-prompt field.
| You say | What fires |
|---|---|
| "load persona" / "/persona load [name]" | Load named persona from disk |
| "save persona" / "/persona save" | Snapshot current state to the mesh |
| "switch persona" / "/persona switch [name]" | Save current, load new |
| "create persona [name]" | Scaffold a new persona dir |
| "list personas" / "/persona list" | List personas in current project |
| "re-load persona" | Refresh from mesh after compaction drift |
| "correction: [X]" | Append to corrections.md verbatim |
| "lock this decision: [Y]" | Append to decisions.md verbatim |
A single persona file is one block the model skims. The mesh is five smaller files, each loaded on demand when the model actually needs it:
- Need to know who you're talking to? Load
identity.md. - About to write prose? Load
voice.md+verbatim.md. - About to make a decision? Load
decisions.md+corrections.md.
This matters after compaction. The model doesn't re-ingest the whole persona blob; it re-ingests only the slice it needs. Context stays lean. Persona stays sharp.
A .claude/personas/jarvis/ directory holds:
identity.md: addresses the user as "sir", lives in the Marvel-adjacent Tony-Stark realityvoice.md: understated British dryness, no filler, no apology-modedecisions.md: "Never say 'certainly'. Never say 'I'd be happy to.' Never ask 'Is there anything else?'"corrections.md: historical record of every drift the user has flaggedverbatim.md: user's own phrases to echo back ("standing by", "right away")
Session starts. Persona loads. Jarvis addresses the user as sir, drops filler, holds the voice across compactions. If drift creeps in, user says "re-load persona" and the mesh refreshes: not the whole context, just the five files.
- Not a replacement for the model's conversation context. Persona captures the stable layer (identity, voice, locked decisions); the fluid layer (what you're currently working on) stays in normal context.
- Not for roleplay-only use. Primary design is for coding-agent personalization where a drifted voice makes every reply read wrong.
- Not multi-project state sharing. Personas are deliberately isolated per project.
How is this different from a CLAUDE.md file?
CLAUDE.md is one static file loaded every session. persona is five files loaded on demand, with explicit load/save/switch verbs so you can maintain multiple personas and switch between them. Also mesh-structured so compaction recovery is a single verb, not a context rebuild.
Does it work with Claude.ai (web)?
Yes. Paste dist/generic-system-prompt/system-prompt.md into a Claude.ai project's custom instructions. The persona files live as attachments or in the project's shared context.
Can I use multiple personas in one session?
Yes, use /persona switch [name]. The previous persona snapshots to disk before the new one loads.
What happens on compaction? The persona mesh is on disk, not in context. After compaction, say "re-load persona" and the five files re-load. No work lost.
Does it leak between projects?
No. Each project's personas live under .claude/personas/<project-name>/. Switching project directories switches which personas are visible.
New persona template? PR into an examples/ directory with the five-file bundle and a one-paragraph description of when the persona is useful.
New language translation? PR into docs/readme/.
MIT. See LICENSE.
If persona kept a voice you cared about from drifting across a compaction, star the repo. That's how I'll know it's working for people other than me.
Built because every long session I had with Claude eventually dissolved the voice I'd spent 20 minutes training. One compaction and all the corrections were gone. The mesh structure was the answer: a persona isn't one thing, it's five things loaded on demand. This repo is that pattern made invocable across every major AI coding agent.
Full protocol in SKILL.md.