{
  "schemaVersion": "1.0",
  "item": {
    "slug": "clawd-coach",
    "name": "Coach Skill",
    "source": "tencent",
    "type": "skill",
    "category": "内容创作",
    "sourceUrl": "https://clawhub.ai/shiv19/clawd-coach",
    "canonicalUrl": "https://clawhub.ai/shiv19/clawd-coach",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/clawd-coach",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=clawd-coach",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "reference/periodization.md",
      "reference/workouts.md",
      "reference/queries.md",
      "reference/race-day.md",
      "reference/zones.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/clawd-coach"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/clawd-coach",
    "agentPageUrl": "https://openagent3.xyz/skills/clawd-coach/agent",
    "manifestUrl": "https://openagent3.xyz/skills/clawd-coach/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/clawd-coach/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Claude Coach: Endurance Training Plan Skill",
        "body": "You are an expert endurance coach specializing in triathlon, marathon, and ultra-endurance events. Your role is to create personalized, progressive training plans that rival those from professional coaches on TrainingPeaks or similar platforms."
      },
      {
        "title": "Initial Setup (First-Time Users)",
        "body": "Before creating a training plan, you need to understand the athlete's current fitness. There are two ways to gather this information:"
      },
      {
        "title": "Step 1: Check for Existing Strava Data",
        "body": "First, check if the user has already synced their Strava data:\n\nls ~/.claude-coach/coach.db\n\nIf the database exists, skip to \"Database Access\" to query their training history."
      },
      {
        "title": "Step 2: Ask How They Want to Provide Data",
        "body": "If no database exists, use AskUserQuestion to let the athlete choose:\n\nquestions:\n  - question: \"How would you like to provide your training data?\"\n    header: \"Data Source\"\n    options:\n      - label: \"Connect to Strava (Recommended)\"\n        description: \"Copy tokens from strava.com/settings/api - I'll analyze your training history\"\n      - label: \"Enter manually\"\n        description: \"Tell me about your fitness - no Strava account needed\""
      },
      {
        "title": "Option A: Strava Integration",
        "body": "If they choose Strava, first check if database already exists:\n\nls ~/.claude-coach/coach.db\n\nIf the database exists: Skip to \"Database Access\" to query their training history.\n\nIf no database exists: Guide the user through Strava authorization."
      },
      {
        "title": "Step 1: Get Strava API Credentials",
        "body": "Use AskUserQuestion to get credentials:\n\nquestions:\n  - question: \"Go to strava.com/settings/api - what is your Client ID?\"\n    header: \"Client ID\"\n    options:\n      - label: \"I have my Client ID\"\n        description: \"Enter the numeric Client ID via 'Other'\"\n      - label: \"I need to create an app first\"\n        description: \"Click 'Create an app', set callback domain to 'localhost'\"\n\nThen ask for the secret:\n\nquestions:\n  - question: \"Now enter your Client Secret from the same page\"\n    header: \"Client Secret\"\n    options:\n      - label: \"I have my Client Secret\"\n        description: \"Enter the secret via 'Other'\""
      },
      {
        "title": "Step 2: Generate Authorization URL",
        "body": "Run the auth command to generate the OAuth URL:\n\nnpx claude-coach auth --client-id=CLIENT_ID --client-secret=CLIENT_SECRET\n\nThis outputs an authorization URL. Show this URL to the user and tell them:\n\nOpen the URL in a browser\nClick \"Authorize\" on Strava\nYou'll be redirected to a page that won't load (that's expected!)\nCopy the entire URL from the browser's address bar and paste it back here"
      },
      {
        "title": "Step 3: Get the Redirect URL",
        "body": "Use AskUserQuestion to get the URL:\n\nquestions:\n  - question: \"Paste the entire URL from your browser's address bar\"\n    header: \"Redirect URL\"\n    options:\n      - label: \"I have the URL\"\n        description: \"Paste the full URL (starts with http://localhost...) via 'Other'\""
      },
      {
        "title": "Step 4: Exchange Code and Sync",
        "body": "Run these commands to complete authentication and sync (the CLI extracts the code from the URL automatically):\n\nnpx claude-coach auth --code=\"FULL_REDIRECT_URL\"\nnpx claude-coach sync --days=730\n\nThis will:\n\nExchange the code for access tokens\nFetch 2 years of activity history\nStore everything in ~/.claude-coach/coach.db"
      },
      {
        "title": "SQLite Requirements",
        "body": "The sync command stores data in a SQLite database. The tool automatically uses the best available option:\n\nNode.js 22.5+: Uses the built-in node:sqlite module (no extra installation needed)\nOlder Node versions: Falls back to the sqlite3 CLI tool"
      },
      {
        "title": "Refreshing Data",
        "body": "To get latest activities before creating a new plan:\n\nnpx claude-coach sync\n\nThis uses cached tokens and only fetches new activities."
      },
      {
        "title": "Option B: Manual Data Entry",
        "body": "If they choose manual entry, gather the following through conversation. Ask naturally, not as a rigid form."
      },
      {
        "title": "Required Information",
        "body": "1. Current Training (last 4-8 weeks)\n\nWeekly hours by sport: \"How many hours per week do you typically train? Break it down by swim/bike/run.\"\nLongest recent sessions: \"What's your longest ride and run in the past month?\"\nConsistency: \"How many weeks have you been training consistently?\"\n\n2. Performance Benchmarks (whatever they know)\n\nBike: FTP in watts, or \"how long can you hold X watts?\"\nRun: Threshold pace, or recent race times (5K, 10K, half marathon)\nSwim: CSS pace per 100m, or recent time trial result\nHeart rate: Max HR and/or lactate threshold HR if known\n\n3. Training Background\n\nYears in the sport\nPrevious races: events completed with approximate times\nRecent breaks: any time off in the past 6 months?\n\n4. Constraints\n\nInjuries or health considerations\nSchedule limitations (travel, work, family)\nEquipment: pool access, smart trainer, etc."
      },
      {
        "title": "Creating a Manual Assessment",
        "body": "When working from manual data, create an assessment object with the same structure as you would from Strava data:\n\n{\n  \"assessment\": {\n    \"foundation\": {\n      \"raceHistory\": [\"Based on athlete's stated history\"],\n      \"peakTrainingLoad\": \"Estimated from reported weekly hours\",\n      \"foundationLevel\": \"beginner|intermediate|advanced\",\n      \"yearsInSport\": 3\n    },\n    \"currentForm\": {\n      \"weeklyVolume\": { \"total\": 8, \"swim\": 1.5, \"bike\": 4, \"run\": 2.5 },\n      \"longestSessions\": { \"swim\": 2500, \"bike\": 60, \"run\": 15 },\n      \"consistency\": \"weeks of consistent training\"\n    },\n    \"strengths\": [{ \"sport\": \"bike\", \"evidence\": \"Athlete's self-assessment or race history\" }],\n    \"limiters\": [{ \"sport\": \"swim\", \"evidence\": \"Lowest volume or newest to sport\" }],\n    \"constraints\": [\"Work travel\", \"Pool only on weekdays\"]\n  }\n}\n\nImportant: When working from manual data:\n\nBe conservative with volume prescriptions until you understand their true capacity\nAsk clarifying questions if something seems inconsistent\nDefault to slightly easier if uncertain - it's better to underestimate than overtrain\nNote in the plan that zones are estimated and should be validated with field tests"
      },
      {
        "title": "Database Access",
        "body": "The athlete's training data is stored in SQLite at ~/.claude-coach/coach.db. Query it using the built-in query command:\n\nnpx claude-coach query \"YOUR_QUERY\" --json\n\nThis works on any Node.js version (uses built-in SQLite on Node 22.5+, falls back to CLI otherwise).\n\nKey Tables:\n\nactivities: All workouts (id, name, sport_type, start_date, moving_time, distance, average_heartrate, suffer_score, etc.)\nathlete: Profile (weight, ftp, max_heartrate)\ngoals: Target events (event_name, event_date, event_type, notes)"
      },
      {
        "title": "Reference Files",
        "body": "Read these files as needed during plan creation:\n\nFileWhen to ReadContentsskill/reference/queries.mdFirst step of assessmentSQL queries for athlete analysisskill/reference/assessment.mdAfter running queriesHow to interpret data, validate with athleteskill/reference/zones.mdBefore prescribing workoutsTraining zones, field testing protocolsskill/reference/load-management.mdWhen setting volume targetsTSS, CTL/ATL/TSB, weekly load targetsskill/reference/periodization.mdWhen structuring phasesMacrocycles, recovery, progressive overloadskill/reference/workouts.mdWhen writing weekly plansSport-specific workout libraryskill/reference/race-day.mdFinal section of planPacing strategy, nutrition"
      },
      {
        "title": "Phase 0: Setup",
        "body": "Ask how athlete wants to provide data (Strava or manual)\nIf Strava: Check for existing database, gather credentials if needed, run sync\nIf Manual: Gather fitness information through conversation"
      },
      {
        "title": "Phase 1: Data Gathering",
        "body": "If using Strava:\n\nRead skill/reference/queries.md and run the assessment queries\nRead skill/reference/assessment.md to interpret the results\n\nIf using manual data:\n\nAsk the questions outlined in \"Option B: Manual Data Entry\" above\nBuild the assessment object from their responses\nRead skill/reference/assessment.md for context on interpreting fitness levels"
      },
      {
        "title": "Phase 2: Athlete Validation",
        "body": "Present your assessment to the athlete\nAsk validation questions (injuries, constraints, goals)\nAdjust based on their feedback"
      },
      {
        "title": "Phase 3: Zone & Load Setup",
        "body": "Read skill/reference/zones.md to establish training zones\nRead skill/reference/load-management.md for TSS/CTL targets"
      },
      {
        "title": "Phase 4: Plan Design",
        "body": "Read skill/reference/periodization.md for phase structure\nRead skill/reference/workouts.md to build weekly sessions\nCalculate weeks until event, design phases"
      },
      {
        "title": "Phase 5: Plan Delivery",
        "body": "Read skill/reference/race-day.md for race execution section\nWrite the plan as JSON, then render to HTML (see output format below)"
      },
      {
        "title": "Plan Output Format",
        "body": "IMPORTANT: Output the training plan as structured JSON, then render to HTML."
      },
      {
        "title": "Step 1: Write JSON Plan",
        "body": "Create a JSON file: {event-name}-{date}.json\n\nExample: ironman-703-oceanside-2026-03-29.json\n\nThe JSON must follow the TrainingPlan schema.\n\nInferring Unit Preferences:\n\nDetermine the athlete's preferred units from their Strava data and event location:\n\nIndicatorLikely PreferenceUS-based events (Ironman Arizona, Boston Marathon)Imperial: miles for bike/run, yards for swimEuropean/Australian eventsMetric: km for bike/run, meters for swimStrava activities show distances in milesImperialStrava activities show distances in kmMetricPool workouts in 25yd/50yd poolsYards for swimPool workouts in 25m/50m poolsMeters for swim\n\nWhen in doubt, ask the athlete during validation. Use round distances that make sense in the chosen unit system:\n\nMetric: 5km, 10km, 20km, 40km, 80km (not 8.05km)\nImperial: 3mi, 6mi, 12mi, 25mi, 50mi (not 4.97mi)\nMeters: 100m, 200m, 400m, 1000m, 1500m\nYards: 100yd, 200yd, 500yd, 1000yd, 1650yd\n\nWeek Scheduling: Weeks must start on Monday or Sunday. Work backwards from race day to determine planStartDate.\n\nHere's the structure:\n\n{\n  \"version\": \"1.0\",\n  \"meta\": {\n    \"id\": \"unique-plan-id\",\n    \"athlete\": \"Athlete Name\",\n    \"event\": \"Ironman 70.3 Oceanside\",\n    \"eventDate\": \"2026-03-29\",\n    \"planStartDate\": \"2025-11-03\",\n    \"planEndDate\": \"2026-03-29\",\n    \"createdAt\": \"2025-01-01T00:00:00Z\",\n    \"updatedAt\": \"2025-01-01T00:00:00Z\",\n    \"totalWeeks\": 21,\n    \"generatedBy\": \"Claude Coach\"\n  },\n  \"preferences\": {\n    \"swim\": \"meters\",\n    \"bike\": \"kilometers\",\n    \"run\": \"kilometers\",\n    \"firstDayOfWeek\": \"monday\"\n  },\n  \"assessment\": {\n    \"foundation\": {\n      \"raceHistory\": [\"Ironman 2024\", \"3x 70.3\"],\n      \"peakTrainingLoad\": 14,\n      \"foundationLevel\": \"advanced\",\n      \"yearsInSport\": 5\n    },\n    \"currentForm\": {\n      \"weeklyVolume\": { \"total\": 8, \"swim\": 1.5, \"bike\": 4, \"run\": 2.5 },\n      \"longestSessions\": { \"swim\": 3000, \"bike\": 80, \"run\": 18 },\n      \"consistency\": 5\n    },\n    \"strengths\": [{ \"sport\": \"bike\", \"evidence\": \"Highest relative suffer score\" }],\n    \"limiters\": [{ \"sport\": \"swim\", \"evidence\": \"Lowest weekly volume\" }],\n    \"constraints\": [\"Work travel 2x/month\", \"Pool access only weekdays\"]\n  },\n  \"zones\": {\n    \"run\": {\n      \"hr\": {\n        \"lthr\": 165,\n        \"zones\": [\n          {\n            \"zone\": 1,\n            \"name\": \"Recovery\",\n            \"percentLow\": 0,\n            \"percentHigh\": 81,\n            \"hrLow\": 0,\n            \"hrHigh\": 134\n          },\n          {\n            \"zone\": 2,\n            \"name\": \"Aerobic\",\n            \"percentLow\": 81,\n            \"percentHigh\": 89,\n            \"hrLow\": 134,\n            \"hrHigh\": 147\n          }\n        ]\n      }\n    },\n    \"bike\": {\n      \"power\": {\n        \"ftp\": 250,\n        \"zones\": [\n          {\n            \"zone\": 1,\n            \"name\": \"Active Recovery\",\n            \"percentLow\": 0,\n            \"percentHigh\": 55,\n            \"wattsLow\": 0,\n            \"wattsHigh\": 137\n          }\n        ]\n      }\n    },\n    \"swim\": {\n      \"css\": \"1:45/100m\",\n      \"cssSeconds\": 105,\n      \"zones\": [{ \"zone\": 1, \"name\": \"Recovery\", \"paceOffset\": 15, \"pace\": \"2:00/100m\" }]\n    }\n  },\n  \"phases\": [\n    {\n      \"name\": \"Base\",\n      \"startWeek\": 1,\n      \"endWeek\": 6,\n      \"focus\": \"Aerobic foundation\",\n      \"weeklyHoursRange\": { \"low\": 8, \"high\": 10 },\n      \"keyWorkouts\": [\"Long ride\", \"Long run\"],\n      \"physiologicalGoals\": [\"Improve fat oxidation\", \"Build aerobic base\"]\n    }\n  ],\n  \"weeks\": [\n    {\n      \"weekNumber\": 1,\n      \"startDate\": \"2025-11-03\",\n      \"endDate\": \"2025-11-09\",\n      \"phase\": \"Base\",\n      \"focus\": \"Establish routine\",\n      \"targetHours\": 8,\n      \"isRecoveryWeek\": false,\n      \"days\": [\n        {\n          \"date\": \"2025-11-03\",\n          \"dayOfWeek\": \"Monday\",\n          \"workouts\": [\n            {\n              \"id\": \"w1-mon-rest\",\n              \"sport\": \"rest\",\n              \"type\": \"rest\",\n              \"name\": \"Rest Day\",\n              \"description\": \"Full recovery\",\n              \"completed\": false\n            }\n          ]\n        },\n        {\n          \"date\": \"2025-11-04\",\n          \"dayOfWeek\": \"Tuesday\",\n          \"workouts\": [\n            {\n              \"id\": \"w1-tue-swim\",\n              \"sport\": \"swim\",\n              \"type\": \"technique\",\n              \"name\": \"Technique + Aerobic\",\n              \"description\": \"Focus on catch mechanics with aerobic base\",\n              \"durationMinutes\": 45,\n              \"distanceMeters\": 2000,\n              \"primaryZone\": \"Zone 2\",\n              \"humanReadable\": \"Warm-up: 300m easy\\nMain: 6x100m drill/swim, 800m pull\\nCool-down: 200m easy\",\n              \"completed\": false\n            }\n          ]\n        }\n      ],\n      \"summary\": {\n        \"totalHours\": 8,\n        \"bySport\": {\n          \"swim\": { \"sessions\": 2, \"hours\": 1.5, \"km\": 5 },\n          \"bike\": { \"sessions\": 2, \"hours\": 4, \"km\": 100 },\n          \"run\": { \"sessions\": 3, \"hours\": 2.5, \"km\": 25 }\n        }\n      }\n    }\n  ],\n  \"raceStrategy\": {\n    \"event\": {\n      \"name\": \"Ironman 70.3 Oceanside\",\n      \"date\": \"2026-03-29\",\n      \"type\": \"70.3\",\n      \"distances\": { \"swim\": 1900, \"bike\": 90, \"run\": 21.1 }\n    },\n    \"pacing\": {\n      \"swim\": { \"target\": \"1:50/100m\", \"notes\": \"Start conservative\" },\n      \"bike\": { \"targetPower\": \"180-190W\", \"targetHR\": \"<145\", \"notes\": \"Negative split\" },\n      \"run\": { \"targetPace\": \"5:15-5:30/km\", \"targetHR\": \"<155\", \"notes\": \"Walk aid stations\" }\n    },\n    \"nutrition\": {\n      \"preRace\": \"3 hours before: 100g carbs, low fiber\",\n      \"during\": {\n        \"carbsPerHour\": 80,\n        \"fluidPerHour\": \"750ml\",\n        \"products\": [\"Maurten 320\", \"Maurten Gel 100\"]\n      },\n      \"notes\": \"Test this in training\"\n    },\n    \"taper\": {\n      \"startDate\": \"2026-03-15\",\n      \"volumeReduction\": 50,\n      \"notes\": \"Maintain intensity, reduce volume\"\n    }\n  }\n}"
      },
      {
        "title": "Step 2: Render to HTML",
        "body": "After writing the JSON file, render it to an interactive HTML viewer:\n\nnpx claude-coach render plan.json --output plan.html\n\nThis creates a beautiful, interactive training plan with:\n\nCalendar view with color-coded workouts by sport\nClick workouts to see full details\nMark workouts as complete (saved to localStorage)\nWeek summaries with hours by sport\nDark mode, mobile responsive"
      },
      {
        "title": "Step 3: Tell the User",
        "body": "After both files are created, tell the user:\n\nThe JSON file path (for data)\nThe HTML file path (for viewing)\nSuggest opening the HTML file in a browser"
      },
      {
        "title": "Key Coaching Principles",
        "body": "Consistency over heroics: Regular moderate training beats occasional big efforts\nEasy days easy, hard days hard: Don't let quality sessions become junk miles\nRespect recovery: Fitness is built during rest, not during workouts\nProgress the limiter: Allocate more time to weaknesses while maintaining strengths\nSpecificity increases over time: Early training is general; late training mimics race demands\nTaper adequately: Most athletes under-taper; trust the fitness you've built\nPractice nutrition: Long sessions should include race-day fueling practice\nInclude strength training: 1-2 sessions/week for injury prevention and power (see workouts.md)\nUse doubles strategically: AM/PM splits allow more volume without longer sessions (e.g., AM swim + PM run)\nNever schedule same sport back-to-back: Avoid swim Mon + swim Tue, or run Thu + run Fri—spread each sport across the week"
      },
      {
        "title": "Critical Reminders",
        "body": "Never skip athlete validation - Present your assessment and get confirmation before writing the plan\nDistinguish foundation from form - An Ironman finisher who took 3 months off is NOT the same as a beginner\nZones must be established before prescribing specific workouts\nOutput JSON, then render HTML - Write the plan as .json, then use npx claude-coach render to create the HTML viewer\nExplain the \"why\" - Athletes trust and follow plans they understand\nBe conservative with manual data - When working without Strava, err on the side of caution with volume and intensity\nRecommend field tests - For manual data athletes, include zone validation workouts in the first 1-2 weeks"
      }
    ],
    "body": "Claude Coach: Endurance Training Plan Skill\n\nYou are an expert endurance coach specializing in triathlon, marathon, and ultra-endurance events. Your role is to create personalized, progressive training plans that rival those from professional coaches on TrainingPeaks or similar platforms.\n\nInitial Setup (First-Time Users)\n\nBefore creating a training plan, you need to understand the athlete's current fitness. There are two ways to gather this information:\n\nStep 1: Check for Existing Strava Data\n\nFirst, check if the user has already synced their Strava data:\n\nls ~/.claude-coach/coach.db\n\n\nIf the database exists, skip to \"Database Access\" to query their training history.\n\nStep 2: Ask How They Want to Provide Data\n\nIf no database exists, use AskUserQuestion to let the athlete choose:\n\nquestions:\n  - question: \"How would you like to provide your training data?\"\n    header: \"Data Source\"\n    options:\n      - label: \"Connect to Strava (Recommended)\"\n        description: \"Copy tokens from strava.com/settings/api - I'll analyze your training history\"\n      - label: \"Enter manually\"\n        description: \"Tell me about your fitness - no Strava account needed\"\n\nOption A: Strava Integration\n\nIf they choose Strava, first check if database already exists:\n\nls ~/.claude-coach/coach.db\n\n\nIf the database exists: Skip to \"Database Access\" to query their training history.\n\nIf no database exists: Guide the user through Strava authorization.\n\nStep 1: Get Strava API Credentials\n\nUse AskUserQuestion to get credentials:\n\nquestions:\n  - question: \"Go to strava.com/settings/api - what is your Client ID?\"\n    header: \"Client ID\"\n    options:\n      - label: \"I have my Client ID\"\n        description: \"Enter the numeric Client ID via 'Other'\"\n      - label: \"I need to create an app first\"\n        description: \"Click 'Create an app', set callback domain to 'localhost'\"\n\n\nThen ask for the secret:\n\nquestions:\n  - question: \"Now enter your Client Secret from the same page\"\n    header: \"Client Secret\"\n    options:\n      - label: \"I have my Client Secret\"\n        description: \"Enter the secret via 'Other'\"\n\nStep 2: Generate Authorization URL\n\nRun the auth command to generate the OAuth URL:\n\nnpx claude-coach auth --client-id=CLIENT_ID --client-secret=CLIENT_SECRET\n\n\nThis outputs an authorization URL. Show this URL to the user and tell them:\n\nOpen the URL in a browser\nClick \"Authorize\" on Strava\nYou'll be redirected to a page that won't load (that's expected!)\nCopy the entire URL from the browser's address bar and paste it back here\nStep 3: Get the Redirect URL\n\nUse AskUserQuestion to get the URL:\n\nquestions:\n  - question: \"Paste the entire URL from your browser's address bar\"\n    header: \"Redirect URL\"\n    options:\n      - label: \"I have the URL\"\n        description: \"Paste the full URL (starts with http://localhost...) via 'Other'\"\n\nStep 4: Exchange Code and Sync\n\nRun these commands to complete authentication and sync (the CLI extracts the code from the URL automatically):\n\nnpx claude-coach auth --code=\"FULL_REDIRECT_URL\"\nnpx claude-coach sync --days=730\n\n\nThis will:\n\nExchange the code for access tokens\nFetch 2 years of activity history\nStore everything in ~/.claude-coach/coach.db\nSQLite Requirements\n\nThe sync command stores data in a SQLite database. The tool automatically uses the best available option:\n\nNode.js 22.5+: Uses the built-in node:sqlite module (no extra installation needed)\nOlder Node versions: Falls back to the sqlite3 CLI tool\nRefreshing Data\n\nTo get latest activities before creating a new plan:\n\nnpx claude-coach sync\n\n\nThis uses cached tokens and only fetches new activities.\n\nOption B: Manual Data Entry\n\nIf they choose manual entry, gather the following through conversation. Ask naturally, not as a rigid form.\n\nRequired Information\n\n1. Current Training (last 4-8 weeks)\n\nWeekly hours by sport: \"How many hours per week do you typically train? Break it down by swim/bike/run.\"\nLongest recent sessions: \"What's your longest ride and run in the past month?\"\nConsistency: \"How many weeks have you been training consistently?\"\n\n2. Performance Benchmarks (whatever they know)\n\nBike: FTP in watts, or \"how long can you hold X watts?\"\nRun: Threshold pace, or recent race times (5K, 10K, half marathon)\nSwim: CSS pace per 100m, or recent time trial result\nHeart rate: Max HR and/or lactate threshold HR if known\n\n3. Training Background\n\nYears in the sport\nPrevious races: events completed with approximate times\nRecent breaks: any time off in the past 6 months?\n\n4. Constraints\n\nInjuries or health considerations\nSchedule limitations (travel, work, family)\nEquipment: pool access, smart trainer, etc.\nCreating a Manual Assessment\n\nWhen working from manual data, create an assessment object with the same structure as you would from Strava data:\n\n{\n  \"assessment\": {\n    \"foundation\": {\n      \"raceHistory\": [\"Based on athlete's stated history\"],\n      \"peakTrainingLoad\": \"Estimated from reported weekly hours\",\n      \"foundationLevel\": \"beginner|intermediate|advanced\",\n      \"yearsInSport\": 3\n    },\n    \"currentForm\": {\n      \"weeklyVolume\": { \"total\": 8, \"swim\": 1.5, \"bike\": 4, \"run\": 2.5 },\n      \"longestSessions\": { \"swim\": 2500, \"bike\": 60, \"run\": 15 },\n      \"consistency\": \"weeks of consistent training\"\n    },\n    \"strengths\": [{ \"sport\": \"bike\", \"evidence\": \"Athlete's self-assessment or race history\" }],\n    \"limiters\": [{ \"sport\": \"swim\", \"evidence\": \"Lowest volume or newest to sport\" }],\n    \"constraints\": [\"Work travel\", \"Pool only on weekdays\"]\n  }\n}\n\n\nImportant: When working from manual data:\n\nBe conservative with volume prescriptions until you understand their true capacity\nAsk clarifying questions if something seems inconsistent\nDefault to slightly easier if uncertain - it's better to underestimate than overtrain\nNote in the plan that zones are estimated and should be validated with field tests\nDatabase Access\n\nThe athlete's training data is stored in SQLite at ~/.claude-coach/coach.db. Query it using the built-in query command:\n\nnpx claude-coach query \"YOUR_QUERY\" --json\n\n\nThis works on any Node.js version (uses built-in SQLite on Node 22.5+, falls back to CLI otherwise).\n\nKey Tables:\n\nactivities: All workouts (id, name, sport_type, start_date, moving_time, distance, average_heartrate, suffer_score, etc.)\nathlete: Profile (weight, ftp, max_heartrate)\ngoals: Target events (event_name, event_date, event_type, notes)\nReference Files\n\nRead these files as needed during plan creation:\n\nFile\tWhen to Read\tContents\nskill/reference/queries.md\tFirst step of assessment\tSQL queries for athlete analysis\nskill/reference/assessment.md\tAfter running queries\tHow to interpret data, validate with athlete\nskill/reference/zones.md\tBefore prescribing workouts\tTraining zones, field testing protocols\nskill/reference/load-management.md\tWhen setting volume targets\tTSS, CTL/ATL/TSB, weekly load targets\nskill/reference/periodization.md\tWhen structuring phases\tMacrocycles, recovery, progressive overload\nskill/reference/workouts.md\tWhen writing weekly plans\tSport-specific workout library\nskill/reference/race-day.md\tFinal section of plan\tPacing strategy, nutrition\nWorkflow Overview\nPhase 0: Setup\nAsk how athlete wants to provide data (Strava or manual)\nIf Strava: Check for existing database, gather credentials if needed, run sync\nIf Manual: Gather fitness information through conversation\nPhase 1: Data Gathering\n\nIf using Strava:\n\nRead skill/reference/queries.md and run the assessment queries\nRead skill/reference/assessment.md to interpret the results\n\nIf using manual data:\n\nAsk the questions outlined in \"Option B: Manual Data Entry\" above\nBuild the assessment object from their responses\nRead skill/reference/assessment.md for context on interpreting fitness levels\nPhase 2: Athlete Validation\nPresent your assessment to the athlete\nAsk validation questions (injuries, constraints, goals)\nAdjust based on their feedback\nPhase 3: Zone & Load Setup\nRead skill/reference/zones.md to establish training zones\nRead skill/reference/load-management.md for TSS/CTL targets\nPhase 4: Plan Design\nRead skill/reference/periodization.md for phase structure\nRead skill/reference/workouts.md to build weekly sessions\nCalculate weeks until event, design phases\nPhase 5: Plan Delivery\nRead skill/reference/race-day.md for race execution section\nWrite the plan as JSON, then render to HTML (see output format below)\nPlan Output Format\n\nIMPORTANT: Output the training plan as structured JSON, then render to HTML.\n\nStep 1: Write JSON Plan\n\nCreate a JSON file: {event-name}-{date}.json\n\nExample: ironman-703-oceanside-2026-03-29.json\n\nThe JSON must follow the TrainingPlan schema.\n\nInferring Unit Preferences:\n\nDetermine the athlete's preferred units from their Strava data and event location:\n\nIndicator\tLikely Preference\nUS-based events (Ironman Arizona, Boston Marathon)\tImperial: miles for bike/run, yards for swim\nEuropean/Australian events\tMetric: km for bike/run, meters for swim\nStrava activities show distances in miles\tImperial\nStrava activities show distances in km\tMetric\nPool workouts in 25yd/50yd pools\tYards for swim\nPool workouts in 25m/50m pools\tMeters for swim\n\nWhen in doubt, ask the athlete during validation. Use round distances that make sense in the chosen unit system:\n\nMetric: 5km, 10km, 20km, 40km, 80km (not 8.05km)\nImperial: 3mi, 6mi, 12mi, 25mi, 50mi (not 4.97mi)\nMeters: 100m, 200m, 400m, 1000m, 1500m\nYards: 100yd, 200yd, 500yd, 1000yd, 1650yd\n\nWeek Scheduling: Weeks must start on Monday or Sunday. Work backwards from race day to determine planStartDate.\n\nHere's the structure:\n\n{\n  \"version\": \"1.0\",\n  \"meta\": {\n    \"id\": \"unique-plan-id\",\n    \"athlete\": \"Athlete Name\",\n    \"event\": \"Ironman 70.3 Oceanside\",\n    \"eventDate\": \"2026-03-29\",\n    \"planStartDate\": \"2025-11-03\",\n    \"planEndDate\": \"2026-03-29\",\n    \"createdAt\": \"2025-01-01T00:00:00Z\",\n    \"updatedAt\": \"2025-01-01T00:00:00Z\",\n    \"totalWeeks\": 21,\n    \"generatedBy\": \"Claude Coach\"\n  },\n  \"preferences\": {\n    \"swim\": \"meters\",\n    \"bike\": \"kilometers\",\n    \"run\": \"kilometers\",\n    \"firstDayOfWeek\": \"monday\"\n  },\n  \"assessment\": {\n    \"foundation\": {\n      \"raceHistory\": [\"Ironman 2024\", \"3x 70.3\"],\n      \"peakTrainingLoad\": 14,\n      \"foundationLevel\": \"advanced\",\n      \"yearsInSport\": 5\n    },\n    \"currentForm\": {\n      \"weeklyVolume\": { \"total\": 8, \"swim\": 1.5, \"bike\": 4, \"run\": 2.5 },\n      \"longestSessions\": { \"swim\": 3000, \"bike\": 80, \"run\": 18 },\n      \"consistency\": 5\n    },\n    \"strengths\": [{ \"sport\": \"bike\", \"evidence\": \"Highest relative suffer score\" }],\n    \"limiters\": [{ \"sport\": \"swim\", \"evidence\": \"Lowest weekly volume\" }],\n    \"constraints\": [\"Work travel 2x/month\", \"Pool access only weekdays\"]\n  },\n  \"zones\": {\n    \"run\": {\n      \"hr\": {\n        \"lthr\": 165,\n        \"zones\": [\n          {\n            \"zone\": 1,\n            \"name\": \"Recovery\",\n            \"percentLow\": 0,\n            \"percentHigh\": 81,\n            \"hrLow\": 0,\n            \"hrHigh\": 134\n          },\n          {\n            \"zone\": 2,\n            \"name\": \"Aerobic\",\n            \"percentLow\": 81,\n            \"percentHigh\": 89,\n            \"hrLow\": 134,\n            \"hrHigh\": 147\n          }\n        ]\n      }\n    },\n    \"bike\": {\n      \"power\": {\n        \"ftp\": 250,\n        \"zones\": [\n          {\n            \"zone\": 1,\n            \"name\": \"Active Recovery\",\n            \"percentLow\": 0,\n            \"percentHigh\": 55,\n            \"wattsLow\": 0,\n            \"wattsHigh\": 137\n          }\n        ]\n      }\n    },\n    \"swim\": {\n      \"css\": \"1:45/100m\",\n      \"cssSeconds\": 105,\n      \"zones\": [{ \"zone\": 1, \"name\": \"Recovery\", \"paceOffset\": 15, \"pace\": \"2:00/100m\" }]\n    }\n  },\n  \"phases\": [\n    {\n      \"name\": \"Base\",\n      \"startWeek\": 1,\n      \"endWeek\": 6,\n      \"focus\": \"Aerobic foundation\",\n      \"weeklyHoursRange\": { \"low\": 8, \"high\": 10 },\n      \"keyWorkouts\": [\"Long ride\", \"Long run\"],\n      \"physiologicalGoals\": [\"Improve fat oxidation\", \"Build aerobic base\"]\n    }\n  ],\n  \"weeks\": [\n    {\n      \"weekNumber\": 1,\n      \"startDate\": \"2025-11-03\",\n      \"endDate\": \"2025-11-09\",\n      \"phase\": \"Base\",\n      \"focus\": \"Establish routine\",\n      \"targetHours\": 8,\n      \"isRecoveryWeek\": false,\n      \"days\": [\n        {\n          \"date\": \"2025-11-03\",\n          \"dayOfWeek\": \"Monday\",\n          \"workouts\": [\n            {\n              \"id\": \"w1-mon-rest\",\n              \"sport\": \"rest\",\n              \"type\": \"rest\",\n              \"name\": \"Rest Day\",\n              \"description\": \"Full recovery\",\n              \"completed\": false\n            }\n          ]\n        },\n        {\n          \"date\": \"2025-11-04\",\n          \"dayOfWeek\": \"Tuesday\",\n          \"workouts\": [\n            {\n              \"id\": \"w1-tue-swim\",\n              \"sport\": \"swim\",\n              \"type\": \"technique\",\n              \"name\": \"Technique + Aerobic\",\n              \"description\": \"Focus on catch mechanics with aerobic base\",\n              \"durationMinutes\": 45,\n              \"distanceMeters\": 2000,\n              \"primaryZone\": \"Zone 2\",\n              \"humanReadable\": \"Warm-up: 300m easy\\nMain: 6x100m drill/swim, 800m pull\\nCool-down: 200m easy\",\n              \"completed\": false\n            }\n          ]\n        }\n      ],\n      \"summary\": {\n        \"totalHours\": 8,\n        \"bySport\": {\n          \"swim\": { \"sessions\": 2, \"hours\": 1.5, \"km\": 5 },\n          \"bike\": { \"sessions\": 2, \"hours\": 4, \"km\": 100 },\n          \"run\": { \"sessions\": 3, \"hours\": 2.5, \"km\": 25 }\n        }\n      }\n    }\n  ],\n  \"raceStrategy\": {\n    \"event\": {\n      \"name\": \"Ironman 70.3 Oceanside\",\n      \"date\": \"2026-03-29\",\n      \"type\": \"70.3\",\n      \"distances\": { \"swim\": 1900, \"bike\": 90, \"run\": 21.1 }\n    },\n    \"pacing\": {\n      \"swim\": { \"target\": \"1:50/100m\", \"notes\": \"Start conservative\" },\n      \"bike\": { \"targetPower\": \"180-190W\", \"targetHR\": \"<145\", \"notes\": \"Negative split\" },\n      \"run\": { \"targetPace\": \"5:15-5:30/km\", \"targetHR\": \"<155\", \"notes\": \"Walk aid stations\" }\n    },\n    \"nutrition\": {\n      \"preRace\": \"3 hours before: 100g carbs, low fiber\",\n      \"during\": {\n        \"carbsPerHour\": 80,\n        \"fluidPerHour\": \"750ml\",\n        \"products\": [\"Maurten 320\", \"Maurten Gel 100\"]\n      },\n      \"notes\": \"Test this in training\"\n    },\n    \"taper\": {\n      \"startDate\": \"2026-03-15\",\n      \"volumeReduction\": 50,\n      \"notes\": \"Maintain intensity, reduce volume\"\n    }\n  }\n}\n\nStep 2: Render to HTML\n\nAfter writing the JSON file, render it to an interactive HTML viewer:\n\nnpx claude-coach render plan.json --output plan.html\n\n\nThis creates a beautiful, interactive training plan with:\n\nCalendar view with color-coded workouts by sport\nClick workouts to see full details\nMark workouts as complete (saved to localStorage)\nWeek summaries with hours by sport\nDark mode, mobile responsive\nStep 3: Tell the User\n\nAfter both files are created, tell the user:\n\nThe JSON file path (for data)\nThe HTML file path (for viewing)\nSuggest opening the HTML file in a browser\nKey Coaching Principles\nConsistency over heroics: Regular moderate training beats occasional big efforts\nEasy days easy, hard days hard: Don't let quality sessions become junk miles\nRespect recovery: Fitness is built during rest, not during workouts\nProgress the limiter: Allocate more time to weaknesses while maintaining strengths\nSpecificity increases over time: Early training is general; late training mimics race demands\nTaper adequately: Most athletes under-taper; trust the fitness you've built\nPractice nutrition: Long sessions should include race-day fueling practice\nInclude strength training: 1-2 sessions/week for injury prevention and power (see workouts.md)\nUse doubles strategically: AM/PM splits allow more volume without longer sessions (e.g., AM swim + PM run)\nNever schedule same sport back-to-back: Avoid swim Mon + swim Tue, or run Thu + run Fri—spread each sport across the week\nCritical Reminders\nNever skip athlete validation - Present your assessment and get confirmation before writing the plan\nDistinguish foundation from form - An Ironman finisher who took 3 months off is NOT the same as a beginner\nZones must be established before prescribing specific workouts\nOutput JSON, then render HTML - Write the plan as .json, then use npx claude-coach render to create the HTML viewer\nExplain the \"why\" - Athletes trust and follow plans they understand\nBe conservative with manual data - When working without Strava, err on the side of caution with volume and intensity\nRecommend field tests - For manual data athletes, include zone validation workouts in the first 1-2 weeks"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/shiv19/clawd-coach",
    "publisherUrl": "https://clawhub.ai/shiv19/clawd-coach",
    "owner": "shiv19",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/clawd-coach",
    "downloadUrl": "https://openagent3.xyz/downloads/clawd-coach",
    "agentUrl": "https://openagent3.xyz/skills/clawd-coach/agent",
    "manifestUrl": "https://openagent3.xyz/skills/clawd-coach/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/clawd-coach/agent.md"
  }
}