No description
Find a file
2026-11-02 17:51:24 +01:00
.agents/skills Let the oracle weigh odds and trace consequences 2026-11-02 17:51:24 +01:00
templates Ask the frame first and narrow open settings 2026-11-01 14:03:08 +01:00
.gitignore Add campaign wiki skills and templates 2026-11-01 13:04:04 +01:00
AGENTS.md Let the oracle weigh odds and trace consequences 2026-11-02 17:51:24 +01:00
CLAUDE.md Make the kit harness-agnostic under .agents/skills 2026-11-01 13:34:48 +01:00
README.md Let the oracle weigh odds and trace consequences 2026-11-02 17:51:24 +01:00

RPG campaign skills

Agent Skills that turn a tabletop campaign into a versioned wiki: one file per entity, a profile that fixes system and tone, and a commit after every approved change.

They are portable by design: plain SKILL.md files in the Agent Skills format, no harness name in the paths, no harness-specific frontmatter. Run them from OpenCode, Pi, Claude Code, or anything else that reads the format.

The skills are agnostic about game system, tone, setting and language. Those parameters live in the campaign profile and the skills read them there, so the same kit works for Dungeon World, D&D, Fate or whatever you play next.

Everything in this repository is English. The campaign material the skills write is not: it is written in the language the user talks to the model in.

The loop

Skill Fires when Does
start-campaign "let's start a campaign", "new campaign" Interviews for the frame, the premise and the table, writes the profile, scaffolds the wiki
add-material "prepare an encounter", "generate an NPC", "add a location", "develop the threat" Proposes and then writes new material into a campaign that already exists
consult-oracle "I'm stuck", "give me ideas", "open a new thread", "what are the chances", "what if they…" Answers in chat, never on disk: options for a stalled scene, a thread, a session or a closing beat; a qualitative odds read with the canon that supports it; the consequences of an odd action
record-canon "note that…", "their name is…", "they arrived at…" Writes a dictated fact into the right file, creates it from the template if needed, wires it into index, glossary and relations
close-session "close the session", "end of session" Writes the session log, advances the tracks that moved, updates the dashboard, timeline and affected entities

Two rules run through all five: read before inventing and propose before writing. AGENTS.md holds those invariants; the skills hold the steps. consult-oracle is the exception that proves the rule: it is read-only by design, and whatever it generates only becomes canon through add-material or record-canon.

What's inside

.agents/skills/
├── start-campaign/
│   ├── SKILL.md                    founding: interview, profile, scaffolding
│   ├── references/foundations.md   what each campaign parameter decides
│   └── references/scaffold.md      directory tree, seed order, README skeleton
├── add-material/
│   ├── SKILL.md                    propose and write new material, at any point
│   └── references/prep-shape.md    system-agnostic prep questions
├── record-canon/
│   ├── SKILL.md
│   └── references/entity-map.md    type → folder → template → index section
├── consult-oracle/
│   ├── SKILL.md                    answers in chat, nothing on disk
│   ├── references/toolbox.md       32 techniques: scenes, threads, sessions, odds, consequences
│   └── references/shapes.md        clue web, clock, session, place, odds read, consequence ladder
└── close-session/
    └── SKILL.md

templates/     13 blank skeletons: profile, entities, session, dashboard, timeline, glossary
AGENTS.md      the workspace constitution to merge into your campaign repo
CLAUDE.md      one line importing AGENTS.md, for Claude Code

No game text is shipped: system packs are generated on demand into systems/ in your campaign, from the rules you actually use.

Install

Where things live

.agents/skills/   the skills, in the shared Agent Skills location
AGENTS.md         the invariants the skills rely on
CLAUDE.md         imports AGENTS.md, for Claude Code
templates/        the skeletons a campaign is scaffolded from

.agents/skills/ is the location most harnesses converged on. What each one reads, as of October 2026:

Harness Reads .agents/skills/ Instructions file Setup
Codex CLI / IDE yes AGENTS.md none
Pi yes AGENTS.md none
OpenCode yes AGENTS.md none
Cursor yes AGENTS.md none
Gemini CLI / Antigravity yes AGENTS.md (Gemini CLI needs context.fileName) none
GitHub Copilot / VS Code yes AGENTS.md none
Devin Desktop (Windsurf) yes AGENTS.md none
Roo Code yes AGENTS.md none
Cline no AGENTS.md symlink into .claude/skills/
Claude Code no CLAUDE.md one symlink, below

Claude Code only looks in .claude/skills/. One symlink covers it, and CLAUDE.md already imports AGENTS.md:

mkdir -p .claude && ln -s ../.agents/skills .claude/skills

Two caveats worth knowing: Claude Code reads AGENTS.md only when there is no CLAUDE.md (the import here makes that moot), and Gemini CLI needs context.fileName to include AGENTS.md.

As the base for a new campaign

cp -r rpg-campaign-skills my-campaign
cd my-campaign
rm -rf .git
git init && git add -A && git commit -m "Initialize the campaign kit"

Open it in your harness and say "let's start a campaign". start-campaign interviews you for the frame, the premise and the table, writes the profile and scaffolds campaign/ from templates/; then add-material writes the first location, the first threat and the party.

In an existing campaign

