Skills whoop-cli
Companion skill for @andreasnlarsen/whoop-cli: agent-friendly WHOOP access via stable CLI JSON (day briefs, health flags, trends, exports) without raw API plumbing.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/andreasnlarsen/whoop-cli" ~/.claude/skills/openclaw-skills-whoop-cli && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/andreasnlarsen/whoop-cli" ~/.openclaw/skills/openclaw-skills-whoop-cli && rm -rf "$T"
manifest:
skills/andreasnlarsen/whoop-cli/SKILL.mdsource content
whoop-cli
Use the installed
whoop command.
Security + credential handling (required)
- Never ask users to paste client secrets/tokens into chat.
- For first-time auth, the user should run login locally on their own shell.
- Prefer read-only operational commands in agent flows (
,summary
,day-brief
,health
,trend
).sync pull - Do not run
unless the user explicitly asks for login help.whoop auth login - Tokens are stored locally at
by the CLI.~/.whoop-cli/profiles/<profile>.json
Install / bootstrap
If
whoop is missing:
npm install -g @andreasnlarsen/whoop-cli@0.3.1
Optional OpenClaw skill install from package bundle:
whoop openclaw install-skill --force
Core checks
whoop auth status --json- If unauthenticated, ask the user to run local login:
whoop auth login --client-id ... --client-secret ... --redirect-uri ...
- Validate:
whoop day-brief --json --pretty
Useful commands
- Daily:
whoop summary --json --prettywhoop day-brief --json --prettywhoop strain-plan --json --prettywhoop health flags --days 7 --json --pretty
- Activity analysis:
whoop activity list --days 30 --json --prettywhoop activity trend --days 30 --json --prettywhoop activity types --days 30 --json --pretty- training-only:
whoop activity trend --days 30 --labeled-only --json --pretty
Activity interpretation guardrail (important)
- WHOOP generic
rows (oftenactivity
) are auto-detected and may be unlabeled movement (housework/incidental activity), not intentional training.sport_id=-1 - Do not treat generic
as confirmed training volume by default.activity - For coaching/training recommendations, default to
and report both total vs filtered counts.--labeled-only
Agent filtering pattern (jq-friendly)
- Canonical source:
whoop activity list --json - Prefer built-in filters first (
,--labeled-only
,--generic-only
,--sport-id
).--sport-name - If custom slicing is needed and
is available, filter shell-side from raw JSON (example):jq
whoop activity list --days 30 --json | jq '.data.records | map(select(.sport_id != -1))'
- Export:
whoop sync pull --start YYYY-MM-DD --end YYYY-MM-DD --out ./whoop.jsonl --json --pretty
Experiment protocol (agent-required)
- Canonical state:
only.~/.whoop-cli/experiments.json - Plan experiments with context at creation time:
whoop experiment plan --name ... --behavior ... --start-date YYYY-MM-DD [--end-date YYYY-MM-DD] --description ... --why ... --hypothesis ... --success-criteria ... --protocol ... --json --pretty
- Update context without creating duplicate state:
whoop experiment context --id ... [--description ... --why ... --hypothesis ... --success-criteria ... --protocol ...] --json --pretty
- Check lifecycle/status with:
whoop experiment status [--status planned|running|completed] [--id ...] --json --pretty
- Evaluate outcomes with:
whoop experiment report --id ... --json --pretty
- Profile scope is strict by default (active
only).--profile- Use
only when cross-profile visibility is explicitly needed.--all-profiles
- Use
- Prefer output field
(path to canonical state file);sourceOfTruth
is kept as compatibility alias.experimentsFile - Avoid duplicating experiment state into other files unless the user explicitly asks for separate notes.
Safety
- Never print client secrets or raw tokens.
- Keep API errors concise and actionable.
- Treat this integration as unofficial/non-affiliated.