Tools for running a TTRPG campaign workspace: review, export, deploy, name generation.
Project description
bunnyforge
An opinionated way to run a tabletop-RPG campaign as a plain-files workspace — designed to be managed collaboratively by a GM and an AI agent, with one-way publishing to a DokuWiki players' site.
Your campaign is a directory of Markdown files with front matter: NPCs, factions, places, sessions, mechanics. bunnyforge gives that directory a skeleton, reviews its integrity, generates names from culture inventories you define, and exports the player-visible slice to DokuWiki. Everything is a text file; everything works offline; the only state is your git history.
- Python ≥ 3.11, zero runtime dependencies.
- Agent-first doctrine.
initwrites anAGENTS.mdcontract that tells an AI agent how to behave in the workspace, and doctrine skeletons — a style guide and a situation-design guide that interview you: each section explains what belongs in it, so filling them in is answering questions, not staring at a blank file. - Player-visibility model. Every file carries a
visibilityfield; the exporter enforces it, so GM-only material cannot leak to the wiki.
Install
pip install bunnyforge
Quickstart
bunnyforge init my-campaign --name "My Campaign"
cd my-campaign
bunnyforge review checkup # 0 errors, 0 warnings on a fresh workspace
Then fill in style-guide.md and situation-design.md — they arrive as
skeletons that tell you what each section is for — and start writing
entity files from the templates in _Templates/.
Subcommands
| command | what it does |
|---|---|
init |
scaffold a new campaign workspace |
review |
run a named workspace review suite (checkup, wiki) |
export-player |
write player-safe copies of content files to Export/ |
deploy-export |
render Export/ into a DokuWiki staging tree |
import-perceptions |
import player-authored wiki pages into Perceptions/ |
build-sheets |
build one-page HTML reference sheets for a session |
names |
generate culture-appropriate names |
test |
run the workspace test suite |
Run bunnyforge <command> --help for a command's own options.
The workspace
campaign.toml marks the workspace root and holds configuration —
directory layout, wiki namespace, name-generator inventories. Commands
work from any subdirectory (they walk up to the marker), from
$BUNNYFORGE_WORKSPACE, or from anywhere with --workspace PATH.
init also scaffolds a tests/ folder. Its README.md explains the
campaign tests it invites you to write — the setting-specific invariants
review checkup cannot know, like "every NPC's faction actually exists" —
and ships a worked example, commented out, to adapt. bunnyforge test
runs them, and checks that no test wrote into your campaign while running.
Names
bunnyforge names builds names from syllable inventories you write
yourself, one TOML file per culture. The tool ships the engine and a
worked example; it ships no cultures of its own, and takes no position on
which real-world naming tradition any fantasy species should draw on —
that is a setting-authorship decision, and it stays yours.
bunnyforge names --list
bunnyforge names <culture> -n 10
bunnyforge names <culture> --place --seed 42
The samples/ directory is a ladder of eight worked
configurations, from a single people to a full multi-culture setting with
registers and spelling variants.
DokuWiki export
export-player renders the player-visible slice; deploy-export pushes
it into a DokuWiki staging tree. Sync is strictly one-way: the wiki is a
published artifact, never a source of truth. import-perceptions brings
player-authored pages back as perceptions — recorded belief, explicitly
not canon.
Development
pip install -e .
python3 -m unittest discover -s tests -t .
(bunnyforge test is for running a campaign's tests from inside a
workspace — it is not this package's test runner.)
The bunnyforge command is not a file in this repository: pip generates a
launcher from [project.scripts] in pyproject.toml at install time, and
it calls the dispatcher in src/bunnyforge/cli.py.
Every subcommand is also runnable on its own — python3 -m bunnyforge.generate_names — which is exactly what the dispatcher forwards
to.
Design history lives in docs/superpowers/specs/.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bunnyforge-0.1.0.tar.gz.
File metadata
- Download URL: bunnyforge-0.1.0.tar.gz
- Upload date:
- Size: 155.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6442c67aa8c7837224c75589eb16545352c0e16d0749527edf29c12c52fe6349
|
|
| MD5 |
ecaf96df5620f96bbdff5c7e5e8c2759
|
|
| BLAKE2b-256 |
401c4fd6bad99d68d9598b8d738fb0ad960934295f3aecb9cb97cc946a445942
|
Provenance
The following attestation bundles were made for bunnyforge-0.1.0.tar.gz:
Publisher:
publish.yml on dcltdw/bunnyforge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bunnyforge-0.1.0.tar.gz -
Subject digest:
6442c67aa8c7837224c75589eb16545352c0e16d0749527edf29c12c52fe6349 - Sigstore transparency entry: 2341364858
- Sigstore integration time:
-
Permalink:
dcltdw/bunnyforge@f4f8c9f8c80cf43fa488df60d80c8aaa5cfa4388 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/dcltdw
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f4f8c9f8c80cf43fa488df60d80c8aaa5cfa4388 -
Trigger Event:
push
-
Statement type:
File details
Details for the file bunnyforge-0.1.0-py3-none-any.whl.
File metadata
- Download URL: bunnyforge-0.1.0-py3-none-any.whl
- Upload date:
- Size: 105.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
454f264a3dbdf5e10d9daf3848124334cd19ab976ac329c2adc14b06d9fbd273
|
|
| MD5 |
e09424b463b276b5abe15b8340c47a43
|
|
| BLAKE2b-256 |
d2fef77ca05ceb867387eacd6d94214b53a5221feed7d3f7e962d30c94671fa4
|
Provenance
The following attestation bundles were made for bunnyforge-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on dcltdw/bunnyforge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bunnyforge-0.1.0-py3-none-any.whl -
Subject digest:
454f264a3dbdf5e10d9daf3848124334cd19ab976ac329c2adc14b06d9fbd273 - Sigstore transparency entry: 2341364869
- Sigstore integration time:
-
Permalink:
dcltdw/bunnyforge@f4f8c9f8c80cf43fa488df60d80c8aaa5cfa4388 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/dcltdw
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f4f8c9f8c80cf43fa488df60d80c8aaa5cfa4388 -
Trigger Event:
push
-
Statement type: