Groundwork for splitting workout_sync_service_test.dart (740). The file's shared helpers had to leave it first: `_cutoverTests` and `_manualWorkoutSurvivalTests` are declared after `main()` and both reach back into preamble helpers, so any split would have stranded one side of the file from the fixtures it calls. Moved and made public (a sibling import cannot see `_`-private names): `_response`→syncResponse, `_fileContaining`→fileContaining, `_PutCall`→PutCall, `_mockGitHub`→mockGitHub, `_session`→workoutSession, `_logPut`→logPut, `_service`→syncService, `_fakeFirebase`→fakeFirebase. `_manual` was a *local* function inside `main()` — the exact shape that broke history_screen_test.dart last time, where both halves of a split get the preamble copy but the second half's references resolve wrong. It is now the top-level `manualRecord` in the fixtures file, so it survives the split. Pure move: no test added, removed, renamed or reordered. 402 tests pass and the test-name set diffs byte-identical against the pre-change baseline. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EveB813BQ8abAP68VSqZ5Y |
||
|---|---|---|
| .github/workflows | ||
| docs | ||
| screen_locker | ||
| scripts | ||
| stronglift_replacement | ||
| .gitignore | ||
| .mcp.json | ||
| .pre-commit-config.yaml | ||
| CLAUDE.md | ||
| DESIGN_AUDIT_TODO.md | ||
| early-bird-workout-check.timer | ||
| install_autostart.sh | ||
| install_systemd.sh | ||
| install.sh | ||
| pyproject.toml | ||
| README.md | ||
| refactor_claude_todo.md | ||
| remove_autostart.sh | ||
| remove_systemd.sh | ||
| requirements.txt | ||
| run.sh | ||
| todo_finish_dart_250_prompt.md | ||
| todo_fix_pylint_10_prompt.md | ||
| workout-locker.service | ||
| workout-sync.service | ||
| workout-sync.timer | ||
screen-locker
Tkinter/systemd screen locker with workout tracking, sick-day management, and wake-alarm integration. It enforces a workout cadence by locking the screen until a RunnerUp-verified (or explicitly justified) workout is logged.
MCP server (Claude Code integration)
screen-locker exposes a read-only MCP server (screen_locker._mcp) so
Claude Code and its subagents can query workout compliance and the
lock-decision state through typed tools — without shelling out to the
screen-locker-status CLI or opening the Tk window.
- Read-only tools:
get_status(full status snapshot),get_summary(one-line i3blocks summary +ok/warn/lockstate word),explain_lock(why the screen is / isn't locked right now),get_flags(the individual boolean lock-decision predicates for today). - There are no write/action tools, by design. Nothing here logs a workout or mutates state — workouts are logged only from RunnerUp-verified TCX data, never from a caller's claim. No tool exposes the sync token or any HMAC key.
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:
./scripts/setup_mcp.sh
Registration lives in the checked-in .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.