Dash 00794aca37 build: type-check with ty in a pre-commit hook
ty joins the dev dependency group, locked at 0.0.89, and a local
hook runs `uv run ty check` over the whole project whenever Python
files change. [tool.ty.src] limits the check to pqcli/ and tests/,
so agent worktrees under .claude/ are not checked as duplicate
copies of the project.
2026-10-17 15:55:58 +02:00
2026-10-17 15:55:58 +02:00
2026-10-17 15:55:58 +02:00
2022-11-11 08:02:27 +01:00
2026-04-19 09:58:04 +09:00
2026-04-19 09:58:04 +09:00
2018-11-06 00:02:59 +01:00
2019-01-13 18:26:12 +01:00
2019-01-13 18:26:12 +01:00

Progress Quest

Relive the great adventure… this time in the terminal realm!

Features

  • Faithful port of the game logic
  • Saves (with backups) to $XDG_CONFIG_HOME/pqcli/save.dat
  • Terminal interface that comes in 2 flavors:
    • Rich and colorful (--curses, default)
    • Minimal, suitable for raw grind (--basic)
  • Ideal to run on your server

How it looks like

Curses interface:

Screenshot Screenshot

Basic interface:

Screenshot

How to install

If you have Python 3.10 or newer, just run pip install --user pqcli and you're good to go! Then type pqcli to run the game.

In case if you want to use the git version, the process is just a bit more complex:

$ git clone https://github.com/rr-/pq-cli.git
$ cd pq-cli
$ pip install --user .

Docker / Docker Compose

The repository includes a Dockerfile and docker-compose.yml that run the game with --basic and keep save data in a persistent named volume.

There is no registry pipeline required for this setup: build locally, then run with Compose.

# Build image locally from the Dockerfile
docker compose build

# First run (interactive): create your character in the shared save volume
docker compose run --rm pqcli-init

# Later runs on a server (detached, default save slot 1):
docker compose up -d pqcli

# List existing saves in the same volume:
docker compose run --rm pqcli-init pqcli --basic --list-saves

# Change detached slot if needed (example: slot 2):
PQCLI_SAVE_SLOT=2 docker compose up -d pqcli

# Follow logs / stop detached container:
docker compose logs -f pqcli
docker compose stop pqcli

On first run, if no save data exists in the mounted volume, pqcli will automatically launch an interactive character-creation bootstrap in CLI mode before starting the normal interface.

For server usage, run first-time setup without a forced slot (pqcli-init), then run the long-lived detached service (pqcli) that loads slot 1 by default.

Customizing the adventure

All word lists (monsters, spells, equipment, races, classes, titles and so on) live in JSON files. To change them, copy the built-in files somewhere and edit them:

$ pqcli --dump-data ~/.config/pqcli/data

On startup, pqcli reads $XDG_CONFIG_HOME/pqcli/data/ (or the directory given with --data-dir DIR). Each NAME.json there replaces the built-in list of the same name. Files you leave out fall back to the built-in lists, so you can delete the copies you don't change. If a file is malformed, pqcli prints what is wrong and refuses to start.

The available files are spells, offense_attrib, defense_attrib, offense_bad, defense_bad, shields, armors, weapons, specials, item_attrib, item_ofs, boring_items, monsters, races, classes, titles, impressive_titles and combat_verbs.

For example, to vary the combat descriptions, create combat_verbs.json. {target} is replaced with the enemy:

[
  "Executing {target}",
  "In a fierce battle to thwart {target}",
  "Fighting bravely against {target}",
  "Kicking the butt of {target}"
]

A few things to keep in mind:

  • Order matters in spells.json: spells are learned roughly from the top down, so keep weaker spells first.
  • Titles near the top of titles.json show up more often.
  • Stats in races.json and classes.json are written as STR, CON, DEX, INT, WIS, CHA, HP Max or MP Max.
  • Existing characters keep their race and class even if you remove them from the lists.

Contributing

# Clone the repository:
git clone https://github.com/rr-/pq-cli.git
cd pq-cli

# Install to a local venv:
uv sync

# Install the git hooks (formatting, linting, commit messages):
uv run prek install

# Run the game and the tests:
just run
just test

This project uses uv for packaging. Install instructions are available at uv#installation. The justfile needs just; without it, use uv run pqcli and uv run pytest.

Troubleshooting

_curses.error: init_pair() returned ERR

If running on Linux and you get the error _curses.error: init_pair() returned ERR, try making sure that your $TERM variable is set to a value which supports 256 colors, such as via the following:

TERM=xterm-256color pqcli
S
Description
Progress Quest: the CLI edition
Readme MIT
1.4 MiB
0 Stars 1 Watchers 0 Forks
Languages
Python 97.7%
JavaScript 2%
Just 0.2%