Go to file
Krzysztof kuhy Rudnicki 0c49039378 Move the workout-sync test helpers into _sync_test_fixtures.dart
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
2026-08-15 22:07:36 +02:00
.github/workflows Finish the Python side: scripts, conftest, and the last test modules 2026-08-15 20:57:29 +02:00
docs Split DESIGN_AUDIT_TODO.md into one file per audited surface 2026-08-15 21:27:19 +02:00
screen_locker Finish the Python side: scripts, conftest, and the last test modules 2026-08-15 20:57:29 +02:00
scripts Add todo_finish_dart_250_prompt.md and the Dart test splitter 2026-08-15 21:49:15 +02:00
stronglift_replacement Move the workout-sync test helpers into _sync_test_fixtures.dart 2026-08-15 22:07:36 +02:00
.gitignore Make the lock overlay's sport selector usable, and focus its form fields 2026-07-26 15:08:08 +02:00
.mcp.json Add read-only MCP server exposing workout/lock status 2026-07-10 21:28:09 +02:00
.pre-commit-config.yaml Finish the Python side: scripts, conftest, and the last test modules 2026-08-15 20:57:29 +02:00
CLAUDE.md Support multiple workouts per day; fix the dead sync; ban silent failures 2026-07-17 09:22:31 +02:00
DESIGN_AUDIT_TODO.md Split DESIGN_AUDIT_TODO.md into one file per audited surface 2026-08-15 21:27:19 +02:00
early-bird-workout-check.timer Add heat-skip feature and fix early-bird 9:00 re-check gap 2026-06-29 11:23:19 +02:00
install_autostart.sh chore: set up as standalone repo 2026-05-28 07:43:06 +02:00
install_systemd.sh Let the PC see phone workouts again, and stop losing progression on reinstall 2026-08-10 14:39:02 +02:00
install.sh Make every lock screen keyboard-operable, and add the missing installer 2026-07-30 16:25:45 +02:00
pyproject.toml Split _runnerup_verification, _ui_widgets and _sick_dialog 2026-08-15 20:37:15 +02:00
README.md Add read-only MCP server exposing workout/lock status 2026-07-10 21:28:09 +02:00
refactor_claude_todo.md Refresh the refactor todo: 41 -> 10 files over the cap 2026-08-15 21:46:16 +02:00
remove_autostart.sh chore: set up as standalone repo 2026-05-28 07:43:06 +02:00
remove_systemd.sh Let the PC see phone workouts again, and stop losing progression on reinstall 2026-08-10 14:39:02 +02:00
requirements.txt Let the PC see phone workouts again, and stop losing progression on reinstall 2026-08-10 14:39:02 +02:00
run.sh chore: set up as standalone repo 2026-05-28 07:43:06 +02:00
todo_finish_dart_250_prompt.md Add todo_finish_dart_250_prompt.md and the Dart test splitter 2026-08-15 21:49:15 +02:00
todo_fix_pylint_10_prompt.md Add todo_fix_pylint_10_prompt.md: raise pylint to a 10.00 gate 2026-08-15 19:18:39 +02:00
workout-locker.service Drop WorkingDirectory/PYTHONPATH from workout-locker.service 2026-06-22 12:43:58 +02:00
workout-sync.service Let the PC see phone workouts again, and stop losing progression on reinstall 2026-08-10 14:39:02 +02:00
workout-sync.timer Let the PC see phone workouts again, and stop losing progression on reinstall 2026-08-10 14:39:02 +02:00

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/lock state 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.