Scan Report
8 /100
whoop-guru
WHOOP AI Fitness Coach - LLM-powered personalized training plans for running, strength, and recovery
WHOOP health management skill with legitimate OAuth-based WHOOP integration and optional LLM coaching. No malicious behavior, data exfiltration, or credential theft detected. All functionality is properly documented and operates as a standard health data aggregator.
Safe to install
Skill is safe to use. Ensure WHOOP OAuth credentials and LLM API keys remain protected. Monitor for any unexpected network activity to third-party IPs beyond WHOOP API and configured LLM endpoints.
Findings 3 items
| Severity | Finding | Location |
|---|---|---|
| Low | Push scripts use hardcoded paths | scripts/push-morning.py:16 |
| Info | Version history notes shell injection fix | SKILL.md:90 |
| Info | WHOOP_REFRESH_TOKEN documentation inconsistency | lib/whoop-fetcher.sh:13 |
| Resource | Declared | Inferred | Status | Evidence |
|---|---|---|---|---|
| Network | READ | READ | ✓ Aligned | Scripts only call WHOOP API (api.prod.whoop.com) and user-configured LLM endpoin… |
| Filesystem | WRITE | WRITE | ✓ Aligned | Writes to ~/.clawdbot/ and data/ directories as documented |
| Environment | READ | READ | ✓ Aligned | Reads OPENCLAW_WORKSPACE, WHOOP_DATA_DIR, WHOOP_SKILL_DIR |
| Shell | WRITE | WRITE | ✓ Aligned | whoop-guru.py:44-47 uses subprocess.run() for health_score.py and enhanced_repor… |
| Skill Invoke | NONE | NONE | — | No cross-skill invocation detected |
| Clipboard | NONE | NONE | — | No clipboard access |
21 findings
Medium External URL 外部 URL
https://developer.whoop.com SKILL.md:144 Medium External URL 外部 URL
https://clawhub.com/skills/whoop-guru _meta.json:8 Medium External URL 外部 URL
https://api.prod.whoop.com/oauth/oauth2/auth?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=https://localhost:... docs/whoop_api_guide.md:17 Medium External URL 外部 URL
https://api.prod.whoop.com/oauth/oauth2/token docs/whoop_api_guide.md:32 Medium External URL 外部 URL
https://api.minimax.chat/v1/text/chatcompletion_pro lib/llm.py:41 Medium External URL 外部 URL
https://platform.minimaxi.com lib/llm.py:48 Medium External URL 外部 URL
https://platform.openai.com lib/llm.py:61 Medium External URL 外部 URL
https://console.anthropic.com lib/llm.py:74 Medium External URL 外部 URL
https://open.bigmodel.cn/api/paas/v4/chat/completions lib/llm.py:80 Medium External URL 外部 URL
https://open.bigmodel.cn lib/llm.py:87 Medium External URL 外部 URL
https://api.moonshot.cn/v1/chat/completions lib/llm.py:93 Medium External URL 外部 URL
https://platform.moonshot.cn lib/llm.py:100 Medium External URL 外部 URL
https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation lib/llm.py:106 Medium External URL 外部 URL
https://dashscope.console.aliyun.com lib/llm.py:113 Medium External URL 外部 URL
https://api.deepseek.com/v1/chat/completions lib/llm.py:119 Medium External URL 外部 URL
https://platform.deepseek.com lib/llm.py:125 Medium External URL 外部 URL
https://api.siliconflow.cn/v1/chat/completions lib/llm.py:131 Medium External URL 外部 URL
https://cloud.siliconflow.cn lib/llm.py:138 Medium External URL 外部 URL
https://api.prod.whoop.com/developer/v2/$ lib/whoop-fetcher.sh:55 Medium External URL 外部 URL
https://api.prod.whoop.com/developer/v2 references/api.md:3 Medium External URL 外部 URL
https://api.prod.whoop.com/oauth/oauth2/auth references/api.md:10 File Tree
137 files · 505.8 KB · 14986 lines Python 44f · 12204L
JSON 82f · 1299L
Markdown 7f · 880L
Shell 4f · 603L
├─
▾
data
│ ├─
▾
config
│ │ ├─
llm_config.json
JSON
│ │ └─
README.md
Markdown
│ ├─
▾
logs
│ │ ├─
checkin_push.json
JSON
│ │ ├─
checkins_default.json
JSON
│ │ ├─
checkins_dongyi.json
JSON
│ │ ├─
evening_push.json
JSON
│ │ ├─
morning_push.json
JSON
│ │ └─
running_default.json
JSON
│ ├─
▾
processed
│ │ ├─
health_advisor.json
JSON
│ │ └─
latest.json
JSON
│ └─
▾
profiles
│ ├─
goals_simulation_test_1775224228.json
JSON
│ ├─
goals_test_user_1775190014.871542.json
JSON
│ ├─
goals_test_user_1775190014.873303.json
JSON
│ ├─
goals_test_user_1775190020.593088.json
JSON
│ ├─
goals_test_user_1775190020.594723.json
JSON
│ ├─
goals_test_user_1775190026.709988.json
JSON
│ ├─
goals_test_user_1775190026.711578.json
JSON
│ ├─
goals_test_user_1775190094.688879.json
JSON
│ ├─
goals_test_user_1775190094.690484.json
JSON
│ ├─
goals_test_user_1775190128.971156.json
JSON
│ ├─
goals_test_user_1775190128.972612.json
JSON
│ ├─
goals_test_user_1775223612.535238.json
JSON
│ ├─
goals_test_user_1775223612.540519.json
JSON
│ ├─
goals_test_user_1775223850.417576.json
JSON
│ ├─
goals_test_user_1775223850.422325.json
JSON
│ ├─
goals_test_user_1775223861.873993.json
JSON
│ ├─
goals_test_user_1775223861.878493.json
JSON
│ ├─
goals_test_user_1775224412.545972.json
JSON
│ ├─
goals_test_user_1775224412.550118.json
JSON
│ ├─
goals_test_user_1775224436.293886.json
JSON
│ ├─
goals_test_user_1775224436.29769.json
JSON
│ ├─
goals_test_user_1775224990.821541.json
JSON
│ ├─
goals_test_user_1775224990.826086.json
JSON
│ ├─
goals_test_user_1775225488.269679.json
JSON
│ ├─
goals_test_user_1775225488.273868.json
JSON
│ ├─
marathon_goals_dongyi.json
JSON
│ ├─
marathon_goals_simulation_test_1775224228.json
JSON
│ ├─
marathon_goals_test_marathon_user.json
JSON
│ ├─
marathon_goals_test_user_1775223612.77021.json
JSON
│ ├─
marathon_goals_test_user_1775223612.794712.json
JSON
│ ├─
marathon_goals_test_user_1775223850.425143.json
JSON
│ ├─
marathon_goals_test_user_1775223850.449259.json
JSON
│ ├─
marathon_goals_test_user_1775223850.4524.json
JSON
│ ├─
marathon_goals_test_user_1775223850.454387.json
JSON
│ ├─
marathon_goals_test_user_1775223850.456401.json
JSON
│ ├─
marathon_goals_test_user_1775223850.603095.json
JSON
│ ├─
marathon_goals_test_user_1775223850.620433.json
JSON
│ ├─
marathon_goals_test_user_1775223861.881167.json
JSON
│ ├─
marathon_goals_test_user_1775223861.883149.json
JSON
│ ├─
marathon_goals_test_user_1775223861.885892.json
JSON
│ ├─
marathon_goals_test_user_1775223861.887832.json
JSON
│ ├─
marathon_goals_test_user_1775223861.88967.json
JSON
│ ├─
marathon_goals_test_user_1775223862.019138.json
JSON
│ ├─
marathon_goals_test_user_1775223862.033213.json
JSON
│ ├─
marathon_goals_test_user_1775224412.55296.json
JSON
│ ├─
marathon_goals_test_user_1775224412.554829.json
JSON
│ ├─
marathon_goals_test_user_1775224412.557506.json
JSON
│ ├─
marathon_goals_test_user_1775224412.559284.json
JSON
│ ├─
marathon_goals_test_user_1775224412.561096.json
JSON
│ ├─
marathon_goals_test_user_1775224412.687668.json
JSON
│ ├─
marathon_goals_test_user_1775224412.701859.json
JSON
│ ├─
marathon_goals_test_user_1775224436.30032.json
JSON
│ ├─
marathon_goals_test_user_1775224436.302031.json
JSON
│ ├─
marathon_goals_test_user_1775224436.304375.json
JSON
│ ├─
marathon_goals_test_user_1775224436.306063.json
JSON
│ ├─
marathon_goals_test_user_1775224436.309536.json
JSON
│ ├─
marathon_goals_test_user_1775224436.431787.json
JSON
│ ├─
marathon_goals_test_user_1775224436.444663.json
JSON
│ ├─
marathon_goals_test_user_1775224990.829856.json
JSON
│ ├─
marathon_goals_test_user_1775224990.83249.json
JSON
│ ├─
marathon_goals_test_user_1775224990.834953.json
JSON
│ ├─
marathon_goals_test_user_1775224990.836773.json
JSON
│ ├─
marathon_goals_test_user_1775224990.838613.json
JSON
│ ├─
marathon_goals_test_user_1775224990.965365.json
JSON
│ ├─
marathon_goals_test_user_1775224990.98028.json
JSON
│ ├─
marathon_goals_test_user_1775225488.276726.json
JSON
│ ├─
marathon_goals_test_user_1775225488.278449.json
JSON
│ ├─
marathon_goals_test_user_1775225488.281118.json
JSON
│ ├─
marathon_goals_test_user_1775225488.282935.json
JSON
│ ├─
marathon_goals_test_user_1775225488.284771.json
JSON
│ ├─
marathon_goals_test_user_1775225488.417398.json
JSON
│ └─
marathon_goals_test_user_1775225488.436721.json
JSON
├─
▾
docs
│ └─
whoop_api_guide.md
Markdown
├─
▾
lib
│ ├─
▾
coach
│ │ ├─
__init__.py
Python
│ │ └─
core.py
Python
│ ├─
▾
ml
│ │ ├─
__init__.py
Python
│ │ ├─
predictor.py
Python
│ │ └─
recovery_model.py
Python
│ ├─
▾
prompts
│ │ ├─
__init__.py
Python
│ │ ├─
injury.py
Python
│ │ ├─
recovery.py
Python
│ │ ├─
training.py
Python
│ │ └─
weekly.py
Python
│ ├─
▾
reports
│ │ └─
weekly.py
Python
│ ├─
__init__.py
Python
│ ├─
cli.py
Python
│ ├─
coach_interface.py
Python
│ ├─
comprehensive_analysis.py
Python
│ ├─
daily-report.sh
Shell
│ ├─
data_cleaner.py
Python
│ ├─
data_processor.py
Python
│ ├─
detailed-report.sh
Shell
│ ├─
dynamic_planner.py
Python
│ ├─
enhanced_report.py
Python
│ ├─
enhanced_reports.py
Python
│ ├─
feedback_learning.py
Python
│ ├─
goals_marathon.py
Python
│ ├─
goals.py
Python
│ ├─
health_advisor.py
Python
│ ├─
health_score.py
Python
│ ├─
llm.py
Python
│ ├─
marathon_analyzer.py
Python
│ ├─
marathon_commands.py
Python
│ ├─
ml_predictor.py
Python
│ ├─
needs_analyzer.py
Python
│ ├─
notifications.py
Python
│ ├─
plan_generator.py
Python
│ ├─
pusher.py
Python
│ ├─
sync.py
Python
│ ├─
tracker.py
Python
│ ├─
user_profile.py
Python
│ └─
whoop-fetcher.sh
Shell
├─
▾
references
│ ├─
api.md
Markdown
│ └─
health_analysis.md
Markdown
├─
▾
scripts
│ ├─
coach-push.sh
Shell
│ ├─
push-checkin.py
Python
│ ├─
push-evening.py
Python
│ ├─
push-morning.py
Python
│ ├─
whoop_auth.py
Python
│ ├─
whoop_chart.py
Python
│ └─
whoop_data.py
Python
├─
▾
tests
│ └─
test_all.py
Python
├─
_meta.json
JSON
├─
CLAWHUB.md
Markdown
├─
icon_prompt.md
Markdown
├─
SKILL.md
Markdown
└─
whoop-guru.py
Python
Dependencies 3 items
| Package | Version | Source | Known Vulns | Notes |
|---|---|---|---|---|
requests | * | pip | No | Version not pinned but stdlib-based; low supply chain risk for health data tool |
pandas | * | pip | No | Version not pinned |
matplotlib | * | pip | No | Version not pinned |
Security Positives
✓ OAuth flow uses proper state parameter and PKCE-style CSRF protection
✓ Token file permissions set to 0o600 after creation
✓ All network calls target legitimate WHOOP API endpoints
✓ LLM API key stored locally only, not transmitted elsewhere
✓ Shell injection vulnerability (os.system) was patched in v8.2.4
✓ Clear privacy statement in SKILL.md explaining data flow
✓ Credentials stored in ~/.clawdbot/ separate from skill data
✓ No base64-encoded payloads piped to shell
✓ No direct IP network requests to unknown servers
✓ No credential harvesting from ~/.ssh, ~/.aws, or .env
✓ No hidden instructions in HTML comments