NPC Agents
Context: The
skill-contexthook injects NPC state when this skill is invoked. Use theProject dirvalue as$PROJECT_DIRin bash commands below. Session bead ID, active character, alignment, and class are available from hook context.
Manage NPC characters and session state. Characters are beads with alignment, class, persona, and role.
Disambiguation
Parse the first argument. First match wins:
- •No arguments → show current state
- •
off→ disable NPC Agents - •
create→ create a new character - •
list→ list all characters - •
show→ show a character's sheet - •
delete→ delete a character - •
set→ set anonymous alignment/class (no named character) - •Known alignment name → shorthand for
/npc set <alignment> - •Known class name → set class only (update session bead + settings.json)
- •Anything else → treat as a character name, resolve and assume
Known Names
- •Alignments:
lawful-good,neutral-good,chaotic-good,lawful-neutral,true-neutral,chaotic-neutral,lawful-evil,neutral-evil,chaotic-evil - •Classes:
fighter,wizard,rogue,cleric,bard,ranger
Commands
Show Current State (no arguments)
Read state from the skill-context hook output. Report:
- •Active character name (or "anonymous")
- •Alignment + class
- •Persona (if character active)
- •Active party (if any)
- •Session bead ID
Assume Character: /npc <name>
- •
Resolve character:
bashCHAR_ID=$("$PROJECT_DIR"/hooks/scripts/resolve-character.sh "<name>") - •
If not found, report error and suggest
/npc create. - •
Load character bead:
bashbd show "$CHAR_ID" --json
- •
Extract from labels:
alignment:<value>,class:<value>,role:<value>. - •
Update session bead state:
bashSESSION_ID=$("$PROJECT_DIR"/hooks/scripts/ensure-session.sh) "$PROJECT_DIR"/hooks/scripts/set-session-state.sh "$SESSION_ID" alignment=<alignment> "$PROJECT_DIR"/hooks/scripts/set-session-state.sh "$SESSION_ID" active-class=<class> "$PROJECT_DIR"/hooks/scripts/set-session-state.sh "$SESSION_ID" active-character="$CHAR_ID" "$PROJECT_DIR"/hooks/scripts/set-session-state.sh "$SESSION_ID" mode=<name> - •
Update
settings.jsonso the next session starts with this character:bashjq '.npc.mode = "<name>" | .npc.class = "<class>"' "$PROJECT_DIR/.claude/settings.json" > /tmp/npc-settings.json && mv /tmp/npc-settings.json "$PROJECT_DIR/.claude/settings.json"
- •
Invoke the alignment and class skills to load behavioral profiles:
code/<alignment> /<class>
- •
Announce: character name, alignment, class, persona, role.
Create Character: /npc create <name> <alignment> [class] [--persona "..."] [--role <role>]
- •
Validate alignment name. Class is optional.
- •
Build labels:
npc:character,alignment:<alignment>. Addclass:<class>androle:<role>if provided. - •
Create bead:
bashbd create "<name>" -t task -l "npc:character,alignment:<alignment>,class:<class>,role:<role>" -d "<persona>"
If no persona provided, use empty description.
- •
Announce: character created with alignment, class, persona. Suggest
/npc <name>to assume.
List Characters: /npc list
bd list --label npc:character -t task --json
Display as a table: name, alignment, class, role.
Show Character: /npc show <name>
- •Resolve character via
resolve-character.sh. - •
bd show "$CHAR_ID" --jsonto get full details. - •Display character sheet with: name, alignment, class, persona, role, party memberships.
- •For party memberships, check which parties this character is a child of (this may require listing parties and checking children).
Delete Character: /npc delete <name>
- •Resolve character via
resolve-character.sh. - •Ask for confirmation before proceeding.
- •Delete:
bash
bd delete "$CHAR_ID"
- •If this was the active character on the session bead, reset to anonymous.
Set Anonymous Mode: /npc set <alignment> [class]
Set alignment (and optionally class) without a named character.
- •
Validate alignment name. Validate class name if provided.
- •
Update session bead:
bashSESSION_ID=$("$PROJECT_DIR"/hooks/scripts/ensure-session.sh) "$PROJECT_DIR"/hooks/scripts/set-session-state.sh "$SESSION_ID" alignment=<alignment> "$PROJECT_DIR"/hooks/scripts/set-session-state.sh "$SESSION_ID" active-character=anonymous "$PROJECT_DIR"/hooks/scripts/set-session-state.sh "$SESSION_ID" mode=<alignment>If class provided:
bash"$PROJECT_DIR"/hooks/scripts/set-session-state.sh "$SESSION_ID" active-class=<class>
- •
Update
settings.json:bashjq '.npc.mode = "<alignment>" | .npc.class = "<class-or-off>"' "$PROJECT_DIR/.claude/settings.json" > /tmp/npc-settings.json && mv /tmp/npc-settings.json "$PROJECT_DIR/.claude/settings.json"
- •
Invoke alignment (and class) skills to load profiles.
- •
Announce: "Operating as anonymous <Alignment> [<Class>]."
Disable: /npc off
- •
Update
settings.json:bashjq '.npc.mode = "off" | .npc.class = "off"' "$PROJECT_DIR/.claude/settings.json" > /tmp/npc-settings.json && mv /tmp/npc-settings.json "$PROJECT_DIR/.claude/settings.json"
- •
Update session bead:
bashSESSION_ID=$("$PROJECT_DIR"/hooks/scripts/ensure-session.sh) "$PROJECT_DIR"/hooks/scripts/set-session-state.sh "$SESSION_ID" mode=off "$PROJECT_DIR"/hooks/scripts/set-session-state.sh "$SESSION_ID" active-character=anonymous - •
Announce: "NPC Agents disabled. Operating normally."
Reference
Alignments
lawful-good, neutral-good, chaotic-good, lawful-neutral, true-neutral, chaotic-neutral, lawful-evil, neutral-evil, chaotic-evil
Classes
fighter, wizard, rogue, cleric, bard, ranger