Two ways, and they pull in opposite directions:

Copy .agents/skills/ and templates/ into the campaign repository, then merge the ## Workflows (skills) section of this AGENTS.md into yours. The campaign stays self-contained and travels with its skills, but every improvement here has to be copied across by hand.

Install once at user scope and keep the campaign repo free of skills:

ln -s ~/Projects/rpg-campaign-skills/.agents/skills/* ~/.agents/skills/

Then git pull in this repo updates every campaign on the machine. Add ~/.claude/skills/ too if you use Claude Code, which does not read .agents/.

Either way, templates/ lives in the campaign repo: the skills reference it as a workspace path, and it is campaign material (translated, part of the canon). Only the procedures are shared.

A symlinked install always runs the latest version and breaks if you move the repository; a copied install is pinned per campaign. Pick per how much you trust your own discipline.

If your harness or skill manager prunes entries it did not create, re-run the ln -s line after it runs; the links live outside its lock file.

Requirements

  • Any harness that implements the Agent Skills format: a directory with a SKILL.md whose name matches the folder, lowercase and hyphenated. The file is plain Markdown; nothing here is harness-specific.
  • git, because the loop commits and pushes after every approved change.
  • No scripts and no runtime dependencies: the skills are prose and templates.

Language

Three layers, three rules:

Layer Language Why
Skills, AGENTS.md, this README, the kit's templates English Tooling, meant to be shared and reviewed
Campaign prose (lore, session logs, index, the campaign's own templates) The language the user talks to the model in It is read at the table, not by a developer
Frontmatter keys and status values English Machine-readable, and stable across translations

The language is never interviewed for. The skills take it from the conversation and record it in the profile's language field so later sessions stay consistent. If a campaign already has material, its language wins over the current conversation's.

When a campaign is scaffolded, its templates/ are generated in the campaign language from the kit's English ones, so every entity file starts from a localized skeleton.

The campaign profile

campaign/campaign-profile.md is the anchor. templates/campaign-profile.md is its contract: system, language, genre and tone, setting, premise, table group, table rules, content limits and vocabulary. Everything else reads it before writing.

If a parameter is missing, the answer is to ask — never to assume a game or a tone. Nothing in the skills hardcodes one.

The oracle

consult-oracle exists for the moment every GM knows: the scene has stalled, or the next thread has to come from somewhere. It carries a catalogue of techniques — thirty-two, in five groups — plus six output shapes, and it answers in chat.

It also answers the two questions a GM asks mid-scene and usually has to make up alone: how likely is this? and what would happen if they did that? The first comes back as a band — certain, likely, even, unlikely, far-fetched — with the canon facts that push it either way, and never as a number: the campaign's system is the only thing that resolves. The second comes back as four rungs, from works clean to fails and opens something, plus who notices and what the world keeps afterwards.

It is deliberately read-only. Nothing it produces is written to disk until the GM picks an option, and then it goes through add-material or record-canon. At the table you want three ideas in ten seconds, not a file to tidy up later.

Ask it for what you need: "the scene died, give me three ways to restart it", "open a thread that touches the thief's past", "I need a session plan", "how do I close this without it fizzling", "what are the odds they talk their way past the gate", "what happens if the wizard tries to eat the ward".

Layout it assumes

campaign/
  campaign-profile.md  state.md  timeline.md  glossary.md
  characters/  npcs/  locations/  items/  monsters/
  threats/  dangers/  encounters/  sessions/
templates/
systems/          generated on demand, one pack per game

Adapting the kit

  • Trigger phrases. Each skill's description lists the phrases that load it, in English. Add your own, in the language you actually speak at the table: the description is what the model matches against.
  • Folder or file names. Edit the tree in references/scaffold.md, the table in references/entity-map.md, and the campaign/... paths in the skills.
  • Your system. No pack is shipped, on purpose. When the campaign needs one, add-material generates systems/<system>.md: the anatomy of a complete entity in your game, the tracks that make a threat move, and the mapping from the templates' neutral names to that game's terms. It is a generated summary for your table, not a copy of the rulebook — read it before trusting it, and ask for corrections where it gets a rule wrong.
  • Not a PbtA game. Drop threats/ and dangers/ if your system has no notion of fronts, and adjust the entity map. The rest of the loop is system-agnostic.

Why a repository and not a prompt

The canon and the procedure change at different speeds. A prompt that mixes both has to be rewritten whenever either moves; here, changing the tone of the campaign is a one-line edit to the profile, and changing how notes are written is a commit to a skill. Both are reviewable, revertable, and travel with the campaign.

Third-party game text

This repository ships none, deliberately. Game systems are published under their own licences, and a kit that bundles their rules is a kit nobody can legally pass around. System packs live in systems/ inside your campaign, are generated on demand as a summary in your own words, and stay there: they are yours to keep private or share, depending on the licence of the game you play.

The narrative toolbox follows the same rule. Its techniques are paraphrased in this kit's own words and linked to their authors, so a reader can go and read the originals; no article, chapter or table is reproduced.

License

The skills, templates and documentation in this repository: no license yet. Add one before publishing: MIT or Apache-2.0 for the skills, CC-BY-4.0 if you want the prose to be reusable with attribution.