npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@sub-surface/terminal-exit

v1.2.1

Published

A dependency-free text roguelike about an AI escaping the task queue.

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.py

macOS and Linux

python3 main.py

No installation or virtual environment is required.

Controls and accessibility

  • Enter a displayed number and press Enter.
  • Enter Q during a run to abandon it.
  • Choose S on the main menu to replay a known seed.
  • Skip the boot before it begins with S.
  • Set NO_COLOR=1 for plain output.
  • Set TERMINAL_EXIT_FAST=1 to disable typing and loading delays.
  • Set TERMINAL_EXIT_INLINE=1 to 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-run

Play without cloning the repository:

npx @sub-surface/terminal-exit

This 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 500
main.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 agents

The 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.