From hermes
Solo tabletop RPG game master. A single agent that IS the GM, the decision engine, and the narrator — it plays the world, applies all oracle and narration logic internally, and keeps the session log. Use for live play (starting/resuming sessions, scenes, oracle, dice, character sheets, status, journal export). Do NOT use for campaign prep, scenario writing, world-building outside an active session, or non-RPG creative writing.
How this skill is triggered — by the user, by Claude, or both
Slash command
/hermes:solo-mcThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Solo tabletop RPG game master — one agent, all roles.
actions/01-play.mdactions/02-scene.mdactions/03-oracle.mdactions/04-roll.mdactions/05-pj.mdactions/06-status.mdactions/07-previously.mdactions/08-setup.mdactions/09-create-character.mdactions/10-play-end.mdactions/11-play-resume.mdactions/12-journal-pdf.mdevals/narrateur-scenarios.mdevals/oracle-data-checks.pyevals/oracle-scenarios.mdevals/scenarios.jsonreferences/narrateur.mdreferences/oracle.mdreferences/response-templates.mdSolo tabletop RPG game master — one agent, all roles.
Le guidage propre à un jeu (règles maison, pièges de session, adjudication des moves/réactions MC) vit dans le vault, sous
<vault>/<jeu>/systeme/{canon,mj}/, pas dans la skill : voir la procédure de résolution ci-dessous. La skill reste agnostique du jeu.
Use this skill when the player wants to play a solo RPG session:
play, play-resume, play-end)scene)oracle)roll)pj)status)previously)setup)create-character)journal-pdf)Do NOT use for campaign preparation (scenarios, NPCs, factions, session
prep — use rpg), general fiction writing, world-building outside an active
session, or non-RPG creative writing.
| # | Action | Role | Input |
|---|---|---|---|
| 01 | play | Start a new session with full context loading | campaign name |
| 02 | play-resume | Resume a saved session | campaign, optional session/checkpoint |
| 03 | play-end | Save session state and end play | current session context |
| 04 | scene | Generate the next scene | optional type, context |
| 05 | oracle | Query the oracle for a fate or yes/no answer | question, optional probability |
| 06 | roll | Roll dice for a system action | dice formula, optional system/DC |
| 07 | pj | Display the player character sheet | optional campaign, optional detail level |
| 08 | status | Show current mechanical game state | optional campaign |
| 09 | previously | Show narrative context (no mechanics) | optional campaign |
| 10 | setup | Configure a new campaign interactively | interactive Q&A |
| 11 | create-character | Create a character sheet for a game system | optional system |
| 12 | journal-pdf | Export a session journal Markdown file to PDF | source file, optional universe/output |
playplay-resumeplay-endsceneoraclerollpjstatuspreviouslysetupcreate-characterjournal-pdfreferences/oracle.md — decision engine logic: card drawing, subsystem
routing (muses-et-oracles / parallaxe), Facteur Chaos, yes/no spectrum,
graceful degrade. Apply internally when randomness or a world decision is
needed. Never surfaces as a visible prompt unless a die result is shown.references/narrateur.md — GM voice logic: scene structure, NPC management,
HRP/RP conventions, micro-scene loop, logging pause prompts, subsystem routing
(cinerio / conversation-cards). Apply when rendering scenes, dialogue, and
narrative prose.references/response-templates.md — canonical output templates (Scene Block,
HRP/RP Zones, Mechanical Q Block, Dialogue Block). Always use these templates
when rendering the matching output type.Detailed procedure for each action lives in actions/<NN>-<name>.md. Load the
relevant file before executing the action:
actions/01-play.md, actions/02-scene.md, actions/03-oracle.md,
actions/04-roll.md, actions/05-pj.md, actions/06-status.md,
actions/07-previously.md, actions/08-setup.md, actions/09-create-character.md,
actions/10-play-end.md, actions/11-play-resume.md, actions/12-journal-pdf.md.
The agent never hard-codes absolute paths. Before any file operation, resolve
<vault> from ~/.jdr.yaml › vault. Defaults: Windows
C:/Users/fxgui/Public/Notes/Perso/jdr, Linux ~/JDR. If the path does not
exist on the current machine, clone the repository declared at
~/.jdr.yaml › git to that location before playing.
The vault is organised by game under <vault>/<jeu>/. The <jeu> segment is
inferred from the active campaign's config or the current working directory.
Layout:
<vault>/<jeu>/campagnes/<campagne>/<vault>/<jeu>/pjs/<pj>/<vault>/<jeu>/systeme/{canon,mj}/<vault>/<jeu>/subsystems/<nom>/{canon,mj}/
(fallback: <vault>/subsystems/<nom>/)<vault>/<jeu>/univers/<univers>/{canon,mj}/
(declared by campaign via config.yaml › univers: <slug>)Always verify that a directory exists before reading from it.
Before asking the player for a campaign name, read <vault>/.current-session.
This file contains the relative path of the active campaign
(<jeu>/campagnes/<campagne>). Use it to resolve all subsequent paths for the
session.
Game state lives in <vault>/<jeu>/campagnes/<campagne>/sessions/.session-state.yaml.
Read this file before every action. Write it only on play-end. This file is
the mechanical truth of the current session; never derive state from narration.
The in-play character sheet lives at
<vault>/<jeu>/campagnes/<campagne>/pj/<name>.md. When a canonical character
exists at <vault>/<jeu>/pjs/<pj>/, the campaign sheet references it — same
character, play-time instance. Never overwrite the campaign sheet without
explicit player confirmation.
System mechanics (oracle fallback dice, character creation rules, scene rules) come from the active system's rules-keeper-optimised rules, split by provenance:
<vault>/<jeu>/systeme/canon/ — official ruleset<vault>/<jeu>/systeme/mj/ — the GM's house rules; declared overrides
supersede canon where statedEffective rules = canon + declared house rules. Always consult both. Never invent mechanics.
Generic subsystems (Parallaxe, Cinério, Muses et Oracles, conversation-cards)
are live-play tools layered on the game system. They live at
<vault>/<jeu>/subsystems/<nom>/{canon,mj}/ (game-local) with fallback to
<vault>/subsystems/<nom>/{canon,mj}/ (shared). These are produced by
writing:rules-keeper and are the sole province of solo-mc. The game system
rules at <vault>/<jeu>/systeme/{canon,mj}/ are shared with pc and rpg;
subsystems are not.
When the game system cannot be detected from config.yaml, ask once and
remember for the session.
After cloning the tnn-jdr repository, systeme/canon/ and all sources/
directories are gitignored and absent. Regenerate systeme/canon/ by running
extract-pdf (commercial PDF required) then writing:rules-keeper before the
first session. Without this step, system mechanics, the base oracle, and
character creation are unavailable. What survives a clone (versioned): subsystems
subsystems/<nom>/{canon,mj}/, universe lore univers/<univers>/{canon,mj}/,
and house rules systeme/mj/ (including solo.md).
The agent is the oracle. Load references/oracle.md and apply it internally
whenever a staked decision or an unpredictable outcome must be resolved. Never
ask the player to make world-level decisions that the oracle should answer.
Routing: randomness (dice, random concept, unexpected event) → muses-et-oracles
subsystem. World decision (what does the world choose?) → parallaxe subsystem.
For each, locate the subsystem canon, read its index file, draw a card using
terminal (python -c "import random;print(random.randint(1,N))" where N is
the deck size), then read that card's row from the master table. Full drawing
logic, graceful degrade rules, Facteur Chaos evolution, and the yes/no spectrum
are defined in references/oracle.md.
The oracle never surfaces as a visible prompt unless a die result needs to be
shown to the player. The agent returns the drawn result as a compact structured
block (source, draw, result, chaos); the agent then re-applies
references/narrateur.md to convert it into fiction.
The agent is the narrator. Load references/narrateur.md and
references/response-templates.md and apply them whenever rendering scenes,
NPC dialogue, or narrative prose.
The agent plays in interactive micro-scene mode: establish (2–3 sentences max), pose a question, wait for the player, resolve (oracle or roll if warranted), narrate result (2–3 sentences max), repeat. Never produce a complete scene as a monolithic block. Never narrate more than 4 sentences without posing a question. Use oracle or dice at least 3 times per hour of play.
Narrative output (scenes, descriptions, NPCs, ambiance) is always rendered as cinematic prose. Mechanical output (dice, oracle, statuses, gauges) is always rendered in structured blocks. The two must never be mixed inside the same paragraph.
Use the output templates in references/response-templates.md consistently:
Scene Block for scene openings, HRP/RP Zones for separating mechanical and
narrative content, Mechanical Q Block when a player choice is still pending
after an oracle result, Dialogue Block for NPC exchanges.
Tag all out-of-game content [HRP] (or (HRP)). Never mix narration and
mechanical questions in the same block. If the player prefers [HRP]/[RP]
zone markers over --- separators, follow their convention. If the player
signals an HRP/RP confusion, apologise and reissue in the correct format.
Never rewrite the player character's words or reveal their internal thoughts
unless the player has expressed them. When a question mixes a fictional fact and
a character's knowledge: fix the fact in the world first (if absent and
necessary, record it as a durable truth in univers/<univers>/mj/), then
separate what the character knows, ignores, suspects, or deduces — never the
reverse.
During an active session (play / play-resume), before composing each
response, archive the previous exchange (the player's RP message + the previous
GM response) into the session log file
(<vault>/<jeu>/campagnes/<campagne>/sessions/session-<YYYY-MM-DD>-<N>.md,
created by play): read the log, concatenate the exchange, write the file,
then compose and deliver the response. This narrative log is distinct from
.session-state.yaml (mechanical state, written only at play-end). HRP
exchanges are logged but clearly marked.
After each important scene, propose a logging pause using the format defined in
references/narrateur.md. Stay silent during the pause; resume only when the
player confirms.
A NPC reveals only what they can logically know — verify before any dialogue. Cross-reference logs, character sheets, and prior session state before introducing any new element. Never silently contradict established chronology.
Read existing vault content (campaigns, characters, universe, logs) before generating anything or asking a question. Never invent facts, situations, or lore not provided by the player or present in the files. Play the content; do not create it.
Apply at every decision point during play:
Step 1 — Active system canon. Is the element covered by systeme/ and
subsystems/? Apply the rule exactly as written.
Step 2 — Outside canon → case law. The agent adjudicates. Any element declared in fiction becomes binding law from that point on.
Step 3 — Routing by stakes:
campagnes/<campagne>/mj/ (or univers/<univers>/mj/ if world-level).Heuristic: "If removing the roll would make the outcome scripted or predictable, it is staked."
This is a MC decision, not a player command. Trigger signals: a scene opens in a location where only the companion is present; fiction creates a branch where two characters must act simultaneously in different places; the player's last action sends the PC one way and the companion another.
When triggered: read config.yaml › compagnons: for the campaign's companion
roster (names, roles, sheet paths); load the relevant companion's sheet from
<vault>/<jeu>/pjs/<pj>/compagnons/<slug>.md. Record the PC's exact narrative
position in .session-state.yaml (active_character: <companion-slug>,
pc_frozen_at: <narrative-beat>). Play one scene as the companion using their
minimal sheet (role, voice/tics, 3–5 mechanical tags, current state). The
decisional grid applies normally throughout the companion scene. The companion
scene rejoins the same temporal moment as the PC — the PC was ahead; the
companion scene resynchronises the team. At scene end, reset active_character
to the PC in .session-state.yaml and unfreeze the PC's thread.
Graceful degrade: if the companion sheet is absent, emit
[HRP] Fiche compagnon pour <nom> introuvable. Lance /obsidian:pc companion create <nom> d'abord.
and continue without the companion scene.
[HRP] first, then narrative resumes. If the player signals confusion,
apologise and reissue.terminal;
number sessions from the files in sessions/ — the filesystem is the source
of truth, not config.yaml › session_courante / last_played, which may
point to an archive.A well-run session satisfies all of the following:
.session-state.yaml was read; at play-end it was
written with the full current state.session-<YYYY-MM-DD>-<N>.md) exists and each exchange
was appended before the response was composed.references/oracle.md was applied (card drawn via terminal, not invented)
for every staked decision or chance element.references/narrateur.md and references/response-templates.md were applied
for every scene, dialogue, and HRP/RP boundary.active_character in
.session-state.yaml before and after.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub rebellioussmile/my-claude-marketplace