Agentic engine for AI role-playing — agents as a game
Project description
NeonRP CLI
NeonRP CLI is a developer-friendly command-line engine for playing and iterating on file-backed text RPGs.
Why NeonRP (vs. a web chat)?
NeonRP is built around engine-like guarantees:
- Resume / Undo / Branch: checkpointed gameplay you can safely explore.
- Plan → Diff → Apply: changes are visible and validated before they land.
- Append-only events + snapshots: reproducible and debuggable runs.
- Minimal-context retrieval: fast runs even with large worlds.
- Sandbox & Replay: isolated experimentation and determinism verification.
Installation
Recommended — one-liner (no OS security prompt)
This path downloads the installer through curl / irm so neither macOS
Gatekeeper nor Windows SmartScreen flags it. Paste into a terminal:
# macOS / Linux
curl -LsSf https://worldlines.gg/install.sh | sh
# Windows (PowerShell)
irm https://worldlines.gg/install.ps1 | iex
Installs uv (if missing) then uv tool install worldlines. Verify
with neonrp --help or just worldlines.
Alternative — double-click launcher
Prefer not to touch a terminal? Download a platform launcher and double-click it. The macOS app opens Terminal for you, runs the first-time install (or self-updates on later launches), then hands off to the TUI. Windows follows the same flow via a batch file.
| Platform | File | Download |
|---|---|---|
| macOS | WorldLines.dmg |
latest |
| Windows | WorldLines.bat |
latest |
Linux users should use the terminal install path above:
curl -LsSf https://worldlines.gg/install.sh | sh
Heads-up: browser-downloaded launchers may still be tagged as untrusted. First run only, you may need one extra approval step.
macOS — first-time open
Open the .dmg, drag WorldLines.app into Applications, then launch
it from there.
Because the app is not yet signed / notarized, Gatekeeper may block the first launch. If that happens, either:
xattr -d com.apple.quarantine /Applications/WorldLines.app 2>/dev/null || true
or right-click WorldLines.app → Open → Open again in the
confirmation dialog. macOS remembers this choice for later launches.
Prefer a raw bundle instead of a disk image? Use
WorldLines.app.zip.
Windows — first-time open
Double-click WorldLines.bat. SmartScreen shows "Windows protected
your PC" → click More info → Run anyway. Windows remembers
this choice.
After the first run, pin the launcher however you like and treat it like any other shortcut.
Developers — editable install
# From local source (editable install — picks up code changes)
uv tool install -e /path/to/NeonRP
# Verify installation
neonrp --help
Users in China (partial GitHub / Cloudflare connectivity)
Some mainland networks throttle or drop GitHub Release downloads and
Cloudflare-fronted domains. If curl https://worldlines.gg/install.sh
times out, try:
# 1) Fetch install.sh from GitHub directly (sometimes faster than the
# Cloudflare redirect, depending on ISP routing):
curl -LsSf \
https://github.com/LudicDynamics/WorldLines/releases/latest/download/install.sh \
| sh
# 2) Force uv to use a China-hosted PyPI mirror before installing:
export UV_DEFAULT_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
uv tool install worldlines
# (alternative mirrors: mirrors.aliyun.com/pypi/simple,
# mirrors.cloud.tencent.com/pypi/simple)
# 3) Both at once — pass CHINA_MIRROR=1 to install.sh:
CHINA_MIRROR=1 curl -LsSf https://worldlines.gg/install.sh | sh
If none of the above work, a VPN is the last resort. Auto-update
(neonrp self-update) honors the same UV_DEFAULT_INDEX variable, so
exporting it in your shell profile keeps future upgrades on the mirror
too.
Quick start
# Just run neonrp to start the TUI (like Claude Code)
neonrp
# Or use subcommands directly
neonrp init
neonrp game new
neonrp run "look around"
neonrp save
neonrp undo
neonrp branch "try-stealing-route"
neonrp init is enough to start working in TUI build mode. Fresh projects now expose packaged builtin skills automatically, so /game new is optional unless you want the default starter world and play-agent scaffold immediately.
Validation & Indexing (M1)
# validate game data against schema
neonrp validate [--json]
# build / update entity index
neonrp index build [--json]
neonrp index update [--json]
# search entities
neonrp find "tokyo" --kind town --json
# get ranked context for a query
neonrp context "neon city" --limit 5 --json
Embedding Retrieval (Opt-in)
{
"embedding": {
"enabled": true,
"model_ref": "openai-local-qwen3-embedding-0.6b"
},
"models": {
"openai-local-qwen3-embedding-0.6b": {
"provider": "openai",
"base_url": "http://127.0.0.1:1234/v1",
"model": "text-embedding-qwen3-embedding-0.6b",
"api_key": "1234"
}
}
}
index buildwill precompute vectors whenembedding.enabled=true.context/read_contextuse hybrid fuzzy + vector retrieval automatically when enabled.- If embedding is disabled, retrieval remains fuzzy-only.
Agents & Controlled Writes (M2)
# create and manage agents
neonrp agent new narrator
neonrp agent list --json
neonrp agent show narrator --json
# apply a pre-generated proposal
neonrp agent run narrator --proposal changes.json --apply --json
# view agent run logs
neonrp agent logs <run_id>
LLM Integration + Import (M3)
# LLM-driven agent run (single-shot)
neonrp agent run narrator --query "describe the town square" --provider glm --json
neonrp agent run narrator --query "..." --provider stub --apply --json
# import SillyTavern character card (JSON or PNG)
neonrp import sillytavern-card character.json --json
neonrp import sillytavern-card character.png --json
# import on TUI startup
neonrp tui --import-card character.png --import-id my-character
Sandbox & Replay (M4)
# save, then create a sandbox from it
neonrp save my-checkpoint
neonrp load # list loadable snapshots
neonrp sandbox new experiment --from my-checkpoint --switch
# list / switch / drop sandboxes
neonrp sandbox list --json
neonrp sandbox switch main
neonrp sandbox drop experiment --force
# verify replay determinism
neonrp replay verify --from my-checkpoint --json
# checkout a past event into a new sandbox
neonrp replay checkout --from my-checkpoint --to 5 --to-branch rollback --json
save/load snapshots now include the current branch's session transcript in addition to game/, events, and metadata.
Terminal User Interface (TUI)
NeonRP includes a rich terminal UI for interactive gameplay:
# launch the TUI
neonrp tui
# launch with specific branch
neonrp tui --branch experiment
# launch with provider override
neonrp tui --provider openai
# continue previous branch session on startup
neonrp tui --continue
# force start a new session on startup (default behavior)
neonrp tui --new
# import a Tavern card before the first turn
neonrp tui --import-card character.png --import-id my-character
# enable verbose diagnostics
neonrp tui --verbose
# launch with LM Studio (OpenAI-compatible local server)
neonrp tui --provider lmstudio
TUI Features
- Single-pane conversational layout: Claude Code style transcript + input
- Init-first workflow:
/initis enough to start build-mode work in a fresh directory - Builtin skills on fresh projects: packaged skills appear even before local
skills/exist - Slash command workflow: Enter/Tab completion with command hints
- Session management:
/sessionspicker,/continue,/new - Direct Tavern import entry points:
--import-cardon startup or/import sillytavern-card ...in-session - Verbose diagnostics:
/verbose on|off|statusand--verbose - Streaming transcript: assistant/tool/thinking updates rendered incrementally
- Live token counters: local real-time estimates in the top-right status bar
Key Bindings
| Key | Action |
|---|---|
q |
Quit |
Ctrl+Q |
Safe quit (immediate terminal return) |
Esc |
Interrupt in-flight LLM turn |
Ctrl+K |
Command palette |
Ctrl+P |
Command palette |
F6 |
Copy full transcript |
See TUI Guide for complete documentation.
Testing & Coverage
# fast regression
uv run pytest -q
# full coverage report
uv run pytest --cov=neonrp --cov-report=term-missing -q
# real endpoint e2e (uses ~/.neonrp/config.json)
NEONRP_E2E_LLM=1 uv run pytest tests/test_llm_real_endpoint.py -q
Documentation
- Product Roadmap - v0.1.x → v0.2 → v0.3 → v1.0 release direction
- Release Notes - per-version changelogs
- Tutorial: Your First Game - Zero-to-first-turn walkthrough
- CLI Reference - Complete command reference
- TUI Guide - Terminal UI documentation
- Architecture Overview - System design
- Developer Guide - Contribution guidelines
Development
For contribution guidelines, architecture details, and the roadmap, see:
Project details
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 neonrp-0.1.9.tar.gz.
File metadata
- Download URL: neonrp-0.1.9.tar.gz
- Upload date:
- Size: 4.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6dcc85f49f305d80a665e1d3dac3244ca55b9bfd29af972e22366afcb75c207c
|
|
| MD5 |
c7557b6106bcd8e84547a50ddc0b8184
|
|
| BLAKE2b-256 |
e60cd5cc1f8ff073022ce99f836a2dc1c14d3f8d63cd595f81fb1a9f86e9d56a
|
Provenance
The following attestation bundles were made for neonrp-0.1.9.tar.gz:
Publisher:
release.yml on LudicDynamics/NeonRP
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
neonrp-0.1.9.tar.gz -
Subject digest:
6dcc85f49f305d80a665e1d3dac3244ca55b9bfd29af972e22366afcb75c207c - Sigstore transparency entry: 1397671532
- Sigstore integration time:
-
Permalink:
LudicDynamics/NeonRP@8b69f46d1778a1feff45d47401226353f4b74f2b -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/LudicDynamics
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8b69f46d1778a1feff45d47401226353f4b74f2b -
Trigger Event:
push
-
Statement type:
File details
Details for the file neonrp-0.1.9-py3-none-any.whl.
File metadata
- Download URL: neonrp-0.1.9-py3-none-any.whl
- Upload date:
- Size: 551.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2abb47ae1b9b7b2a7b53a0a7b880b01dc90a23b83fb34d571036cc641f187c3a
|
|
| MD5 |
4e0f969a72314f9c2dd432dbfba44769
|
|
| BLAKE2b-256 |
0c4d3e95b7eea9e6b35480bf71bea30cc33f15285014dc1774a91e9b7ce729cf
|
Provenance
The following attestation bundles were made for neonrp-0.1.9-py3-none-any.whl:
Publisher:
release.yml on LudicDynamics/NeonRP
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
neonrp-0.1.9-py3-none-any.whl -
Subject digest:
2abb47ae1b9b7b2a7b53a0a7b880b01dc90a23b83fb34d571036cc641f187c3a - Sigstore transparency entry: 1397671537
- Sigstore integration time:
-
Permalink:
LudicDynamics/NeonRP@8b69f46d1778a1feff45d47401226353f4b74f2b -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/LudicDynamics
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8b69f46d1778a1feff45d47401226353f4b74f2b -
Trigger Event:
push
-
Statement type: