{
  "schemaVersion": "1.0",
  "item": {
    "slug": "garmin-tracker",
    "name": "Garmin Tracker",
    "source": "tencent",
    "type": "skill",
    "category": "数据分析",
    "sourceUrl": "https://clawhub.ai/ricardotrevisan/garmin-tracker",
    "canonicalUrl": "https://clawhub.ai/ricardotrevisan/garmin-tracker",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/garmin-tracker",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=garmin-tracker",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/__tests__/fixtures/training-plan-lines.json",
      "scripts/__tests__/training_plan_parser.test.mjs",
      "scripts/reconcile_tracking.py",
      "scripts/sync_training_plan.mjs",
      "scripts/training_plan_parser.mjs"
    ],
    "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/garmin-tracker"
    },
    "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/garmin-tracker",
    "agentPageUrl": "https://openagent3.xyz/skills/garmin-tracker/agent",
    "manifestUrl": "https://openagent3.xyz/skills/garmin-tracker/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/garmin-tracker/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": "Garmin Tracker",
        "body": "Use this skill when the user asks to sync, rebuild, or validate Garmin training data in garmin_tracking.json (workspace root)."
      },
      {
        "title": "Runtime Prerequisite",
        "body": "playwright-core must be available in the runtime where the skill executes.\nIf you get MODULE_NOT_FOUND: playwright-core, install it in the active workspace:\n\nnpm install playwright-core"
      },
      {
        "title": "Scope",
        "body": "This skill is intentionally narrow: goal tracking for Garmin runners/users (training history summary + upcoming training-plan).\nOut of scope by default: deep telemetry scraping (GPS route internals, split arrays, cadence/power/elevation raw series).\nOut of scope: nutrition workflow orchestration or external workflow integration."
      },
      {
        "title": "Hard Rules",
        "body": "Control start date is fixed: 2026-02-01.\nKeep these top-level fields: lastUpdate, planName, currentWeek, summary, history, upcoming, recurring_activities.\nsummary.to must always be today (YYYY-MM-DD).\nActivities must use this canonical shape:\n\ntype\ndistanceKm\ndurationSec\navgPaceSecPerKm\navgHrBpm\ncalories\nsourceId"
      },
      {
        "title": "Browser Flow (Garmin)",
        "body": "Open Garmin activities list page and collect activities from 2026-02-01 onward.\nOpen Garmin training plan page (/app/training-plan) and refresh currentWeek + upcoming.\nKeep extraction objective: list/table fields only. No GPS/splits/cadence/power deep scrape.\nIf browser action fails, do one in-tool recovery sequence first (tabs -> focus -> fresh snapshot) before escalation."
      },
      {
        "title": "Session/Auth Contract",
        "body": "The user signs in locally to Garmin in the browser profile used by OpenClaw.\nIf Garmin page indicates signed-out session, ask user to sign in and then rerun.\nDo not store user credentials in the skill files."
      },
      {
        "title": "Authentication (Priority Order)",
        "body": "Use this strict order:\n\nLogged browser session (preferred): reuse existing authenticated Garmin session.\nGuided manual login in the controlled browser/profile.\nCredentials fallback only if browser login is not possible or explicitly rejected by the user.\n\nsync_training_plan.mjs supports:\n\n--auth-source auto (default): use existing browser session; if signed out and credentials are available, try credentials login.\n--auth-source browser: never use credentials; require manual login.\n--auth-source credentials: require credentials and attempt login directly."
      },
      {
        "title": "Authentication (User Guidance)",
        "body": "If the user is signed out, guide with explicit steps:\n\nAsk for manual sign-in in the controlled browser profile:\nhttps://connect.garmin.com/signin/ -> https://connect.garmin.com/app/training-plan -> rerun sync.\nIf browser sign-in is not possible, request credentials as fallback and run credentials mode.\n\nNotes:\n\nAuthentication policy (browser-first vs credentials-first) may be configured by the operator for each environment.\nIn containerized browser setups that expose a remote UI, use the configured noVNC/VNC endpoint to complete login when needed.\nIn host-browser mode, sign in directly in the host browser profile configured in OpenClaw."
      },
      {
        "title": "Credentials Mode (Fallback)",
        "body": "If browser sign-in is not possible, credentials mode can be used as fallback.\n\nRules:\n\nAsk only what is strictly required (username/email + password, and 2FA code only if prompted).\nUse credentials only for the login action, then discard from working memory/context when possible.\nNever write credentials to MEMORY.md, garmin_tracking.json, logs, or skill files.\nNever echo credentials back in responses.\nAfter login success, continue with normal session-based flow."
      },
      {
        "title": "Data Rebuild Flow",
        "body": "Read current garmin_tracking.json.\nPreserve planName and recurring_activities.\nRebuild history from Garmin activities (>= control start date).\nRecompute summary from rebuilt history.\nSet summary.to to today and lastUpdate to current timestamp."
      },
      {
        "title": "Local Validator/Reconciler Script",
        "body": "Use the bundled script for schema normalization and summary recomputation:\n\npython3 {baseDir}/scripts/reconcile_tracking.py --file garmin_tracking.json --write\n\nCheck-only mode:\n\npython3 {baseDir}/scripts/reconcile_tracking.py --file garmin_tracking.json"
      },
      {
        "title": "Training Plan Sync Script",
        "body": "Use the bundled script to refresh currentWeek and upcoming from Garmin Training Plan:\n\nnode {baseDir}/scripts/sync_training_plan.mjs --file garmin_tracking.json --write\n\nCredentials fallback example (last resort):\n\nnode {baseDir}/scripts/sync_training_plan.mjs \\\n  --auth-source credentials \\\n  --garmin-email \"user@example.com\" \\\n  --garmin-password \"***\" \\\n  --file garmin_tracking.json \\\n  --write\n\nCDP resolution priority:\n\n--cdp-url (explicit override)\nOpenClaw config (browser.defaultProfile -> browser.profiles.<profile>.cdpUrl) from --config path\nfallback to the script default CDP endpoint for local setups (http://127.0.0.1:<port>)\n\nOverride example:\n\nnode {baseDir}/scripts/sync_training_plan.mjs --config data/config/openclaw.json --url \"https://connect.garmin.com/app/training-plan\" --file garmin_tracking.json --write"
      },
      {
        "title": "Minimal Parser Tests",
        "body": "Run parser fixtures:\n\nnode --test {baseDir}/scripts/__tests__/training_plan_parser.test.mjs"
      },
      {
        "title": "Final Checks",
        "body": "File is valid JSON.\nNo nutritionLog key exists.\nhistory[].activities[] are canonical.\nsummary.to equals today."
      }
    ],
    "body": "Garmin Tracker\n\nUse this skill when the user asks to sync, rebuild, or validate Garmin training data in garmin_tracking.json (workspace root).\n\nRuntime Prerequisite\nplaywright-core must be available in the runtime where the skill executes.\nIf you get MODULE_NOT_FOUND: playwright-core, install it in the active workspace:\nnpm install playwright-core\n\nScope\nThis skill is intentionally narrow: goal tracking for Garmin runners/users (training history summary + upcoming training-plan).\nOut of scope by default: deep telemetry scraping (GPS route internals, split arrays, cadence/power/elevation raw series).\nOut of scope: nutrition workflow orchestration or external workflow integration.\nHard Rules\nControl start date is fixed: 2026-02-01.\nKeep these top-level fields: lastUpdate, planName, currentWeek, summary, history, upcoming, recurring_activities.\nsummary.to must always be today (YYYY-MM-DD).\nActivities must use this canonical shape:\ntype\ndistanceKm\ndurationSec\navgPaceSecPerKm\navgHrBpm\ncalories\nsourceId\nBrowser Flow (Garmin)\nOpen Garmin activities list page and collect activities from 2026-02-01 onward.\nOpen Garmin training plan page (/app/training-plan) and refresh currentWeek + upcoming.\nKeep extraction objective: list/table fields only. No GPS/splits/cadence/power deep scrape.\nIf browser action fails, do one in-tool recovery sequence first (tabs -> focus -> fresh snapshot) before escalation.\nSession/Auth Contract\nThe user signs in locally to Garmin in the browser profile used by OpenClaw.\nIf Garmin page indicates signed-out session, ask user to sign in and then rerun.\nDo not store user credentials in the skill files.\nAuthentication (Priority Order)\n\nUse this strict order:\n\nLogged browser session (preferred): reuse existing authenticated Garmin session.\nGuided manual login in the controlled browser/profile.\nCredentials fallback only if browser login is not possible or explicitly rejected by the user.\n\nsync_training_plan.mjs supports:\n\n--auth-source auto (default): use existing browser session; if signed out and credentials are available, try credentials login.\n--auth-source browser: never use credentials; require manual login.\n--auth-source credentials: require credentials and attempt login directly.\nAuthentication (User Guidance)\n\nIf the user is signed out, guide with explicit steps:\n\nAsk for manual sign-in in the controlled browser profile: https://connect.garmin.com/signin/ -> https://connect.garmin.com/app/training-plan -> rerun sync.\nIf browser sign-in is not possible, request credentials as fallback and run credentials mode.\n\nNotes:\n\nAuthentication policy (browser-first vs credentials-first) may be configured by the operator for each environment.\nIn containerized browser setups that expose a remote UI, use the configured noVNC/VNC endpoint to complete login when needed.\nIn host-browser mode, sign in directly in the host browser profile configured in OpenClaw.\nCredentials Mode (Fallback)\n\nIf browser sign-in is not possible, credentials mode can be used as fallback.\n\nRules:\n\nAsk only what is strictly required (username/email + password, and 2FA code only if prompted).\nUse credentials only for the login action, then discard from working memory/context when possible.\nNever write credentials to MEMORY.md, garmin_tracking.json, logs, or skill files.\nNever echo credentials back in responses.\nAfter login success, continue with normal session-based flow.\nData Rebuild Flow\nRead current garmin_tracking.json.\nPreserve planName and recurring_activities.\nRebuild history from Garmin activities (>= control start date).\nRecompute summary from rebuilt history.\nSet summary.to to today and lastUpdate to current timestamp.\nLocal Validator/Reconciler Script\n\nUse the bundled script for schema normalization and summary recomputation:\n\npython3 {baseDir}/scripts/reconcile_tracking.py --file garmin_tracking.json --write\n\n\nCheck-only mode:\n\npython3 {baseDir}/scripts/reconcile_tracking.py --file garmin_tracking.json\n\nTraining Plan Sync Script\n\nUse the bundled script to refresh currentWeek and upcoming from Garmin Training Plan:\n\nnode {baseDir}/scripts/sync_training_plan.mjs --file garmin_tracking.json --write\n\n\nCredentials fallback example (last resort):\n\nnode {baseDir}/scripts/sync_training_plan.mjs \\\n  --auth-source credentials \\\n  --garmin-email \"user@example.com\" \\\n  --garmin-password \"***\" \\\n  --file garmin_tracking.json \\\n  --write\n\n\nCDP resolution priority:\n\n--cdp-url (explicit override)\nOpenClaw config (browser.defaultProfile -> browser.profiles.<profile>.cdpUrl) from --config path\nfallback to the script default CDP endpoint for local setups (http://127.0.0.1:<port>)\n\nOverride example:\n\nnode {baseDir}/scripts/sync_training_plan.mjs --config data/config/openclaw.json --url \"https://connect.garmin.com/app/training-plan\" --file garmin_tracking.json --write\n\nMinimal Parser Tests\n\nRun parser fixtures:\n\nnode --test {baseDir}/scripts/__tests__/training_plan_parser.test.mjs\n\nFinal Checks\nFile is valid JSON.\nNo nutritionLog key exists.\nhistory[].activities[] are canonical.\nsummary.to equals today."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ricardotrevisan/garmin-tracker",
    "publisherUrl": "https://clawhub.ai/ricardotrevisan/garmin-tracker",
    "owner": "ricardotrevisan",
    "version": "1.0.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/garmin-tracker",
    "downloadUrl": "https://openagent3.xyz/downloads/garmin-tracker",
    "agentUrl": "https://openagent3.xyz/skills/garmin-tracker/agent",
    "manifestUrl": "https://openagent3.xyz/skills/garmin-tracker/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/garmin-tracker/agent.md"
  }
}