Use when user asks to change, switch, configure, weight, curate, or create personas. Use when persona messages feel generic, user wants to improve voice quality, or adjust persona rotation. Also use for "set up my persona preferences" or bulk persona configuration.
Configure persona selection, voice quality, and custom personas using the sidekick CLI.
Before ANY config set or persona file creation, ask:
Should this apply to your user settings (all projects), the project (versioned, shared with team), or as a local-only override (untracked)?
Maps to --scope=user|project|local on config set, or ~/.sidekick/personas/ vs .sidekick/personas/ for persona files.
Default recommendation: For personal preferences (weights, allowList, voice quality), suggest --scope=user. For team-shared settings, suggest --scope=project.
Exception: persona set (session-level, ephemeral) does NOT need a scope question.
# Session persona (ephemeral)
pnpm sidekick persona set <id> --session-id=<session-id>
pnpm sidekick persona clear --session-id=<session-id>
pnpm sidekick persona test <id> --session-id=<session-id> [--type=snarky|resume]
pnpm sidekick persona list [--format=table]
# Persistent config (requires scope question first)
pnpm sidekick config get <dot.path> [--scope=user|project|local] [--format=json]
pnpm sidekick config set <dot.path> <value> [--scope=user|project|local]
pnpm sidekick config unset <dot.path> [--scope=user|project|local]
Config base path for all persona settings: features.session-summary.settings.personas
If the user's request is vague (e.g., "make it better", "improve personas"), ask what axis they mean:
Always run pnpm sidekick persona list to confirm IDs before using them. Common confusions:
| User says | Actual ID |
|---|---|
| "spock" | mr-spock |
| "7 of 9" / "seven" | seven-of-nine |
| "kirk" | captain-kirk |
If a user requests a persona that doesn't exist, ask: "That persona isn't built in. Want me to create it, or pick a different one?"
Questions: 0 (persona ID is in the request)
pnpm sidekick persona set <id> --session-id=<session-id>
pnpm sidekick persona test <id> --session-id=<session-id> # Show voice to confirm
No scope question needed — session-level operation.
Questions: 0-1 (confirm list if ambiguous). Then scope question.
| Intent | Action |
|---|---|
| "Only show X, Y, Z" | Set allowList (comma-separated string) |
| "Never show X" | Add to blockList |
| "Remove X from rotation" | Add to blockList OR set weight to 0 |
Conflict rule: Never put the same ID in both allowList and blockList. blockList takes precedence, so the persona would never appear — confusing. Pick one mechanism.
Editing an existing list: config set replaces the entire value. To add/remove one persona, first read the current list with config get, then set the updated comma-separated string.
# allowList — comma-separated string, NOT JSON array
pnpm sidekick config set features.session-summary.settings.personas.allowList "bones,scotty,mr-spock,emh,seven-of-nine,captain-kirk" --scope=user
# blockList
pnpm sidekick config set features.session-summary.settings.personas.blockList "marvin,c3po" --scope=project
# Verify
pnpm sidekick config get features.session-summary.settings.personas --format=json
Available Star Trek personas: bones, scotty, mr-spock, emh, seven-of-nine, captain-kirk
See resources/PERSONAS.md for full persona catalogue with IDs.
Questions: 0 (intent maps directly). Then scope question.
Weight guidance:
| User says | Weight value |
|---|---|
| "more X" | 50-100 |
| "much more X" | 100+ |
| "less X" | 0.1-0.5 |
| "never X" | 0 |
Weights are ratios: Selection probability is weight / sum(weights). A weight of 100 with N others at 1 means selection ~100 / (100 + N) of the time. Don't use extreme values — anything above 1000 is effectively "always". For "always this persona right now", use persona set instead.
pnpm sidekick config set features.session-summary.settings.personas.weights.darth-vader 100 --scope=project
pnpm sidekick config set features.session-summary.settings.personas.weights.sidekick 0.3 --scope=project
# Verify
pnpm sidekick config get features.session-summary.settings.personas.weights --format=json
Questions: 1 (which personas, or all?). Then scope question.
Set a per-persona LLM profile override to get better output from the model.
| User says | LLM profile | Effect |
|---|---|---|
| "funnier / snarkier / more creative" | creative-long | Higher quality model, more tokens |
| "faster responses" | fast-lite | Trade quality for speed |
| "cheaper" | cheap-fallback | Lower cost model |
# Per-persona override
pnpm sidekick config set features.session-summary.settings.personas.llmProfiles.skippy creative-long --scope=user
# Verify with a test
pnpm sidekick persona test skippy --session-id=<session-id> --type=snarky
Questions: 2-3 (name/id, theme, tone keywords). Then scope question for file location.
File location: ~/.sidekick/personas/<id>.yaml (user) or .sidekick/personas/<id>.yaml (project)
NEVER put custom personas in assets/sidekick/personas/ — that's for bundled defaults only.
# ~/.sidekick/personas/gordon-ramsay.yaml