[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7CTQKMXJ2RGF0ZDWNKMTSD8":3,"skill-same:01M7CTQKMXJ2RGF0ZDWNKMTSD8":87},{"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":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":13,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":57,"install":58,"resources":70},"01M7CTQKMXJ2RGF0ZDWNKMTSD8","fitness-nutrition",null,"Workout planning, macros, and body metrics via wger\u002FUSDA.","dwikanugraha13\u002FProject-Anara","dwikanugraha13","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F63535036?v=4","01M7CTBN0DG8GDNP4QZ68W8M0A","01M7CTBN10Q015JDBYJS6AJRGN",0,"MIT","https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: fitness-nutrition\ndescription: \"Workout planning, macros, and body metrics via wger\u002FUSDA.\"\nplatforms: [linux, macos, windows]\nversion: 1.0.0\nauthor: Hailey Marshall (haileymarshall), Anara Agent\nauthors:\n  - haileymarshall\nlicense: MIT\nmetadata:\n  anara:\n    tags: [health, fitness, nutrition, gym, workout, diet, exercise]\n    category: health\n    prerequisites:\n      commands: [curl, python]\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=$(python -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  | python -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  | python -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  | python -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=$(python -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  | python -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  | python -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- `python scripts\u002Fbody_calc.py bmi \u003Cweight_kg> \u003Cheight_cm>`\n- `python scripts\u002Fbody_calc.py tdee \u003Cweight_kg> \u003Cheight_cm> \u003Cage> \u003CM|F> \u003Cactivity 1-5>`\n- `python scripts\u002Fbody_calc.py 1rm \u003Cweight> \u003Creps>`\n- `python scripts\u002Fbody_calc.py macros \u003Ctdee_kcal> \u003Ccut|maintain|bulk>`\n- `python 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 | `python 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=$(python -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  | python -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  | python -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  | python -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=$(python -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  | python -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  | python -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- `python scripts\u002Fbody_calc.py bmi \u003Cweight_kg> \u003Cheight_cm>`\n- `python scripts\u002Fbody_calc.py tdee \u003Cweight_kg> \u003Cheight_cm> \u003Cage> \u003CM|F> \u003Cactivity 1-5>`\n- `python scripts\u002Fbody_calc.py 1rm \u003Cweight> \u003Creps>`\n- `python scripts\u002Fbody_calc.py macros \u003Ctdee_kcal> \u003Ccut|maintain|bulk>`\n- `python 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 | `python scripts\u002Fbody_calc.py` |",{"name":5,"author":23,"authors":24,"license":14,"version":26,"metadata":27,"platforms":41,"description":7,"required_environment_variables":45},"Hailey Marshall (haileymarshall), Anara Agent",[25],"haileymarshall","1.0.0",{"anara":28},{"tags":29,"category":30,"prerequisites":37},[30,31,32,33,34,35,36],"health","fitness","nutrition","gym","workout","diet","exercise",{"commands":38},[39,40],"curl","python",[42,43,44],"linux","macos","windows",[46],{"help":47,"name":48,"prompt":49,"optional":50,"required_for":51},"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","3e6d6b7ffb6ab43ddf3991509e5cfb5f8c90cd1a","backend\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition","https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara","https:\u002F\u002Fgithub.com\u002Fdwikanugraha13","2026-10-13 07:57:21",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":50},[60,63,66],{"tool":61,"command":62},"npx","npx skills add dwikanugraha13\u002FProject-Anara --skill fitness-nutrition",{"tool":64,"command":65},"bunx","bunx skills add dwikanugraha13\u002FProject-Anara --skill fitness-nutrition",{"tool":67,"command":68},"pnpm","pnpm dlx skills add dwikanugraha13\u002FProject-Anara --skill fitness-nutrition","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition\u002FSKILL.md",[71,77,83],{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002FFORMULAS.md","REFERENCE","参考文档",3234,"https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition\u002Freferences\u002FFORMULAS.md",{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"scripts\u002Fbody_calc.py","SCRIPT","脚本",6425,"https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition\u002Fscripts\u002Fbody_calc.py",{"path":84,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":85,"sourceHtmlUrl":86},"scripts\u002Fnutrition_search.py",2641,"https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Foptional-skills\u002Fhealth\u002Ffitness-nutrition\u002Fscripts\u002Fnutrition_search.py",[88,95,102,110,117,124],{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":18},"01M7CVK8W5MPQ8H45A6XE6RPK1","youtube-content","YouTube transcripts to summaries, threads, blogs.","https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fyoutube-content\u002FSKILL.md",[],[],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":18},"01M7CVK56KG9399ZZVE9KM54WS","xurl","X\u002FTwitter via xurl CLI: raw post search, posting, DM, media.","https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fxurl\u002FSKILL.md",[],[],{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":106,"sourceHtmlUrl":107,"categories":108,"keywords":109,"publishedAt":18},"01M7CVK22A44A88NPPBAC1FVQP","xlsx","Create, read, edit Excel .xlsx workbooks and CSVs.","https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fxlsx\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fxlsx\u002FSKILL.md",[],[],{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":18},"01M7CVJX88C8PY2T6RQZ5GCG15","weights-and-biases","W&B: log ML experiments, sweeps, model registry, dashboards.","https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fweights-and-biases\u002FSKILL.md",[],[],{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":18},"01M7CVJR3W1FBRGC56DG6BJ1Y3","weekly-review-planning","Weekly reset: commitments, stalled work, next-week plan.","https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fweekly-review-planning\u002FSKILL.md",[],[],{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":18},"01M7CVJGPJNPQDM8S1KTTMJN7M","touchdesigner-mcp","Control TouchDesigner via twozero MCP.","https:\u002F\u002Fgithub.com\u002Fdwikanugraha13\u002FProject-Anara\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Ftouchdesigner-mcp\u002FSKILL.md",[],[]]