By josix
Adaptive running training plugin: VDOT-based pace prescription, polarized 80/20 periodization, post-workout iteration.
One-time onboarding — interview the runner about goal, fitness, training days, lifestyle. Generates users.json + plan.json. Optionally connect Strava with --connect strava.
Manually log a completed workout. Triggers adaptive plan iteration.
Show the current macrocycle (read-only summary).
Post-race recap — log race result, recompute VDOT, insert recovery protocol.
Force a full plan regeneration (use after injury, life event, or race change).
Head coach — owns macrocycle planning, daily prescription, weekly review, methodology research, and adaptive plan iteration. Handles the one-shot Strava and Garmin probes at /run-init time (DataFetcher owns ongoing activity reads). Invoked by /run-init, /run-today, /run-week, /run-replan, /run-plan, /run-race-recap, /run-research.
Pulls recent activities from Strava or Garmin MCP, normalizes to internal workout schema using provider-specific helper scripts, deduplicates by activity id with preferred_source tiebreaker, then runs the same analyze + adapt pipeline as manual logging. Invoked by /run-sync.
Captures one completed workout via interview, normalizes to schema, writes to workouts.json, and triggers analyze + adapt downstream. Invoked by /run-log.
Applies 1/2/3-strike adjustment rules to plan.json based on a single workout's analysis dict. Mutates plan only when thresholds fire. Called after every workout log.
Computes adherence delta between actual and prescribed workout: pace deviation %, completion %, HR drift, RPE delta. Returns a structured signal dict. Called automatically after log-workout or fetch-strava-activity.
Generates a complete macrocycle (base/build/peak/taper) from a runner's goal, target race date, available training days, and current VDOT. Writes plan.json. Use during /run-init and /run-replan.
Translates a recent race result (distance + time) into a VDOT fitness score and the corresponding training pace table (E/M/T/I/R per km). Use during /run-init and /run-race-recap when the user has a fresh race or time-trial result.
Pulls recent run activities from the garmin-givemydata MCP server: triggers garmin_sync to refresh the local SQLite, queries activity IDs in the requested date range, fetches per-activity detail (with splits, HR zones, weather, running dynamics), normalizes to workouts.json schema via garmin_normalize.py, deduplicates by garmin_activity_id with preferred_source tiebreaker, and runs the same analyze-workout + adapt-plan pipeline as manual logging. Requires users.integrations.garmin.connected = true.
Modifies files
Hook triggers on file write and edit operations
Uses power tools
Uses Bash, Write, or Edit tools
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
Adaptive running training plugin for Claude Code. Generates a personalized macrocycle from your race goal, prescribes daily workouts using Daniels' VDOT pacing, and iterates the plan after every workout based on actual performance.
# 1. Install (drop the directory into your plugins folder)
# 2. Open Claude Code in any working directory
# 3. Run the onboarding interview
/run-init
# 4. Each morning
/run-today
# 5. Each evening after running
/run-log
# 6. Each Sunday
/run-week
| Command | What it does |
|---|---|
/run-init | One-time onboarding: goal, fitness, training days, lifestyle |
/run-init --connect strava|garmin | Onboarding + probe and connect Strava or Garmin Connect account |
/run-today | Show today's workout card |
/run-log [date] | Log a completed workout (triggers adaptive iteration) |
/run-sync [--days N] | Pull recent Strava or Garmin Connect activities (requires /run-init --connect strava|garmin) |
/run-week | Weekly rollup + recovery decision |
/run-replan [--reason "..."] | Force full plan regeneration |
/run-plan | Show current macrocycle (read-only) |
/run-race-recap | Post-race log + VDOT update + 4-day rest protocol |
/run-research "question" | Web-search-backed coaching Q&A |
After each workout, analyze-workout computes the delta between actual and prescribed: completion %, pace delta %, RPE delta, intra-session HR drift. The verdict (on-target / under / over / aborted) drives a strike-rule engine:
See docs/methodology.md for the full coaching rationale and DESIGN.md for architecture details.
Activity source integration lets /run-sync automatically import your runs without manual entry. Manual logging via /run-log works perfectly without it — both Strava and Garmin are opt-in and the plugin remains fully usable with no MCP configured.
preferred_sourcesemantics: The most-recently-connected provider becomes preferred. On same-date duplicates, the preferred source wins and the other entry is kept but markedsuperseded_bythe winning entry's ID.
When connected, /run-sync fetches your recent Strava activities, normalizes fields (pace, HR, splits, RPE from description), deduplicates against existing log entries, and runs the same analysis and adaptation pipeline as manual logging.
Setup steps:
Install the Strava MCP server
Follow the instructions at https://github.com/r-huijts/strava-mcp to install r-huijts/strava-mcp.
Create a Strava API app Go to https://www.strava.com/settings/api, create an app, and note the Client ID and Client Secret. Follow the OAuth flow in the MCP server README to generate a Refresh Token.
Set environment variables in your MCP config Add the following to your Claude Code MCP server configuration (see https://docs.anthropic.com/en/docs/claude-code/mcp):
STRAVA_CLIENT_IDSTRAVA_CLIENT_SECRETSTRAVA_REFRESH_TOKENProbe and connect Restart Claude Code (so the MCP server loads), then run:
/run-init --connect strava
The plugin probes the MCP server and your credentials before writing anything. On success you'll see: "Connected as @{username}."
Troubleshooting:
npx claudepluginhub josix/claude-running-coach --plugin running-coachTransform Claude Code into a multi-agent orchestrated system with verification gates
Research-and-engagement assistant for contributing to open-source projects (e.g. apache/airflow, apache/spark) — draft-only, human-in-the-loop.
A 24-week Japanese listening and speaking learning plugin for Chinese-speaking learners, powered by Claude Code agents.
GTD-grounded task manager that ingests tasks from local markdown across configurable domains (five built-in, extensible via /add-domain), produces ranked daily and weekend plans via a fixed priority ladder, and one-way syncs tasks into a private GitHub Project.
Multi-model consensus engine integrating OpenAI Codex CLI, Gemini CLI, and Claude CLI for collaborative code review and problem-solving.
Ultra-compressed communication mode. Cuts ~75% of tokens while keeping full technical accuracy by speaking like a caveman.
Comprehensive UI/UX design plugin for mobile (iOS, Android, React Native) and web applications with design systems, accessibility, and modern patterns
Curate auto-memory, promote learnings to CLAUDE.md and rules, extract proven patterns into reusable skills.
Memory compression system for Claude Code - persist context across sessions
Standalone image generation plugin using Nano Banana MCP server. Generates and edits images, icons, diagrams, patterns, and visual assets via Gemini image models. No Gemini CLI dependency required.