coc7-keeper-lite
CoC 7e Keeper standalone — no pip install needed. File-based persistence, zero dependencies.
SKILL.mdstandalone/SKILL.md
GitHubCoC 7e Keeper (Standalone)
Standalone mode uses Python stdlib only (tools/portable.py) + plain Markdown files.
No sagasmith-coc runtime required.
Quick Start
python portable.py doctor
python portable.py campaign start --name "Arkham"
python portable.py character create --campaign <id> --name "Herbert" --sheet '{"str":50}'
python portable.py module ingest --campaign <id> --path "scenario.md" --title "Lightless Beacon"
python portable.py module current --campaign <id> --scope party
python portable.py roll d100 --score 65
Data lives in ~/.sagasmith/. Create a campaign first.
Keeper Turn
- Resolve scope (
party/group:<id>/player:<id>). Runmodule current. - Read that scope's scene and player-visible discoveries.
- Clarify investigator intent.
- Retrieve a reference when uncertain.
- Roll d100 openly and resolve the success level.
- Apply SAN, combat, or chase mechanics.
- Narrate consequences without revealing hidden info.
- Merge clues, handouts, and triggers into progress.
- Record durable clues, events, and saves.
Before play read skills/coc7-keeper/references/KEEPER_RULES.md. Load
skills/coc7-keeper/references/SCENARIO_INDEX.md for scenario validation.
Commands
Campaign
python portable.py campaign start --name "Arkham"
python portable.py campaign list
python portable.py campaign get --campaign <id>
Characters
python portable.py character create --campaign <id> --name "Herbert West" --sheet '{"str":50,"con":60,"siz":65,"dex":55,"int":80,"pow":70,"edu":75}'
python portable.py character list --campaign <id>
python portable.py character get --campaign <id> --name "Herbert West"
Scenarios
python portable.py module ingest --campaign <id> --path "scenario.md" --title "Scenario"
python portable.py module index --campaign <id>
python portable.py module current --campaign <id> --scope party
python portable.py module read-scene --campaign <id> --scene <id>
python portable.py module search --campaign <id> --query "<situation>" --limit 5
python portable.py module set-progress --campaign <id> --scope party --scene <id> --progress 50 --state '{"discovered_clues":["letter"]}'
Import Markdown only. Convert PDF first.
Dice (d100)
python portable.py roll d100 --score 65
# → {"roll": 39, "score": 65, "level": "regular", "success": true}
# Levels: critical (01) > extreme (≤score/5) > hard (≤score/2) > regular (≤score) > failure
python portable.py roll dice --expression "1D6"
Events & Memory
python portable.py event add --campaign <id> --type clue --summary "Found torn letter"
python portable.py memory add --campaign <id> --type clue --subject "Letter" --content "Mentions the church"
python portable.py memory search --campaign <id> --query "letter"
Save / Restore
python portable.py save create --campaign <id> --label "Before the ritual"
python portable.py save list --campaign <id>
python portable.py save restore --campaign <id> --slot 3
Reference Docs
skills/coc7-keeper/references/KEEPER_RULES.mdskills/coc7-keeper/references/SCENARIO_INDEX.mdskills/coc7-keeper/references/INVESTIGATOR_CREATION.mdskills/coc7-keeper/references/KEEPER_TEMPLATES.mdskills/coc7-keeper/references/COMBAT_CHASE.mdskills/coc7-keeper/references/SANITY.mdskills/coc7-keeper/references/INVESTIGATION.md
Data Location
~/.sagasmith/
campaigns.json # campaign index
<campaign_id>/
campaign.json # metadata
characters/<name>.json # investigator sheets
modules/<source_key>.md # imported scenarios
progress.json # scoped scene progress
events.jsonl # event log
memories.jsonl # campaign memory
saves/<slot>/ # snapshot copies
Limitations
- No PDF import — convert to Markdown first
- No commercial rulebook search
- No SQL FTS5 — lexical scoring with CJK query expansion
- No ChromaDB vector search
- No built-in SAN loss or combat melee — roll d100 and apply rules manually