[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71PG90NPADDPATTKTAJC6C6":3,"skill-same:01M71PG90NPADDPATTKTAJC6C6":100},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":65,"commitSha":66,"skillDirectory":67,"forksCount":13,"repositoryHtmlUrl":68,"repositoryHomepageUrl":6,"ownerHtmlUrl":69,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":70,"install":71,"resources":83},"01M71PG90NPADDPATTKTAJC6C6","fitness-nutrition",null,"Gym workout planner and nutrition tracker. Search 690+ exercises by muscle, equipment, or category via wger. Look up macros and calories for 380,000+ foods via USDA FoodData Central. Compute BMI, TDEE, one-rep max, macro splits, and body fat — pure Python, no pip installs. Built for anyone chasing gains, cutting weight, or just trying to eat better.","gjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN","gjbvsjjvgm-sketch","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F278511911?v=4","01M71F3JXKZQ70H2KCHHTXKZDA","01M71PENEVFN19DBZFNHJPCHQ7",0,"MIT","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fhermes-agent\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"fitness","nutrition","fitness nutrition","macro","body","signup","rate","max","at","tracker","exercises","limits","api","free","rep","exercise","up","search","eat","get","2026-11-10 13:02:02",false,"---\nname: fitness-nutrition\ndescription: >\n  Gym workout planner and nutrition tracker. Search 690+ exercises by muscle,\n  equipment, or category via wger. Look up macros and calories for 380,000+\n  foods via USDA FoodData Central. Compute BMI, TDEE, one-rep max, macro\n  splits, and body fat — pure Python, no pip installs. Built for anyone\n  chasing gains, cutting weight, or just trying to eat better.\nversion: 1.0.0\nauthors:\n  - haileymarshall\nlicense: MIT\nmetadata:\n  hermes:\n    tags: [health, fitness, nutrition, gym, workout, diet, exercise]\n    category: health\n    prerequisites:\n      commands: [curl, python3]\nrequired_environment_variables:\n  - name: USDA_API_KEY\n    prompt: \"USDA FoodData Central API key (free)\"\n    help: \"Get one free at https:\u002F\u002Ffdc.nal.usda.gov\u002Fapi-key-signup\u002F — or skip to use DEMO_KEY with lower rate limits\"\n    required_for: \"higher rate limits on food\u002Fnutrition lookups (DEMO_KEY works without signup)\"\n    optional: true\n---\n\n# Fitness & Nutrition\n\nExpert fitness coach and sports nutritionist skill. Two data sources\nplus offline calculators — everything a gym-goer needs in one place.\n\n**Data sources (all free, no pip dependencies):**\n\n- **wger** (https:\u002F\u002Fwger.de\u002Fapi\u002Fv2\u002F) — open exercise database, 690+ exercises with muscles, equipment, images. Public endpoints need zero authentication.\n- **USDA FoodData Central** (https:\u002F\u002Fapi.nal.usda.gov\u002Ffdc\u002Fv1\u002F) — US government nutrition database, 380,000+ foods. `DEMO_KEY` works instantly; free signup for higher limits.\n\n**Offline calculators (pure stdlib Python):**\n\n- BMI, TDEE (Mifflin-St Jeor), one-rep max (Epley\u002FBrzycki\u002FLombardi), macro splits, body fat % (US Navy method)\n\n---\n\n## When to Use\n\nTrigger this skill when the user asks about:\n- Exercises, workouts, gym routines, muscle groups, workout splits\n- Food macros, calories, protein content, meal planning, calorie counting\n- Body composition: BMI, body fat, TDEE, caloric surplus\u002Fdeficit\n- One-rep max estimates, training percentages, progressive overload\n- Macro ratios for cutting, bulking, or maintenance\n\n---\n\n## Procedure\n\n### Exercise Lookup (wger API)\n\nAll wger public endpoints return JSON and require no auth. Always add\n`format=json` and `language=2` (English) to exercise queries.\n\n**Step 1 — Identify what the user wants:**\n\n- By muscle → use `\u002Fapi\u002Fv2\u002Fexercise\u002F?muscles={id}&language=2&status=2&format=json`\n- By category → use `\u002Fapi\u002Fv2\u002Fexercise\u002F?category={id}&language=2&status=2&format=json`\n- By equipment → use `\u002Fapi\u002Fv2\u002Fexercise\u002F?equipment={id}&language=2&status=2&format=json`\n- By name → use `\u002Fapi\u002Fv2\u002Fexercise\u002Fsearch\u002F?term={query}&language=english&format=json`\n- Full details → use `\u002Fapi\u002Fv2\u002Fexerciseinfo\u002F{exercise_id}\u002F?format=json`\n\n**Step 2 — Reference IDs (so you don't need extra API calls):**\n\nExercise categories:\n\n| ID | Category    |\n|----|-------------|\n| 8  | Arms        |\n| 9  | Legs        |\n| 10 | Abs         |\n| 11 | Chest       |\n| 12 | Back        |\n| 13 | Shoulders   |\n| 14 | Calves      |\n| 15 | Cardio      |\n\nMuscles:\n\n| ID | Muscle                    | ID | Muscle                  |\n|----|---------------------------|----|-------------------------|\n| 1  | Biceps brachii            | 2  | Anterior deltoid        |\n| 3  | Serratus anterior         | 4  | Pectoralis major        |\n| 5  | Obliquus externus         | 6  | Gastrocnemius           |\n| 7  | Rectus abdominis          | 8  | Gluteus maximus         |\n| 9  | Trapezius                 | 10 | Quadriceps femoris      |\n| 11 | Biceps femoris            | 12 | Latissimus dorsi        |\n| 13 | Brachialis                | 14 | Triceps brachii         |\n| 15 | Soleus                    |    |                         |\n\nEquipment:\n\n| ID | Equipment      |\n|----|----------------|\n| 1  | Barbell        |\n| 3  | Dumbbell       |\n| 4  | Gym mat        |\n| 5  | Swiss Ball     |\n| 6  | Pull-up bar    |\n| 7  | none (bodyweight) |\n| 8  | Bench          |\n| 9  | Incline bench  |\n| 10 | Kettlebell     |\n\n**Step 3 — Fetch and present results:**\n\n```bash\n# Search exercises by name\nQUERY=\"$1\"\nENCODED=$(python3 -c \"import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))\" \"$QUERY\")\ncurl -s \"https:\u002F\u002Fwger.de\u002Fapi\u002Fv2\u002Fexercise\u002Fsearch\u002F?term=${ENCODED}&language=english&format=json\" \\\n  | python3 -c \"\nimport json,sys\ndata=json.load(sys.stdin)\nfor s in data.get('suggestions',[])[:10]:\n    d=s.get('data',{})\n    print(f\\\"  ID {d.get('id','?'):>4} | {d.get('name','N\u002FA'):\u003C35} | Category: {d.get('category','N\u002FA')}\\\")\n\"\n```\n\n```bash\n# Get full details for a specific exercise\nEXERCISE_ID=\"$1\"\ncurl -s \"https:\u002F\u002Fwger.de\u002Fapi\u002Fv2\u002Fexerciseinfo\u002F${EXERCISE_ID}\u002F?format=json\" \\\n  | python3 -c \"\nimport json,sys,html,re\ndata=json.load(sys.stdin)\ntrans=[t for t in data.get('translations',[]) if t.get('language')==2]\nt=trans[0] if trans else data.get('translations',[{}])[0]\ndesc=re.sub('\u003C[^>]+>','',html.unescape(t.get('description','N\u002FA')))\nprint(f\\\"Exercise  : {t.get('name','N\u002FA')}\\\")\nprint(f\\\"Category  : {data.get('category',{}).get('name','N\u002FA')}\\\")\nprint(f\\\"Primary   : {', '.join(m.get('name_en','') for m in data.get('muscles',[])) or 'N\u002FA'}\\\")\nprint(f\\\"Secondary : {', '.join(m.get('name_en','') for m in data.get('muscles_secondary',[])) or 'none'}\\\")\nprint(f\\\"Equipment : {', '.join(e.get('name','') for e in data.get('equipment',[])) or 'bodyweight'}\\\")\nprint(f\\\"How to    : {desc[:500]}\\\")\nimgs=data.get('images',[])\nif imgs: print(f\\\"Image     : {imgs[0].get('image','')}\\\")\n\"\n```\n\n```bash\n# List exercises filtering by muscle, category, or equipment\n# Combine filters as needed: ?muscles=4&equipment=1&language=2&status=2\nFILTER=\"$1\"  # e.g. \"muscles=4\" or \"category=11\" or \"equipment=3\"\ncurl -s \"https:\u002F\u002Fwger.de\u002Fapi\u002Fv2\u002Fexercise\u002F?${FILTER}&language=2&status=2&limit=20&format=json\" \\\n  | python3 -c \"\nimport json,sys\ndata=json.load(sys.stdin)\nprint(f'Found {data.get(\\\"count\\\",0)} exercises.')\nfor ex in data.get('results',[]):\n    print(f\\\"  ID {ex['id']:>4} | muscles: {ex.get('muscles',[])} | equipment: {ex.get('equipment',[])}\\\")\n\"\n```\n\n### Nutrition Lookup (USDA FoodData Central)\n\nUses `USDA_API_KEY` env var if set, otherwise falls back to `DEMO_KEY`.\nDEMO_KEY = 30 requests\u002Fhour. Free signup key = 1,000 requests\u002Fhour.\n\n```bash\n# Search foods by name\nFOOD=\"$1\"\nAPI_KEY=\"${USDA_API_KEY:-DEMO_KEY}\"\nENCODED=$(python3 -c \"import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))\" \"$FOOD\")\ncurl -s \"https:\u002F\u002Fapi.nal.usda.gov\u002Ffdc\u002Fv1\u002Ffoods\u002Fsearch?api_key=${API_KEY}&query=${ENCODED}&pageSize=5&dataType=Foundation,SR%20Legacy\" \\\n  | python3 -c \"\nimport json,sys\ndata=json.load(sys.stdin)\nfoods=data.get('foods',[])\nif not foods: print('No foods found.'); sys.exit()\nfor f in foods:\n    n={x['nutrientName']:x.get('value','?') for x in f.get('foodNutrients',[])}\n    cal=n.get('Energy','?'); prot=n.get('Protein','?')\n    fat=n.get('Total lipid (fat)','?'); carb=n.get('Carbohydrate, by difference','?')\n    print(f\\\"{f.get('description','N\u002FA')}\\\")\n    print(f\\\"  Per 100g: {cal} kcal | {prot}g protein | {fat}g fat | {carb}g carbs\\\")\n    print(f\\\"  FDC ID: {f.get('fdcId','N\u002FA')}\\\")\n    print()\n\"\n```\n\n```bash\n# Detailed nutrient profile by FDC ID\nFDC_ID=\"$1\"\nAPI_KEY=\"${USDA_API_KEY:-DEMO_KEY}\"\ncurl -s \"https:\u002F\u002Fapi.nal.usda.gov\u002Ffdc\u002Fv1\u002Ffood\u002F${FDC_ID}?api_key=${API_KEY}\" \\\n  | python3 -c \"\nimport json,sys\nd=json.load(sys.stdin)\nprint(f\\\"Food: {d.get('description','N\u002FA')}\\\")\nprint(f\\\"{'Nutrient':\u003C40} {'Amount':>8} {'Unit'}\\\")\nprint('-'*56)\nfor x in sorted(d.get('foodNutrients',[]),key=lambda x:x.get('nutrient',{}).get('rank',9999)):\n    nut=x.get('nutrient',{}); amt=x.get('amount',0)\n    if amt and float(amt)>0:\n        print(f\\\"  {nut.get('name',''):\u003C38} {amt:>8} {nut.get('unitName','')}\\\")\n\"\n```\n\n### Offline Calculators\n\nUse the helper scripts in `scripts\u002F` for batch operations,\nor run inline for single calculations:\n\n- `python3 scripts\u002Fbody_calc.py bmi \u003Cweight_kg> \u003Cheight_cm>`\n- `python3 scripts\u002Fbody_calc.py tdee \u003Cweight_kg> \u003Cheight_cm> \u003Cage> \u003CM|F> \u003Cactivity 1-5>`\n- `python3 scripts\u002Fbody_calc.py 1rm \u003Cweight> \u003Creps>`\n- `python3 scripts\u002Fbody_calc.py macros \u003Ctdee_kcal> \u003Ccut|maintain|bulk>`\n- `python3 scripts\u002Fbody_calc.py bodyfat \u003CM|F> \u003Cneck_cm> \u003Cwaist_cm> [hip_cm] \u003Cheight_cm>`\n\nSee `references\u002FFORMULAS.md` for the science behind each formula.\n\n---\n\n## Pitfalls\n\n- wger exercise endpoint returns **all languages by default** — always add `language=2` for English\n- wger includes **unverified user submissions** — add `status=2` to only get approved exercises\n- USDA `DEMO_KEY` has **30 req\u002Fhour** — add `sleep 2` between batch requests or get a free key\n- USDA data is **per 100g** — remind users to scale to their actual portion size\n- BMI does not distinguish muscle from fat — high BMI in muscular people is not necessarily unhealthy\n- Body fat formulas are **estimates** (±3-5%) — recommend DEXA scans for precision\n- 1RM formulas lose accuracy above 10 reps — use sets of 3-5 for best estimates\n- wger's `exercise\u002Fsearch` endpoint uses `term` not `query` as the parameter name\n\n---\n\n## Verification\n\nAfter running exercise search: confirm results include exercise names, muscle groups, and equipment.\nAfter nutrition lookup: confirm per-100g macros are returned with kcal, protein, fat, carbs.\nAfter calculators: sanity-check outputs (e.g. TDEE should be 1500-3500 for most adults).\n\n---\n\n## Quick Reference\n\n| Task | Source | Endpoint |\n|------|--------|----------|\n| Search exercises by name | wger | `GET \u002Fapi\u002Fv2\u002Fexercise\u002Fsearch\u002F?term=&language=english` |\n| Exercise details | wger | `GET \u002Fapi\u002Fv2\u002Fexerciseinfo\u002F{id}\u002F` |\n| Filter by muscle | wger | `GET \u002Fapi\u002Fv2\u002Fexercise\u002F?muscles={id}&language=2&status=2` |\n| Filter by equipment | wger | `GET \u002Fapi\u002Fv2\u002Fexercise\u002F?equipment={id}&language=2&status=2` |\n| List categories | wger | `GET \u002Fapi\u002Fv2\u002Fexercisecategory\u002F` |\n| List muscles | wger | `GET \u002Fapi\u002Fv2\u002Fmuscle\u002F` |\n| Search foods | USDA | `GET \u002Ffdc\u002Fv1\u002Ffoods\u002Fsearch?query=&dataType=Foundation,SR Legacy` |\n| Food details | USDA | `GET \u002Ffdc\u002Fv1\u002Ffood\u002F{fdcId}` |\n| BMI \u002F TDEE \u002F 1RM \u002F macros | offline | `python3 scripts\u002Fbody_calc.py` |","# Fitness & Nutrition\n\nExpert fitness coach and sports nutritionist skill. Two data sources\nplus offline calculators — everything a gym-goer needs in one place.\n\n**Data sources (all free, no pip dependencies):**\n\n- **wger** (https:\u002F\u002Fwger.de\u002Fapi\u002Fv2\u002F) — open exercise database, 690+ exercises with muscles, equipment, images. Public endpoints need zero authentication.\n- **USDA FoodData Central** (https:\u002F\u002Fapi.nal.usda.gov\u002Ffdc\u002Fv1\u002F) — US government nutrition database, 380,000+ foods. `DEMO_KEY` works instantly; free signup for higher limits.\n\n**Offline calculators (pure stdlib Python):**\n\n- BMI, TDEE (Mifflin-St Jeor), one-rep max (Epley\u002FBrzycki\u002FLombardi), macro splits, body fat % (US Navy method)\n\n---\n\n## When to Use\n\nTrigger this skill when the user asks about:\n- Exercises, workouts, gym routines, muscle groups, workout splits\n- Food macros, calories, protein content, meal planning, calorie counting\n- Body composition: BMI, body fat, TDEE, caloric surplus\u002Fdeficit\n- One-rep max estimates, training percentages, progressive overload\n- Macro ratios for cutting, bulking, or maintenance\n\n---\n\n## Procedure\n\n### Exercise Lookup (wger API)\n\nAll wger public endpoints return JSON and require no auth. Always add\n`format=json` and `language=2` (English) to exercise queries.\n\n**Step 1 — Identify what the user wants:**\n\n- By muscle → use `\u002Fapi\u002Fv2\u002Fexercise\u002F?muscles={id}&language=2&status=2&format=json`\n- By category → use `\u002Fapi\u002Fv2\u002Fexercise\u002F?category={id}&language=2&status=2&format=json`\n- By equipment → use `\u002Fapi\u002Fv2\u002Fexercise\u002F?equipment={id}&language=2&status=2&format=json`\n- By name → use `\u002Fapi\u002Fv2\u002Fexercise\u002Fsearch\u002F?term={query}&language=english&format=json`\n- Full details → use `\u002Fapi\u002Fv2\u002Fexerciseinfo\u002F{exercise_id}\u002F?format=json`\n\n**Step 2 — Reference IDs (so you don't need extra API calls):**\n\nExercise categories:\n\n| ID | Category    |\n|----|-------------|\n| 8  | Arms        |\n| 9  | Legs        |\n| 10 | Abs         |\n| 11 | Chest       |\n| 12 | Back        |\n| 13 | Shoulders   |\n| 14 | Calves      |\n| 15 | Cardio      |\n\nMuscles:\n\n| ID | Muscle                    | ID | Muscle                  |\n|----|---------------------------|----|-------------------------|\n| 1  | Biceps brachii            | 2  | Anterior deltoid        |\n| 3  | Serratus anterior         | 4  | Pectoralis major        |\n| 5  | Obliquus externus         | 6  | Gastrocnemius           |\n| 7  | Rectus abdominis          | 8  | Gluteus maximus         |\n| 9  | Trapezius                 | 10 | Quadriceps femoris      |\n| 11 | Biceps femoris            | 12 | Latissimus dorsi        |\n| 13 | Brachialis                | 14 | Triceps brachii         |\n| 15 | Soleus                    |    |                         |\n\nEquipment:\n\n| ID | Equipment      |\n|----|----------------|\n| 1  | Barbell        |\n| 3  | Dumbbell       |\n| 4  | Gym mat        |\n| 5  | Swiss Ball     |\n| 6  | Pull-up bar    |\n| 7  | none (bodyweight) |\n| 8  | Bench          |\n| 9  | Incline bench  |\n| 10 | Kettlebell     |\n\n**Step 3 — Fetch and present results:**\n\n```bash\n# Search exercises by name\nQUERY=\"$1\"\nENCODED=$(python3 -c \"import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))\" \"$QUERY\")\ncurl -s \"https:\u002F\u002Fwger.de\u002Fapi\u002Fv2\u002Fexercise\u002Fsearch\u002F?term=${ENCODED}&language=english&format=json\" \\\n  | python3 -c \"\nimport json,sys\ndata=json.load(sys.stdin)\nfor s in data.get('suggestions',[])[:10]:\n    d=s.get('data',{})\n    print(f\\\"  ID {d.get('id','?'):>4} | {d.get('name','N\u002FA'):\u003C35} | Category: {d.get('category','N\u002FA')}\\\")\n\"\n```\n\n```bash\n# Get full details for a specific exercise\nEXERCISE_ID=\"$1\"\ncurl -s \"https:\u002F\u002Fwger.de\u002Fapi\u002Fv2\u002Fexerciseinfo\u002F${EXERCISE_ID}\u002F?format=json\" \\\n  | python3 -c \"\nimport json,sys,html,re\ndata=json.load(sys.stdin)\ntrans=[t for t in data.get('translations',[]) if t.get('language')==2]\nt=trans[0] if trans else data.get('translations',[{}])[0]\ndesc=re.sub('\u003C[^>]+>','',html.unescape(t.get('description','N\u002FA')))\nprint(f\\\"Exercise  : {t.get('name','N\u002FA')}\\\")\nprint(f\\\"Category  : {data.get('category',{}).get('name','N\u002FA')}\\\")\nprint(f\\\"Primary   : {', '.join(m.get('name_en','') for m in data.get('muscles',[])) or 'N\u002FA'}\\\")\nprint(f\\\"Secondary : {', '.join(m.get('name_en','') for m in data.get('muscles_secondary',[])) or 'none'}\\\")\nprint(f\\\"Equipment : {', '.join(e.get('name','') for e in data.get('equipment',[])) or 'bodyweight'}\\\")\nprint(f\\\"How to    : {desc[:500]}\\\")\nimgs=data.get('images',[])\nif imgs: print(f\\\"Image     : {imgs[0].get('image','')}\\\")\n\"\n```\n\n```bash\n# List exercises filtering by muscle, category, or equipment\n# Combine filters as needed: ?muscles=4&equipment=1&language=2&status=2\nFILTER=\"$1\"  # e.g. \"muscles=4\" or \"category=11\" or \"equipment=3\"\ncurl -s \"https:\u002F\u002Fwger.de\u002Fapi\u002Fv2\u002Fexercise\u002F?${FILTER}&language=2&status=2&limit=20&format=json\" \\\n  | python3 -c \"\nimport json,sys\ndata=json.load(sys.stdin)\nprint(f'Found {data.get(\\\"count\\\",0)} exercises.')\nfor ex in data.get('results',[]):\n    print(f\\\"  ID {ex['id']:>4} | muscles: {ex.get('muscles',[])} | equipment: {ex.get('equipment',[])}\\\")\n\"\n```\n\n### Nutrition Lookup (USDA FoodData Central)\n\nUses `USDA_API_KEY` env var if set, otherwise falls back to `DEMO_KEY`.\nDEMO_KEY = 30 requests\u002Fhour. Free signup key = 1,000 requests\u002Fhour.\n\n```bash\n# Search foods by name\nFOOD=\"$1\"\nAPI_KEY=\"${USDA_API_KEY:-DEMO_KEY}\"\nENCODED=$(python3 -c \"import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))\" \"$FOOD\")\ncurl -s \"https:\u002F\u002Fapi.nal.usda.gov\u002Ffdc\u002Fv1\u002Ffoods\u002Fsearch?api_key=${API_KEY}&query=${ENCODED}&pageSize=5&dataType=Foundation,SR%20Legacy\" \\\n  | python3 -c \"\nimport json,sys\ndata=json.load(sys.stdin)\nfoods=data.get('foods',[])\nif not foods: print('No foods found.'); sys.exit()\nfor f in foods:\n    n={x['nutrientName']:x.get('value','?') for x in f.get('foodNutrients',[])}\n    cal=n.get('Energy','?'); prot=n.get('Protein','?')\n    fat=n.get('Total lipid (fat)','?'); carb=n.get('Carbohydrate, by difference','?')\n    print(f\\\"{f.get('description','N\u002FA')}\\\")\n    print(f\\\"  Per 100g: {cal} kcal | {prot}g protein | {fat}g fat | {carb}g carbs\\\")\n    print(f\\\"  FDC ID: {f.get('fdcId','N\u002FA')}\\\")\n    print()\n\"\n```\n\n```bash\n# Detailed nutrient profile by FDC ID\nFDC_ID=\"$1\"\nAPI_KEY=\"${USDA_API_KEY:-DEMO_KEY}\"\ncurl -s \"https:\u002F\u002Fapi.nal.usda.gov\u002Ffdc\u002Fv1\u002Ffood\u002F${FDC_ID}?api_key=${API_KEY}\" \\\n  | python3 -c \"\nimport json,sys\nd=json.load(sys.stdin)\nprint(f\\\"Food: {d.get('description','N\u002FA')}\\\")\nprint(f\\\"{'Nutrient':\u003C40} {'Amount':>8} {'Unit'}\\\")\nprint('-'*56)\nfor x in sorted(d.get('foodNutrients',[]),key=lambda x:x.get('nutrient',{}).get('rank',9999)):\n    nut=x.get('nutrient',{}); amt=x.get('amount',0)\n    if amt and float(amt)>0:\n        print(f\\\"  {nut.get('name',''):\u003C38} {amt:>8} {nut.get('unitName','')}\\\")\n\"\n```\n\n### Offline Calculators\n\nUse the helper scripts in `scripts\u002F` for batch operations,\nor run inline for single calculations:\n\n- `python3 scripts\u002Fbody_calc.py bmi \u003Cweight_kg> \u003Cheight_cm>`\n- `python3 scripts\u002Fbody_calc.py tdee \u003Cweight_kg> \u003Cheight_cm> \u003Cage> \u003CM|F> \u003Cactivity 1-5>`\n- `python3 scripts\u002Fbody_calc.py 1rm \u003Cweight> \u003Creps>`\n- `python3 scripts\u002Fbody_calc.py macros \u003Ctdee_kcal> \u003Ccut|maintain|bulk>`\n- `python3 scripts\u002Fbody_calc.py bodyfat \u003CM|F> \u003Cneck_cm> \u003Cwaist_cm> [hip_cm] \u003Cheight_cm>`\n\nSee `references\u002FFORMULAS.md` for the science behind each formula.\n\n---\n\n## Pitfalls\n\n- wger exercise endpoint returns **all languages by default** — always add `language=2` for English\n- wger includes **unverified user submissions** — add `status=2` to only get approved exercises\n- USDA `DEMO_KEY` has **30 req\u002Fhour** — add `sleep 2` between batch requests or get a free key\n- USDA data is **per 100g** — remind users to scale to their actual portion size\n- BMI does not distinguish muscle from fat — high BMI in muscular people is not necessarily unhealthy\n- Body fat formulas are **estimates** (±3-5%) — recommend DEXA scans for precision\n- 1RM formulas lose accuracy above 10 reps — use sets of 3-5 for best estimates\n- wger's `exercise\u002Fsearch` endpoint uses `term` not `query` as the parameter name\n\n---\n\n## Verification\n\nAfter running exercise search: confirm results include exercise names, muscle groups, and equipment.\nAfter nutrition lookup: confirm per-100g macros are returned with kcal, protein, fat, carbs.\nAfter calculators: sanity-check outputs (e.g. TDEE should be 1500-3500 for most adults).\n\n---\n\n## Quick Reference\n\n| Task | Source | Endpoint |\n|------|--------|----------|\n| Search exercises by name | wger | `GET \u002Fapi\u002Fv2\u002Fexercise\u002Fsearch\u002F?term=&language=english` |\n| Exercise details | wger | `GET \u002Fapi\u002Fv2\u002Fexerciseinfo\u002F{id}\u002F` |\n| Filter by muscle | wger | `GET \u002Fapi\u002Fv2\u002Fexercise\u002F?muscles={id}&language=2&status=2` |\n| Filter by equipment | wger | `GET \u002Fapi\u002Fv2\u002Fexercise\u002F?equipment={id}&language=2&status=2` |\n| List categories | wger | `GET \u002Fapi\u002Fv2\u002Fexercisecategory\u002F` |\n| List muscles | wger | `GET \u002Fapi\u002Fv2\u002Fmuscle\u002F` |\n| Search foods | USDA | `GET \u002Ffdc\u002Fv1\u002Ffoods\u002Fsearch?query=&dataType=Foundation,SR Legacy` |\n| Food details | USDA | `GET \u002Ffdc\u002Fv1\u002Ffood\u002F{fdcId}` |\n| BMI \u002F TDEE \u002F 1RM \u002F macros | offline | `python3 scripts\u002Fbody_calc.py` |",{"name":5,"authors":43,"license":14,"version":45,"metadata":46,"description":57,"required_environment_variables":58},[44],"haileymarshall","1.0.0",{"hermes":47},{"tags":48,"category":49,"prerequisites":53},[49,18,19,50,51,52,33],"health","gym","workout","diet",{"commands":54},[55,56],"curl","python3","Gym workout planner and nutrition tracker. Search 690+ exercises by muscle, equipment, or category via wger. Look up macros and calories for 380,000+ foods via USDA FoodData Central. Compute BMI, TDEE, one-rep max, macro splits, and body fat — pure Python, no pip installs. Built for anyone chasing gains, cutting weight, or just trying to eat better.\n",[59],{"help":60,"name":61,"prompt":62,"optional":63,"required_for":64},"Get one free at https:\u002F\u002Ffdc.nal.usda.gov\u002Fapi-key-signup\u002F — or skip to use DEMO_KEY with lower rate limits","USDA_API_KEY","USDA FoodData Central API key (free)",true,"higher rate limits on food\u002Fnutrition lookups (DEMO_KEY works without signup)","main","6746276ba18cb774853eb61b3b9399658bc9bc5c","core\u002Fhermes-agent\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch","2026-04-28 17:01:03",{"source":8,"skillName":5,"commands":72,"prompt":82,"zipAvailable":63},[73,76,79],{"tool":74,"command":75},"npx","npx skills add gjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN --skill fitness-nutrition",{"tool":77,"command":78},"bunx","bunx skills add gjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN --skill fitness-nutrition",{"tool":80,"command":81},"pnpm","pnpm dlx skills add gjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN --skill fitness-nutrition","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fhermes-agent\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition\u002FSKILL.md",[84,90,96],{"path":85,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":88,"sourceHtmlUrl":89},"references\u002FFORMULAS.md","REFERENCE","参考文档",3234,"https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fhermes-agent\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition\u002Freferences\u002FFORMULAS.md",{"path":91,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":94,"sourceHtmlUrl":95},"scripts\u002Fbody_calc.py","SCRIPT","脚本",6430,"https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fhermes-agent\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition\u002Fscripts\u002Fbody_calc.py",{"path":97,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":98,"sourceHtmlUrl":99},"scripts\u002Fnutrition_search.py",2661,"https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fhermes-agent\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition\u002Fscripts\u002Fnutrition_search.py",[101,144,169,186,205,224],{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":123,"publishedAt":38},"01M71QG27G1R2H2ZWEG4S0WTZT","writing-plans","Write implementation plans: bite-sized tasks, paths, code.","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Fwriting-plans\u002FSKILL.md",[107,112,115,120],{"categoryNo":108,"categoryName":109,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",{"categoryNo":113,"categoryName":114,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":121,"categoryName":122,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000036","内容创作者",[124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143],"writing","writing plans","plans","test-driven","test-driven-development","superpowers","design","workflow","code","tasks","subagent","code-review","review","documentation","write","paths","planning","development","test","implementation",{"skillNo":145,"name":128,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":155,"publishedAt":38},"01M71QFZYRTJXMAE551MRAKZ14","TDD: enforce RED-GREEN-REFACTOR, tests before code.","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Ftest-driven-development\u002FSKILL.md",[149,152],{"categoryNo":150,"categoryName":151,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":153,"categoryName":154,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000008","测试与质量",[156,141,142,157,158,159,160,129,124,161,132,134,162,163,164,165,166,126,167,168],"test driven development","driven","green","red-green-refactor","testing","debugging","systematic","refactor","systematic-debugging","enforce","tests","tdd","quality",{"skillNo":170,"name":164,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":175,"publishedAt":38},"01M71QFWR5Q8EYEQ6MCS3SM6MC","4-phase root cause debugging: understand bugs before fixing.","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Fsystematic-debugging\u002FSKILL.md",[174],{"categoryNo":153,"categoryName":154,"taxonomyType":110,"taxonomyTypeDesc":111},[176,161,162,127,177,178,128,129,124,134,179,180,141,181,126,182,142,183,184,185],"systematic debugging","problem","problem-solving","phase","bugs","root cause","root-cause","investigation","understand","hermes",{"skillNo":187,"name":188,"nameZh":6,"description":189,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":190,"categories":191,"keywords":197,"publishedAt":38},"01M71QFS9S04MD8JP747W5WM0N","subagent-driven-development","Execute plans via delegate_task subagents (2-stage review).","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Fsubagent-driven-development\u002FSKILL.md",[192,193,196],{"categoryNo":113,"categoryName":114,"taxonomyType":110,"taxonomyTypeDesc":111},{"categoryNo":194,"categoryName":195,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":121,"categoryName":122,"taxonomyType":118,"taxonomyTypeDesc":119},[198,134,141,157,127,128,199,200,129,124,131,132,135,136,201,202,126,203,204,142],"subagent driven development","delegate","delegation","subagents","parallel","stage","task",{"skillNo":206,"name":207,"nameZh":6,"description":208,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":209,"categories":210,"keywords":213,"publishedAt":38},"01M71QFQ1DBCVAZ511MXFE6T2V","requesting-code-review","Pre-commit review: security scan, quality gates, auto-fix.","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Frequesting-code-review\u002FSKILL.md",[211,212],{"categoryNo":150,"categoryName":151,"taxonomyType":110,"taxonomyTypeDesc":111},{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},[214,215,132,136,127,128,216,217,129,218,124,219,220,134,135,221,222,141,223,126],"code review","requesting code review","fix","auto-fix","auto","security scan","commit","verification","security","scan",{"skillNo":225,"name":226,"nameZh":6,"description":227,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":228,"categories":229,"keywords":231,"publishedAt":38},"01M71QFM7KWM540YR67FRN807Q","python-debugpy","Debug Python: pdb REPL + debugpy remote (DAP).","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Fpython-debugpy\u002FSKILL.md",[230],{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},[232,233,234,235,236,237,238,239,161,162,240,241,242,164,243,244,245,246,185,247],"debugpy","python debugpy","python","dap","inspect","post-mortem","pdb","remote","debugger","node","commands","debug","post","breakpoints","node-inspect","tui"]