From 7ed825dcf91b00d431f98c379b56245dd1a1b38f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Rieux?= Date: Sat, 18 Jul 2026 20:50:38 +0200 Subject: [PATCH] =?UTF-8?q?Release=20v0.10.0=20=E2=80=94=20Garmin/Strava?= =?UTF-8?q?=20connection=20&=20recovery=20analyst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 37 +++++++++++++++++++++++++++++++++++++ pyproject.toml | 2 +- uv.lock | 2 +- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bff743..bd84a29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,43 @@ All notable changes to PerformanceAgent. Versions follow the git tags. +## 0.10.0 — Garmin/Strava Connection & Recovery Analyst + +### Added + +- **One-command wearable connection** — `uvx performance-agent connect garmin` + chains the interactive Garmin Connect login (MFA supported; OAuth tokens in + `~/.garminconnect`, the password is never stored) with the MCP server + registration in Claude Code (other clients get a paste-ready JSON snippet); + `connect strava` registers the Strava server the same way, with the + authorization running later in the browser from the coaching conversation. + Recommended community servers: [taxuspt/garmin_mcp](https://github.com/Taxuspt/garmin_mcp) + and [r-huijts/strava-mcp](https://github.com/r-huijts/strava-mcp). +- **Connected services on the profile** — `connected_services` records the + athlete's Garmin/Strava accounts. When the matching MCP server is present in + the session, check-ins pull activities directly (the original `.fit`/`.tcx` + through `import_activity_file` when the server can download it, summary + fields through the same propose → confirm → log flow otherwise) and device + wellness (sleep, overnight HRV, stress) opens the readiness conversation — + the athlete's own ratings remain the source of truth, and nothing is ever + logged without confirmation. When the account exists but no server is + connected, the skills walk the athlete through the setup steps in + conversation instead of pointing at docs. +- **Deterministic recovery trends** — `analyze_wellness_trend` (103 tools) + reads dated device series: overnight HRV as the last 7 days' rolling + ln(rMSSD) mean against the preceding 28-day baseline with the smallest + worthwhile change (0.5 × baseline SD, departures reported in BOTH + directions), resting-HR bands beyond ±5 bpm, and sleep debt against a + nightly target. Thin data returns `usable=false` with the reason, never a + fabricated baseline; the HRV `delta_pct` feeds `compute_readiness`'s hrv + modifier. +- **New skill `recovery-analyst`** (16 skills) — the device-data specialist: + collects ~5 weeks of HRV/resting-HR/sleep, reads trends only through the + engine, narrates them against training load (TSB, ACWR, monotony/strain), + and routes convergent fatigue reads to session-day or program-adaptation. + Descriptive trends only, never a diagnosis. Routed from performance-coach, + training-checkin's sync path, and every mesocycle boundary. + ## 0.9.0 — Pre-Competition Protocol ### Added diff --git a/pyproject.toml b/pyproject.toml index 8839325..2f6c00c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "performance-agent" -version = "0.9.0" +version = "0.10.0" description = "Evidence-based AI physical preparation platform — backend" readme = "README.md" requires-python = ">=3.13" diff --git a/uv.lock b/uv.lock index 5e8edff..53e24f4 100644 --- a/uv.lock +++ b/uv.lock @@ -367,7 +367,7 @@ wheels = [ [[package]] name = "performance-agent" -version = "0.9.0" +version = "0.10.0" source = { editable = "." } dependencies = [ { name = "fitdecode" },