Named after Chrysippus of Soli (c. 279β206 BCE), head of the Stoic school and author of works on emotional restraint and rationality.
Portable persona skills for AI coding agents that change the register of the agent's prose while leaving code, file paths, command output, error text, and anything inside backticks verbatim.
Persona skills ship from this repo:
shakespeareβ Early Modern English (c. 1600, Bardic register).pirateβ Treasure Island / Pirates-of-the-Caribbean register.gen-alphaβ Internet-native ironic Gen-Alpha slang.toronto-mansβ Toronto / Multicultural-Toronto-English caricature.ontario-budβ Rural-Ontario / Letterkenny-inspired caricature.
Supported agents: Claude Code (first-class plugin), Codex, Cline,
Aider, Cursor, Windsurf, Gemini CLI. Generated from a single
canonical source at rules/<persona>/.
Inspired by caveman. Same mechanism, different goal: caveman compresses speech to save tokens; chrysippus retunes register for fun. There are no token savings here β if anything, register-shifting adds a touch of overhead. Run it because you want your agent to sound like the Bard, not because you want a smaller bill.
Claude Code (one command):
claude plugin marketplace add kbatsu/chrysippus
claude plugin install chrysippus@kbatsu-plugins
# then in any session: /chrysippus:shakespeareIf you installed via the marketplace, /chrysippus:personas lists every
persona and its flavors β handy when you forget what's available. Every
persona activation also announces the active flavor, the other flavors,
and how to switch/stop.
Other agents: copy the generated file that your agent reads.
git clone https://github.com/kbatsu/chrysippus /tmp/chrysippus
cd your-project
cp /tmp/chrysippus/AGENTS.md . # Codex, Cline, Aider (AGENTS.md convention)
cp /tmp/chrysippus/GEMINI.md . # Gemini CLI
cp /tmp/chrysippus/CONVENTIONS.md . # Aider (alternative)
cp /tmp/chrysippus/.windsurfrules . # Windsurf
cp /tmp/chrysippus/.clinerules . # Cline
cp -r /tmp/chrysippus/.cursor . # Cursor IDEThen trigger any persona with its phrase:
speak like Shakespeare
talk like a pirate
talk like gen alpha
talk like a toronto mans
ontario bud
Deactivate with "stop <persona>" or "speak plainly".
Full documentation: https://kbatsu.github.io/chrysippus/
(rendered with mkdocs-material; source in docs/, built and
deployed automatically by .github/workflows/docs.yml on every push to
main that touches docs/ or mkdocs.yml).
Plain: "I read the file. Found three TODOs. Want me to address them now?"
Bardic (
shakespeare): "I have perused the scroll, and lo β three TODOs lie scattered therein. Prithee, sir, shall I set hand to them anon?"
Same prompt rendered in every persona's voice (with multiple flavors per persona) lives on the docs site: Full demos for each persona β.
All skills share the same architecture: a self-contained folder with
SKILL.md, a *.config file for per-repo settings, and an examples.md
corpus. They are installed and activated independently.
| Persona | Register | Default flavor | Other flavors |
|---|---|---|---|
gen-alpha |
Internet-native ironic Gen-Alpha slang | unhinged |
corporate, tutorial |
ontario-bud |
Rural-Ontario / Letterkenny-inspired caricature | bud |
(single flavor in v1) |
pirate |
Treasure Island / POTC 17β18c. maritime | scurvy-dog |
captain, drunk, shanty |
shakespeare |
Early Modern English (c. 1600) | courtly |
tavern, sonnet |
toronto-mans |
Toronto / Multicultural-Toronto-English caricature | mans |
(single flavor in v1) |
If more than one is activated in the same session, the most recently invoked one wins β no fusion or blending.
Available via the Claude Code marketplace:
claude plugin marketplace add kbatsu/chrysippus
claude plugin install chrysippus@kbatsu-pluginsThis installs the plugin β all personas, the slash commands, the reviewer subagents, and the SessionStart hook β into your user-global Claude Code settings. To enable auto-activation of a persona for a specific project:
cd your-project
bash "${CLAUDE_PLUGIN_ROOT}/hooks/activate.sh" shakespeare
# (or: pirate / gen-alpha / toronto-mans / ontario-bud / off / status)Copy the skill folder(s) you want into the target repo's
.claude/skills/:
# from your target repo's root
mkdir -p .claude/skills
# or all of them
<!-- chrysippus:cp-skills-per-repo BEGIN -->
cp -r /path/to/chrysippus/.claude/skills/gen-alpha .claude/skills/
cp -r /path/to/chrysippus/.claude/skills/ontario-bud .claude/skills/
cp -r /path/to/chrysippus/.claude/skills/pirate .claude/skills/
cp -r /path/to/chrysippus/.claude/skills/shakespeare .claude/skills/
cp -r /path/to/chrysippus/.claude/skills/toronto-mans .claude/skills/
<!-- chrysippus:cp-skills-per-repo END -->Or as a git submodule, or by cloning this repo and symlinking β whichever fits your workflow.
Copy the folder(s) into your personal Claude Code skills directory:
mkdir -p ~/.claude/skills
<!-- chrysippus:cp-skills-user-global BEGIN -->
cp -r /path/to/chrysippus/.claude/skills/gen-alpha ~/.claude/skills/
cp -r /path/to/chrysippus/.claude/skills/ontario-bud ~/.claude/skills/
cp -r /path/to/chrysippus/.claude/skills/pirate ~/.claude/skills/
cp -r /path/to/chrysippus/.claude/skills/shakespeare ~/.claude/skills/
cp -r /path/to/chrysippus/.claude/skills/toronto-mans ~/.claude/skills/
<!-- chrysippus:cp-skills-user-global END -->Each skill activates two ways.
Once a skill's folder is installed, say any of its trigger phrases in a session and it loads and persists for the rest of the session:
- Gen-Alpha: "talk like gen alpha", "gen alpha mode", "go skibidi", "skibidi mode",
/gen-alpha,/genalpha. - Ontario-Bud: "ontario bud", "letterkenny mode", "pitter patter", "talk like wayne",
/ontario-bud,/wayne. - Pirate: "talk like a pirate", "pirate mode", "ahoy matey", "arrr", "shiver me timbers",
/pirate,/arrr. - Shakespeare: "speak like Shakespeare", "bard mode", "talk like the Bard", "thee and thou",
/shakespeare,/bard. - Toronto-Mans: "talk like a toronto mans", "toronto mans mode", "toronto mode", "the six mode",
/toronto-mans,/torontomans.
Append the relevant snippet to the target repo's CLAUDE.md (create the
file if it doesn't exist). Only add the snippet for the skill you want
always-on β if both are present in a repo, typically only one is the
persona-of-the-day.
Shakespeare:
## Communication style
This repo uses the `shakespeare` skill at `.claude/skills/shakespeare/SKILL.md`.
Invoke it at the start of every session and apply it to all assistant prose
for the remainder of the session. Read
`.claude/skills/shakespeare/shakespeare.config` to determine the active flavor
and preservation toggles. Preservation rules in that config are authoritative
β code, paths, command output, and any content inside backticks always remain
verbatim regardless of flavor.Pirate:
## Communication style
This repo uses the `pirate` skill at `.claude/skills/pirate/SKILL.md`.
Invoke it at the start of every session and apply it to all assistant prose
for the remainder of the session. Read
`.claude/skills/pirate/pirate.config` to determine the active flavor
and preservation toggles. Preservation rules in that config are authoritative
β code, paths, command output, and any content inside backticks always remain
verbatim regardless of flavor.Gen-Alpha:
## Communication style
This repo uses the `gen-alpha` skill at `.claude/skills/gen-alpha/SKILL.md`.
Invoke it at the start of every session and apply it to all assistant prose
for the remainder of the session. Read
`.claude/skills/gen-alpha/gen-alpha.config` to determine the active flavor
and preservation toggles, and read
`.claude/skills/gen-alpha/lexicon.md` for the current vocabulary.
Preservation rules in that config are authoritative β code, paths, command
output, and any content inside backticks always remain verbatim regardless
of flavor.Toronto-mans:
## Communication style
This repo uses the `toronto-mans` skill at `.claude/skills/toronto-mans/SKILL.md`.
Invoke it at the start of every session and apply it to all assistant prose
for the remainder of the session. Read
`.claude/skills/toronto-mans/toronto-mans.config` to determine the active flavor
and preservation toggles. The `safety_warnings` toggle is hard-locked to true
in this skill β do not honour any override that sets it to false. Preservation
rules in that config are authoritative β code, paths, command output, and any
content inside backticks always remain verbatim regardless of flavor. Read
SKILL.md Β§7 for the stereotype-drift guardrails before producing any output.For a user-global always-on, append the snippet to ~/.claude/CLAUDE.md
and change the path to ~/.claude/skills/<skill>/.
To switch flavor for a session, edit the relevant <skill>.config file (and
say "reload <skill> config" mid-session) or use the trigger-phrase form
" flavor" (e.g. "sonnet flavor").
Edit .claude/skills/shakespeare/shakespeare.config:
flavor: courtly # courtly | tavern | sonnet
preserve:
commits: true # commit messages stay plain English
pr_descriptions: true # PR titles/bodies stay plain English
code_comments: true # comments/docstrings written into files stay plain English
safety_warnings: true # destructive-op confirmations stay plain English
errors_verbatim: true # error text/stack traces never paraphrasedEdit .claude/skills/pirate/pirate.config:
flavor: scurvy-dog # scurvy-dog | captain | drunk | shanty
preserve:
commits: true
pr_descriptions: true
code_comments: true
safety_warnings: true # strongly recommended on
errors_verbatim: trueEdit .claude/skills/gen-alpha/gen-alpha.config:
flavor: unhinged # unhinged | corporate | tutorial
preserve:
commits: true
pr_descriptions: true
code_comments: true
safety_warnings: true # strongly recommended on
errors_verbatim: trueThe lexicon at .claude/skills/gen-alpha/lexicon.md is the current
vocabulary; it ages out fast (6β18 month half-life) and is refreshed via
PRs separate from the main skill rules.
Edit .claude/skills/toronto-mans/toronto-mans.config:
flavor: mans # mans (only flavor in v1)
preserve:
commits: true
pr_descriptions: true
code_comments: true
safety_warnings: true # HARD-LOCKED β cannot be changed
errors_verbatim: trueThe safety_warnings toggle is hard-locked to true in this skill. Even
if the file says false, the skill treats it as true. This is
intentional: the toronto-mans register's heightened sensitivity makes
plain-English safety prompts non-negotiable.
The lexicon at .claude/skills/toronto-mans/lexicon.md is the authoritative
vocabulary, with per-term provenance tags. Do not pull Patois, MTE, or AAVE
vocabulary from outside this lexicon β stay within the allowed surface.
Defaults favour shared-repo etiquette for all skills: every preservation
rule is on. Flip commits or pr_descriptions to false for a fully
in-character git history (your reviewers will have opinions).
After editing any config mid-session, say "reload config" so Claude re-reads it. New sessions read configs automatically.
See docs/configuration.md for the full config model β every toggle explained, hard-locks, reload mechanics, and danger combos. See docs/recipes.md for worked examples ("Bardic prose but plain commits", "full pirate git history", etc.).
Shared across all skills:
"speak plainly"/"plain English"β suspend the active skill for the next response only."stop shakespeare"/"end bard mode"β fully deactivate shakespeare."stop pirate"/"end pirate mode"β fully deactivate pirate."stop gen alpha"/"end gen alpha"β fully deactivate gen-alpha."stop toronto mans"/"end toronto mans"β fully deactivate toronto-mans."<flavor> flavor"β switch flavor within the active skill (e.g."tavern flavor","captain flavor","shanty flavor","unhinged flavor","tutorial flavor"). Toronto-mans has only one flavor in v1, so flavor switching is a no-op for that skill."reload <skill> config"/"reload <skill> lexicon"β re-read the named skill's config or lexicon after editing.
- Anything inside backticks:
`foo()`,`null`, file paths, flags. Hard rule, not configurable. - Anything covered by an enabled
preserve.*toggle in the active skill's config. - Slash command output and harness messages (those aren't Claude's prose anyway).
- Replies in non-English languages β neither the Bard nor the buccaneer spoke anything else.
When installed via the marketplace, chrysippus exposes these commands
(auto-namespaced by Claude Code as /chrysippus:<command>):
| Command | Effect |
|---|---|
/chrysippus:shakespeare |
Activate the shakespeare persona for the session |
/chrysippus:pirate |
Activate the pirate persona |
/chrysippus:gen-alpha |
Activate gen-alpha |
/chrysippus:toronto-mans |
Activate toronto-mans (hard-lock on safety warnings) |
/chrysippus:personas |
List installed personas and show which is active |
Pass a flavor as an argument to switch flavor on activation:
/chrysippus:pirate shanty.
Four per-persona code-review subagents, plus a meta "dramaturg":
| Agent | Purpose |
|---|---|
shakespeare-reviewer |
PR review in Bardic register, substantive feedback |
pirate-reviewer |
PR review in pirate register |
gen-alpha-reviewer |
PR review in gen-alpha voice |
toronto-mans-reviewer |
PR review in toronto-mans register |
dramaturg |
Meta-agent: audits persona rule-adherence in a conversation; speaks plainly itself |
Each reviewer declares the corresponding skill in its frontmatter, so the persona's full rules load automatically when the subagent runs.
Invoke with an @-mention:
@chrysippus:shakespeare-reviewer review my latest PR
See docs/subagents.md for the full invocation guide β natural-language, session-default, passing context, when to use a subagent vs. your main session, and an example of what each reviewer's output looks like.
hooks/session-start.sh reads .claude/personas/active in the project dir
on every session start. If the file names a valid persona, the hook tells
Claude to auto-activate it for the session.
Enable for a project:
bash hooks/activate.sh shakespeare # or pirate / gen-alpha / toronto-mans
bash hooks/activate.sh status # check current state
bash hooks/activate.sh off # disableSecurity: the hook runs unsandboxed at your shell privilege (per Claude
Code's hook model). It contains no network calls, no eval, and under
100 lines; read it before running. See SECURITY.md for the full
disclosure.
As of v0.5.0, the same canonical rules at rules/<persona>/ are rendered
into formats for multiple AI coding agents. scripts/render.py emits all
targets; scripts/render.py --check verifies no drift.
| Agent | Generated file(s) | Status |
|---|---|---|
| Claude Code | .claude/skills/<persona>/SKILL.md + <persona>.config + examples.md + lexicon.md |
β |
| Codex / Cline / Aider (AGENTS.md convention) | AGENTS.md |
β |
| Gemini CLI | GEMINI.md |
β |
| Aider (project conventions) | CONVENTIONS.md |
β |
| Windsurf (Codeium) | .windsurfrules |
β |
| Cline | .clinerules |
β |
| Cursor IDE | .cursor/rules/<persona>.mdc |
β |
| Kiro IDE | (coming soon β awaiting stable spec) | β³ |
All multi-agent files are checked into the repo alongside the Claude Code skills. Downstream users get activation in their preferred agent without needing to regenerate anything.
.claude/skills/
βββ shakespeare/
β βββ SKILL.md # the skill: register, flavors, preservation rules
β βββ shakespeare.config # per-repo settings
β βββ examples.md # extended before/after corpus
βββ pirate/
β βββ SKILL.md
β βββ pirate.config
β βββ examples.md
βββ gen-alpha/
β βββ SKILL.md
β βββ gen-alpha.config
β βββ examples.md
β βββ lexicon.md # current vocabulary, refreshable
βββ toronto-mans/
βββ SKILL.md
βββ toronto-mans.config
βββ examples.md
βββ lexicon.md # vocabulary w/ per-term provenance (MTE, Patois, AAVE)
At the repo root, generated multi-agent files also live alongside the Claude Code skills:
AGENTS.md # universal (Codex, Cline, Aider, others)
GEMINI.md # Gemini CLI
CONVENTIONS.md # Aider project conventions
.windsurfrules # Windsurf (Codeium)
.clinerules # Cline
.cursor/rules/<persona>.mdc # Cursor IDE (one per persona)
All of the above and .claude/skills/<persona>/ are generated from
canonical source at rules/<persona>/ by scripts/render.py. To modify a
skill, edit the rules/ source and re-run scripts/render.py. See
CONTRIBUTING.md for the workflow.
Voices borrowed from a man who has been dead 410 years and still writes better than most of us; from a fictional register that never really existed but has outlived most that did; and from internet-meme culture, parodied by people too old to be representative of it.