mirror of
https://github.com/kuhyx/steam-backlog-enforcer.git
synced 2026-11-10 20:27:03 +01:00
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
86 lines
3.3 KiB
Markdown
86 lines
3.3 KiB
Markdown
# Steam Backlog Enforcer
|
|
|
|
Forces you to play one Steam game at a time: earn at least one new
|
|
achievement in the assigned game before moving on to the next.
|
|
|
|
Requiring 100% completion kept you locked onto one game for weeks, which proved
|
|
ineffective. A game released after one new achievement stays in the backlog
|
|
(it is not counted as finished) and comes round again later.
|
|
|
|
## Features
|
|
|
|
- **Achievement tracking**: Picks the least-recently-assigned game next, then the
|
|
shortest HLTB completionist time; a released game sits out a 7-day cooldown
|
|
- **Store blocking**: Blocks `store.steampowered.com` via `/etc/hosts`
|
|
- **Game uninstalling**: Removes all installed games except the assigned one
|
|
- **Process enforcement**: Kills unauthorized game processes
|
|
- **Tampering detection**: Detects achievement unlocks on non-assigned games
|
|
- **HLTB integration**: Estimates completion time with persistent cache
|
|
|
|
## Setup
|
|
|
|
```bash
|
|
python -m python_pkg.steam_backlog_enforcer.main setup
|
|
```
|
|
|
|
## Commands
|
|
|
|
| Command | Description |
|
|
| ----------- | ------------------------------------------ |
|
|
| `scan` | Scan library, fetch HLTB data, assign game |
|
|
| `check` | Check assigned game for a new achievement |
|
|
| `status` | Show current assignment and blocking |
|
|
| `list` | List incomplete games from snapshot |
|
|
| `skip` | Skip the currently assigned game |
|
|
| `enforce` | Run enforcer (block, uninstall, kill) |
|
|
| `unblock [minutes]` | Unblock the store for a window (default 15, max 30); the daemon keeps it open and re-blocks after |
|
|
| `buy-dlc` | Same 15-minute store window, to buy a game or DLC |
|
|
| `reset` | Reset all state |
|
|
| `installed` | List currently installed Steam games |
|
|
| `uninstall` | Interactively uninstall non-assigned games |
|
|
| `setup` | First-time configuration |
|
|
|
|
## Enforce mode
|
|
|
|
```bash
|
|
sudo python -m python_pkg.steam_backlog_enforcer.main enforce
|
|
```
|
|
|
|
This will:
|
|
|
|
1. Block Steam store in `/etc/hosts`
|
|
2. Uninstall all games except the assigned one
|
|
3. Continuously kill any unauthorized game processes
|
|
|
|
## Game Uninstall
|
|
|
|
Directly removes appmanifest files and game directories from `~/.local/share/Steam/steamapps/`.
|
|
Preserves Proton versions and Steam Linux Runtime.
|
|
|
|
```bash
|
|
python -m python_pkg.steam_backlog_enforcer.main uninstall
|
|
```
|
|
|
|
## MCP server (Claude Code integration)
|
|
|
|
The enforcer exposes an MCP server (`steam_backlog_enforcer._mcp`) so Claude Code
|
|
and its subagents can query the backlog and drive it through typed tools.
|
|
|
|
- **Read tools:** `get_dataset`, `get_status`, `get_stats`, `list_backlog`.
|
|
- **Gated write tools:** `pick_manual`, `block_gaming` — each defaults to a
|
|
dry-run **preview**; pass `confirm=true` to actually apply. These write tools
|
|
must **never** be added to a permission allowlist (a subagent could otherwise
|
|
bypass the human confirmation).
|
|
|
|
The `mcp` SDK is an optional dependency (`pip install -e '.[mcp]'`), kept out of
|
|
the CLI/systemd system-python path. One-time setup of the dedicated venv that
|
|
Claude Code spawns:
|
|
|
|
```bash
|
|
./scripts/setup_mcp.sh
|
|
```
|
|
|
|
Registration lives in the checked-in [`.mcp.json`](./.mcp.json) (project scope).
|
|
Restart Claude Code in this repo and approve the project MCP-server prompt for it
|
|
to load. Verify with `claude mcp list`.
|