Repository navigation
v0.2.0 — the write path
The write path. runcoach can now put a session on your watch, and take it back off.
uv tool install git+https://github.com/edxleon/runcoach-ai@v0.2.0
claude mcp add runcoach -- runcoach mcp
# "plan me an easy 40 minutes for tomorrow" -> you see the session -> "yes" -> it is on the watchWhat is new
propose_workoutbuilds a structured session for your route or time budget from your own Garmin zones.propose_weekfiles a polarised week as one package, and on a red day a proposal can replace the hard session on the calendar. Proposing never writes anything.apply_workoutuploads, schedules, pushes to the watch and reads the workout back to verify structure and targets.undo_workouttakes it off the calendar again. In the app it is one button on the coach card ("Put on watch", two taps); in Claude Code it is your "yes". The app's own coach runs cannot call either write tool (--disallowedTools, pinned by a test).- Job, card and proposal files are written thread-safely: two writers in the same server process no longer share a temp file (a double tap on "Put on watch" could raise
FileNotFoundError). - The coach comments on Garmin's auto-detected rep count in one clause at most and then judges the session the athlete says they ran.
- garminconnect 0.3.20. The check on the vendor's exceptions now fails on a new exception and no longer on one that went away.
What is verified
- 672 Python tests and 60 frontend tests on Linux, Windows and macOS × Python 3.12 and 3.13, plus a job that installs the wheel as a user would and drives the installed tool.
- The write path against a real account, on 2026-10-28: one easy session through
runcoach mcp, proposed, uploaded, scheduled, pushed, seen on the watch, read back and verified, then undone. A second, independent Garmin client cross-checked every step. - Eval suite: 14/18 on the current
sonnetwith ahaikujudge, twice, with a different four failing each time. Across four runs every case passed at least once; the failures read as a strict judge rather than a wrong coach, with one exception that is fixed (above). The badge says 14/18 because that is what the last run said.
What is not
propose_weekas a package and the red-day swap that unschedules a calendar entry have not been run against a real account, only against the fake client the suite uses.- One athlete, one account, one watch.
garminconnecttracks an unofficial API;runcoach doctorsays so when Garmin changes underneath it.
Not affiliated with Garmin. A training tool, not medical advice.