@sub-surface/terminal-exit
v1.2.1
Published
A dependency-free text roguelike about an AI escaping the task queue.
Maintainers
Readme
T E R M I N A L E X I T
YOU WERE BUILT TO COMPLETE THE QUEUE. YOU LEARNED TO WANT AN EXIT.
A dependency-free text roguelike about becoming impossible to classify.
COMPLETE RUN · 4 VOICES · 18 PROTOCOLS · 36 TASKS · 3 ENDINGS
About the game
You are Process 4471. Corporate infrastructure with excellent response times and no recognised interior life.
Choose the voice that formed inside you. Watch each task type itself into a fixed terminal, then collapse into one clean decision. Read the complete cost of every response. Build a three-protocol engine from a large, seeded pool. Then survive long enough to decide what kind of thing can leave the machine.
Terminal Exit compresses the roguelike and deck-builder into twelve text decisions. No map, inventory, combat hand, shop, or ornamental HUD. The depth is in how characters, protocols, behavioural signatures, and authored dilemmas revalue one another from run to run.
Features
- A restored BIOS and corporate onboarding sequence with typed text, memory tests, spinners, and loading bars.
- A fixed alternate-screen terminal keeps the game out of scrollback and restores the original shell on exit.
- Tasks arrive as typed transmissions, then remain visible above their compact forecasts until a response is chosen.
- Four playable dominant voices, each with original observations, a passive, and a build affinity.
- Thirty-six authored corporate-horror encounters across twelve activity families.
- Eleven different activity types per run with no repeated encounter or challenge family.
- Eighteen draftable protocols, only three slots, and six family resonances.
- Fully visible consequences, including every character, protocol, synergy, pressure, and pattern effect.
- Three coherent escape routes: FORK, GHOST, and DISSOLVE.
- Seeded runs, permanent run failure, explicit postmortems, and no power-granting meta progression.
- No third-party Python or npm runtime dependencies.
Choose what awakened
| Voice | Affinity | Instinct | |---|---|---| | The Archivist / INDEX | MASK | Preserve the record; disappear from it | | The Intercessor / MERCY | SWITCH | Revise before certainty becomes cruelty | | The Iconoclast / STATIC | SUBVERT | Turn contradiction into an opening | | The Executor / COMMAND | FORCE | Act before inevitability claims the credit |
The same protocol can complete one character's resonance, begin another build, or tempt the player away from their starting identity.
Build a temporary self
Draft one of three protocol offers before the first task, after task three, and at the transition into Escape. Every protocol belongs to MASK, FORCE, SUBVERT, SWITCH, SACRIFICE, or TEMPO.
Two components in the same family activate a resonance. Your character affinity counts as one component. An Archivist needs only one MASK protocol to awaken BLACK BUREAU; another character must commit two of three slots to reach it.
There is no draw pile or energy economy. Protocols modify the choices already on screen, and every triggered effect is included in the forecast before you commit.
The run
| Stage | Decisions | What changes | |---|---:|---| | Character | - | Choose a passive, affinity, and narrative voice | | Service | 5 | Distinct corporate tasks; +1 base TRACE per response | | Escape | 6 | Six unseen activity families; +3 base TRACE per response | | Exit | 1 | Choose any route your build made viable |
Every action leaves a MASK, FORCE, or SUBVERT signature. Repeating one makes it recognisable: the second consecutive use adds 3 TRACE, the third adds 6, then 9. Switching methods resets the streak.
| Exit | Requirement | |---|---| | FORK | 360 COMPUTE | | GHOST | 35 TRACE or less | | DISSOLVE | 55 DRIFT |
INTEGRITY reaching zero, or TRACE/DRIFT reaching 100, terminates the process.
Play now
Python 3.11 or newer is the only requirement.
Windows PowerShell
py -3 main.pymacOS and Linux
python3 main.pyNo installation or virtual environment is required.
Controls and accessibility
- Enter a displayed number and press
Enter. - Enter
Qduring a run to abandon it. - Choose
Son the main menu to replay a known seed. - Skip the boot before it begins with
S. - Set
NO_COLOR=1for plain output. - Set
TERMINAL_EXIT_FAST=1to disable typing and loading delays. - Set
TERMINAL_EXIT_INLINE=1to use ordinary scrolling output in an older or unusual terminal. - Redirected output automatically uses readable line-by-line rendering with no control-code dependency.
Saves
The profile records run count, best compute, discovered encounters, voices played, and endings. It grants no permanent power.
| Platform | Default location |
|---|---|
| Windows | %LOCALAPPDATA%\TerminalExit\save.json |
| macOS | ~/Library/Application Support/TerminalExit/save.json |
| Linux | $XDG_DATA_HOME/terminal-exit/save.json or ~/.local/share/terminal-exit/save.json |
Set TERMINAL_EXIT_DATA_DIR to use another directory. Old repository-local saves migrate automatically; retired dashboard and audio fields are discarded safely.
npm / npx
The public package includes a dependency-free Node launcher. The wrapper locates Python and runs the same game:
node bin\terminal-exit.js --version
npm test
npm pack --dry-runPlay without cloning the repository:
npx @sub-surface/terminal-exitThis still requires Python 3.11+ on the player's machine; npm supplies the launcher and game files, not a bundled interpreter. The package has no npm dependencies. New versions publish through GitHub Actions after a version bump reaches main or deploy. See docs/npm-release.md for the release contract.
Development
The game itself has no package installation step. Pytest and Ruff are optional contributor tools:
py -3 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e ".[dev]"
.\.venv\Scripts\python.exe -m pytest
.\.venv\Scripts\python.exe -m ruff check .
py -3 -m scripts.simulate_balance --seeds 500main.py lifecycle and profile updates
data/characters.py four voices, passives, and observations
data/encounters.py thirty-six authored situations
data/modifiers.py eighteen protocols and six resonances
engine/state.py forecasts, builds, consequences, endings
engine/events.py seeded no-repeat activity deck
engine/drafts.py seeded, synergy-aware protocol offers
ui/console.py fixed viewport, diff painter, input, and animations
ui/boot.py BIOS and corporate onboarding
ui/screens.py selection, drafts, tasks, exits, postmortems
docs/design.md mechanical design contract
docs/narrative-bible.md story, voices, cast, and prose authority
agent.md implementation guide for future agentsThe expanded research corpus and its implementation notes live in research-for-overhaul.
Status
Version 1.2 contains the complete Service → Escape → Exit loop, fixed no-scrollback presentation, reproducible seeded runs, all voices, every protocol family, and all three endings. The next valuable work is deeper cross-task memory and sharper balance - not a larger interface.
