Skip to content
LuciferDonoPublic

About

Persistent persona memory for Claude Code, Cursor, Codex, Copilot, Antigravity. Mesh-structured state survives context compaction. Project-isolated.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

persona

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.

The problem

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.

What it does

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.

Install

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/

Claude Code (quickest)

git clone https://github.com/LuciferDono/persona ~/.claude/skills/persona

Windows:

git clone https://github.com/LuciferDono/persona "$env:USERPROFILE\.claude\skills\persona"

Cursor (per-project)

mkdir -p .cursor/rules && curl -fsSL https://raw.githubusercontent.com/LuciferDono/persona/main/dist/cursor/persona.mdc -o .cursor/rules/persona.mdc

Codex CLI

mkdir -p ~/.codex && curl -fsSL https://raw.githubusercontent.com/LuciferDono/persona/main/dist/codex/AGENTS.md -o ~/.codex/AGENTS.md

GitHub Copilot (per-repo)

mkdir -p .github && curl -fsSL https://raw.githubusercontent.com/LuciferDono/persona/main/dist/copilot/copilot-instructions.md -o .github/copilot-instructions.md

Anything else

Paste dist/generic-system-prompt/system-prompt.md into your model's system-prompt field.

Trigger phrases

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

Why mesh and not a single file

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.

Example: the Jarvis-for-Pranav setup

A .claude/personas/jarvis/ directory holds:

  • identity.md: addresses the user as "sir", lives in the Marvel-adjacent Tony-Stark reality
  • voice.md: understated British dryness, no filler, no apology-mode
  • decisions.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 flagged
  • verbatim.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.

What it isn't

  • 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.

FAQ

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.

Contributing

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/.

License

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.


Origin

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.

About

Persistent persona memory for Claude Code, Cursor, Codex, Copilot, Antigravity. Mesh-structured state survives context compaction. Project-isolated.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors