mirror of
https://github.com/kuhyx/steam-backlog-enforcer.git
synced 2026-11-11 14:47:52 +01:00
Expose the backlog enforcer's read surface and two gated write actions as typed MCP tools (steam_backlog_enforcer._mcp) so Claude Code and its subagents can query and drive the backlog without shelling out. - _mcp.py: FastMCP stdio server. Read tools get_dataset/get_status/ get_stats/list_backlog; gated writes pick_manual/block_gaming (preview unless confirm=True). Logs to stderr; never exposes Config/the API key. - _actions.py: stdout-free, state-only cores shared by CLI and MCP (apply_manual_pick, status_payload, is_manual_pick_locked). cmd_pick_manual now delegates its state mutation here. - .mcp.json + scripts/setup_mcp.sh: project-scoped registration via a dedicated ~/.venvs/steam-backlog-mcp interpreter; mcp is an optional-dep, kept out of the systemd/CLI system-python path. - pyproject: fix setuptools flat-layout discovery and declare the previously undeclared direct deps aiohttp + websockets, un-breaking the editable install. - 100% coverage of the new modules; server verified end-to-end over stdio. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LQGQj8Ne6TriBExv91nG8v
79 lines
2.8 KiB
Markdown
79 lines
2.8 KiB
Markdown
# Steam Backlog Enforcer
|
|
|
|
Forces you to 100% complete one Steam game at a time before moving on.
|
|
|
|
## Features
|
|
|
|
- **Achievement tracking**: Picks the next game by shortest HLTB completionist time
|
|
- **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 if assigned game is complete |
|
|
| `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` | Remove store blocking |
|
|
| `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`.
|