| .agents/skills | ||
| templates | ||
| .gitignore | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| README.md | ||
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.mdwhosenamematches 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
descriptionlists 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 inreferences/entity-map.md, and thecampaign/...paths in the skills. - Your system. No pack is shipped, on purpose. When the campaign needs one,
add-materialgeneratessystems/<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/anddangers/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.