Install
openclaw skills install garmin-trackerRebuild and maintain garmin_tracking.json from Garmin web data (activities + training plan) with a fixed schema from 2026-02-01.
openclaw skills install garmin-trackerUse this skill when the user asks to sync, rebuild, or validate Garmin training data in garmin_tracking.json (workspace root).
playwright-core must be available in the runtime where the skill executes.MODULE_NOT_FOUND: playwright-core, install it in the active workspace:npm install playwright-core
2026-02-01.lastUpdate, planName, currentWeek, summary, history, upcoming, recurring_activities.summary.to must always be today (YYYY-MM-DD).typedistanceKmdurationSecavgPaceSecPerKmavgHrBpmcaloriessourceId2026-02-01 onward./app/training-plan) and refresh currentWeek + upcoming.tabs -> focus -> fresh snapshot) before escalation.Use this strict order:
sync_training_plan.mjs supports:
--auth-source auto (default): use existing browser session; if signed out and credentials are available, try credentials login.--auth-source browser: never use credentials; require manual login.--auth-source credentials: require credentials and attempt login directly.If the user is signed out, guide with explicit steps:
https://connect.garmin.com/signin/ -> https://connect.garmin.com/app/training-plan -> rerun sync.Notes:
If browser sign-in is not possible, credentials mode can be used as fallback.
Rules:
MEMORY.md, garmin_tracking.json, logs, or skill files.garmin_tracking.json.planName and recurring_activities.history from Garmin activities (>= control start date).summary from rebuilt history.summary.to to today and lastUpdate to current timestamp.Use the bundled script for schema normalization and summary recomputation:
python3 {baseDir}/scripts/reconcile_tracking.py --file garmin_tracking.json --write
Check-only mode:
python3 {baseDir}/scripts/reconcile_tracking.py --file garmin_tracking.json
Use the bundled script to refresh currentWeek and upcoming from Garmin Training Plan:
node {baseDir}/scripts/sync_training_plan.mjs --file garmin_tracking.json --write
Credentials fallback example (last resort):
node {baseDir}/scripts/sync_training_plan.mjs \
--auth-source credentials \
--garmin-email "user@example.com" \
--garmin-password "***" \
--file garmin_tracking.json \
--write
CDP resolution priority:
--cdp-url (explicit override)browser.defaultProfile -> browser.profiles.<profile>.cdpUrl) from --config pathhttp://127.0.0.1:<port>)Override example:
node {baseDir}/scripts/sync_training_plan.mjs --config data/config/openclaw.json --url "https://connect.garmin.com/app/training-plan" --file garmin_tracking.json --write
Run parser fixtures:
node --test {baseDir}/scripts/__tests__/training_plan_parser.test.mjs
nutritionLog key exists.history[].activities[] are canonical.summary.to equals today.