{"id":"9066777a-91a0-4ee4-8f36-bef7bc0227bb","entityType":"agent","slug":"clawhub-dsdevq-workout-claw","name":"workout-claw","canonicalUrl":"https://www.xpersona.co/agent/clawhub-dsdevq-workout-claw","canonicalPath":"/agent/clawhub-dsdevq-workout-claw","generatedAt":"2026-10-11T21:50:03.825Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T18:49:02.002Z","emptyReason":null},"description":"Log workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage. Skill: workout-claw Owner: dsdevq Summary: Log workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage. Tags: latest:0.4.0 Version history: v0.4.0 | 2026-10-07T17:54:28.751Z | user 0.4.0: fail loudly on corrupt data, relax log parsing, harden dates. See CHANGELOG. v0.3.1 | 2026-07-20T12:35:04.081Z | user Fix exercise-map gap (barbell-press now maps to chest, not other);","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s177jmn4gkw8e27mftkpmvb7t186rwyf:workout-claw","sourceUrl":"https://clawhub.ai/dsdevq/workout-claw","homepage":"https://clawhub.ai/dsdevq/skills/workout-claw","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/dsdevq/workout-claw","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/dsdevq/skills/workout-claw","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Log workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage. Skill: workout-claw Owner: dsdevq Summary: Log worko"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T18:49:02.002Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T18:49:02.002Z","emptyReason":null},"stars":null,"forks":null,"downloads":1007,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"0.4.0","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T18:49:01.934Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T18:49:02.002Z","lastCrawledAt":"2026-10-11T18:49:01.934Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T18:49:01.934Z","lastVerifiedAt":null,"highlights":[{"version":"0.4.0","createdAt":"2026-10-07T17:54:28.751Z","changelog":"0.4.0: fail loudly on corrupt data, relax log parsing, harden dates. See CHANGELOG.","fileCount":5,"zipByteSize":8634},{"version":"0.3.1","createdAt":"2026-07-20T12:35:04.081Z","changelog":"Fix exercise-map gap (barbell-press now maps to chest, not other); requires.bins gating so OpenClaw blocks the skill until the CLI is on PATH; CLI now published to npm (npm i -g workout-claw); 19-test suite; source moved to github.com/dsdevq/lifekit-health","fileCount":6,"zipByteSize":8978},{"version":"0.3.0","createdAt":"2026-05-15T18:43:44.365Z","changelog":"- Added new `volume` command for cross-day muscle volume tracking, aggregating volume per exercise (not session). - Clarified difference between `volume --muscle X` (preferred for weekly volume tracking) and `history --muscle X`. - Expanded and refined CLI invocation examples and flags, including support for logging cardio and custom session notes. - Updated agent/usage guidance, emphasizing correct trigger behavior and input normalization for exercise names. - Improved documentation on session editing (`edit` command), with caution for Telegram/integrated agent usage. - General documentation and clarity improvements throughout the SKILL.md.","fileCount":3,"zipByteSize":3780}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s177jmn4gkw8e27mftkpmvb7t186rwyf:workout-claw","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dsdevq-workout-claw/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dsdevq-workout-claw/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dsdevq-workout-claw/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dsdevq-workout-claw/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dsdevq-workout-claw/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dsdevq-workout-claw/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T21:50:03.823Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dsdevq-workout-claw/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dsdevq-workout-claw/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dsdevq-workout-claw/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dsdevq-workout-claw/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T18:49:02.002Z","emptyReason":null},"readme":"Skill: workout-claw\n\nOwner: dsdevq\n\nSummary: Log workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage.\n\nTags: latest:0.4.0\n\nVersion history:\n\nv0.4.0 | 2026-10-07T17:54:28.751Z | user\n\n0.4.0: fail loudly on corrupt data, relax log parsing, harden dates. See CHANGELOG.\n\nv0.3.1 | 2026-07-20T12:35:04.081Z | user\n\nFix exercise-map gap (barbell-press now maps to chest, not other); requires.bins gating so OpenClaw blocks the skill until the CLI is on PATH; CLI now published to npm (npm i -g workout-claw); 19-test suite; source moved to github.com/dsdevq/lifekit-health\n\nv0.3.0 | 2026-05-15T18:43:44.365Z | auto\n\n- Added new `volume` command for cross-day muscle volume tracking, aggregating volume per exercise (not session).\n- Clarified difference between `volume --muscle X` (preferred for weekly volume tracking) and `history --muscle X`.\n- Expanded and refined CLI invocation examples and flags, including support for logging cardio and custom session notes.\n- Updated agent/usage guidance, emphasizing correct trigger behavior and input normalization for exercise names.\n- Improved documentation on session editing (`edit` command), with caution for Telegram/integrated agent usage.\n- General documentation and clarity improvements throughout the SKILL.md.\n\nArchive index:\n\nArchive v0.4.0: 5 files, 8634 bytes\n\nFiles: LICENSE (1069b), README.md (7518b), skill-card.md (1960b), SKILL.md (6009b), _meta.json (131b)\n\nFile v0.4.0:SKILL.md\n\n---\nname: workout-claw\ndescription: Log workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage.\nauthor: Denys Sychov\nversion: 0.3.1\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"workout-claw\"]}}}\ntriggers:\n  - \"log workout\"\n  - \"log my workout\"\n  - \"track exercise\"\n  - \"gym session\"\n  - \"what's my PR\"\n  - \"what is my PR\"\n  - \"workout history\"\n  - \"lift history\"\n  - \"today's workout\"\n  - \"last workout\"\n  - \"show last session\"\n  - \"delete workout\"\n  - \"remove session\"\n  - \"edit workout\"\n  - \"fix my workout\"\n  - \"back volume\"\n  - \"chest volume\"\n  - \"leg volume\"\n  - \"how much volume\"\n  - \"muscle volume\"\n  - \"weekly volume\"\n---\n\n# workout-claw\n\nLocal-first gym workout tracker. Plain-JSON storage at `~/.workout-claw/`. Invokable as a CLI by an agent — no MCP server, no daemon.\n\n## Setup\n\nThis skill ships a SKILL.md manifest via ClawHub, but the `workout-claw` CLI binary lives on npm. Both layers are required.\n\n```bash\nopenclaw skills install workout-claw    # installs this SKILL.md\nnpm install -g workout-claw             # installs the CLI binary\n```\n\nRequires Node >= 20. Once both are installed, the CLI is on PATH and other skills can invoke it.\n\n## When to invoke\n\nUser describes a workout session, asks about progress, or wants to see a PR. Examples that should trigger this skill:\n\n- \"I just did chest day — bench 4x10 at 60, incline DB 4x12 at 20, triceps 4x12 at 40\"\n- \"Log today's workout\"\n- \"What's my bench PR?\"\n- \"Show my back workouts from the last 4 weeks\"\n- \"What did I do at the gym today?\"\n\n## How to invoke\n\nUse the `workout-claw` CLI via Bash. All commands output YAML to stdout, errors to stderr.\n\n### Log a workout\n\n```bash\nworkout-claw log \"bench 4x10@60, incline-db-press 4x12@20, triceps-pushdown 4x12@40\"\n```\n\nOptional flags:\n- `--muscle <group>` — `back | legs | chest | shoulders | arms | core | full | cardio | other`. If omitted, inferred from the exercises (most sets wins; a tie is `full`; cardio-only is `cardio`), unless the user has an optional `~/.workout-claw/config.json` weekday split (`{\"split\":{\"mon\":\"back\",\"wed\":\"legs\"}}`), which then applies on those days.\n- `--cardio \"<entry>\"` — e.g. `\"incline-walk 20min @4.5kmh i6\"` (minutes, speed kmh, incline)\n- `--note \"<text>\"` — free-text note\n- `--date YYYY-MM-DD` — date to log under (default: today in local time). Pass it explicitly when the user logs a past session or it is just after midnight. Anything that is not a real date is rejected.\n- `--time HH:MM` — override time\n\n### Input syntax\n\n`<exercise> <sets>x<reps>@<weight>` per entry, comma-separated for multiple exercises. Also accepted: a `kg`/`lb` suffix (`bench 3x8@60kg`, lb is stored as kg), spaces in names (`bench press 3x8@60`), and uneven sets: `bench 8,8,6@60` (per-set reps, one weight) or `bench 8@60,6@65` (per-set reps and weights).\n\n- Multi-word exercise names use dashes: `incline-db-press`, `barbell-row`\n- Bodyweight: `pullups 4x10@bw`\n- All weights in kg\n\n### Query history\n\n```bash\nworkout-claw history --muscle chest --weeks 4\nworkout-claw history --exercise bench\n```\n\n### Get a PR\n\n```bash\nworkout-claw pr bench\n```\n\nReturns best estimated 1RM via Epley formula: `weight × (1 + reps/30)`.\n\n### Cross-day muscle volume (v0.3+)\n\n```bash\nworkout-claw volume --muscle back --weeks 4\nworkout-claw volume --muscle chest --weeks 8\n```\n\nAggregates volume **per exercise**, not per session. Pullups on chest day count toward `back` volume; triceps-pushdown counts toward `arms`. Returns total kg lifted, sets, reps, days trained, and a per-date breakdown.\n\n**This is the right query for tracking weekly volume per muscle group** — far more accurate than `history --muscle X` which is session-grain.\n\n### Summary of today\n\n```bash\nworkout-claw summary\nworkout-claw summary --date 2026-05-15\n```\n\n### Most recent session\n\n```bash\nworkout-claw last\n```\n\nReturns the latest session across all dates — useful for \"what did I do at the gym?\" without naming a date.\n\n### Delete a session\n\n```bash\nworkout-claw delete <session-id>\n```\n\nSession IDs come from the `id` field in any `log` / `summary` / `last` output. No confirmation prompt — the CLI is non-interactive by design.\n\n### Edit a session\n\n```bash\nworkout-claw edit <session-id>\n```\n\nOpens the session JSON in `$EDITOR` (defaults to `vi`). On save: validates JSON, refuses to save if the `id` was changed. On parse error: original session unchanged. Useful for fixing typos in exercise names or set counts without a full delete + re-log.\n\n**Agent note:** `edit` requires an interactive editor, so the agent should not invoke this in a Telegram round-trip. Instead, when a user asks to fix a logged workout via Telegram, prefer `delete` + `log` again, or hand back the session ID and tell the user to run `workout-claw edit <id>` from their terminal.\n\n## Data location\n\n- `~/.workout-claw/logs/<date>.json` — one JSON file per day, array of sessions\n- Schema: see `src/lib/types.ts` in the workout-claw repo\n\n## Notes for the agent\n\n- After logging, relay the YAML summary back to the user in a readable form (don't dump raw YAML)\n- Exercise names may contain spaces or dashes (stored with dashes), so pass the user's wording through (\"incline DB press\" → `incline-db-press`)\n- If the CLI reports `corrupt JSON`, stop and tell the user: the file is left untouched, and nothing was logged. Do not retry or recreate it.\n- Session-level `--muscle` is inferred from the exercises — only set explicitly if the user names a split that differs from what was lifted. **Per-exercise muscle tags are inferred automatically** at log time via name lookup (pullups→back, bench→chest, etc.), so no extra input is needed.\n- When user describes cardio separately, use `--cardio` flag. When they describe both lifting + cardio in one breath, use both.\n- For \"how much back/chest/leg volume?\" questions, prefer **`volume --muscle X`** over `history --muscle X` — volume aggregates per-exercise, history filters per-session.\n\nFile v0.4.0:README.md\n\n# workout-claw\n\n> Local-first gym workout tracker. CLI + skill manifest, designed for LLM agent invocation. No cloud account, no daemon, no DB.\n\n`workout-claw` is a tiny CLI that logs gym sessions to plain JSON files on disk. It's built to be invoked by an LLM agent (Claude, GPT, etc.) through a SKILL.md contract — but it's perfectly usable from a terminal directly. Sister project to [`nutrition-claw`](https://github.com/Pita/nutrition-claw).\n\n## 30-second demo\n\n```bash\n$ workout-claw log \"pullups 4x10@bw, incline-db-press 4x12@20, bench 4x10@60, triceps-pushdown 4x12@40\" --cardio \"incline-walk 20min @4.5kmh i6\"\n\nlogged:\n  date: 2026-05-15\n  session_id: MWDxpbQE\n  muscle_group: chest\n  time: 17:00\n  exercises_count: 4\n  total_sets: 16\n  total_volume_kg: 5280\nexercises:\n  - name: pullups\n    muscle: back              # ← auto-tagged per-exercise, not just session-level\n    sets: 4\n    reps_per_set: 10\n    weight: bw\n  - name: bench\n    muscle: chest\n    sets: 4\n    reps_per_set: 10\n    weight: 60\n  ...\n```\n\n```bash\n$ workout-claw pr bench\nexercise: bench\nestimated_1rm_kg: 80           # ← Epley: 60 kg × (1 + 10/30)\nfrom_set:\n  date: 2026-05-15\n  weight_kg: 60\n  reps: 10\n\n$ workout-claw volume --muscle back --weeks 4\nmuscle: back\ntotals:\n  volume_kg: 0                 # ← bodyweight contributes 0 to kg volume (v0.4 will fix)\n  sets: 4\n  reps: 40\n  days_trained: 1              # ← pullups on chest day correctly counted as back work\n```\n\n## Why it exists\n\nThe [`workout-logger`](https://clawhub.ai/skills/workout-logger) skill on ClawHub describes a beautiful conversational UX for logging workouts — but it's a stub. No CLI, no datastore, no PR tracking. Your workouts land as plain-text journal entries you can't query.\n\n`workout-claw` is the missing implementation: it gives the agent a real backing CLI to invoke, with structured JSON storage you can `cat`, `jq`, or `git diff`. The agent handles natural-language input (\"log my chest workout: bench four sets of ten at 60\"); the CLI handles deterministic state.\n\nThis is the same split you find with `nutrition-claw`: the skill manifest is the contract, the CLI is the engine, plain JSON is the source of truth.\n\n## Install\n\n```bash\ngit clone <repo>\ncd workout-claw\nnpm install\nnpm run build\nnpm link                       # symlinks workout-claw to your PATH\n```\n\nRequires Node ≥ 20.\n\nFor OpenClaw integration:\n\n```bash\nmkdir -p ~/.openclaw/workspace/skills/workout-claw\ncp SKILL.md ~/.openclaw/workspace/skills/workout-claw/SKILL.md\nsystemctl --user restart openclaw-gateway.service\n```\n\n(Symlinks are rejected as a security measure — copy the file. `npm run openclaw:sync` does this in one command.)\n\n## Commands\n\n```\nworkout-claw log <exercises>           # parse fitdown-style input, append session\nworkout-claw history [--muscle X] [--exercise Y] [--weeks N]\nworkout-claw pr <exercise>             # Epley 1RM estimate\nworkout-claw volume --muscle X [--weeks N]   # cross-day volume rollup\nworkout-claw summary [--date YYYY-MM-DD]\nworkout-claw last                      # most recent session across all dates\nworkout-claw delete <session-id>\nworkout-claw edit <session-id>         # opens session JSON in $EDITOR\n```\n\n### Input syntax (fitdown-inspired)\n\n```\n<exercise> <sets>x<reps>@<weight>\n```\n\n- Multi-word exercise names use dashes (`incline-db-press`) or spaces (`bench press`; stored with dashes)\n- Bodyweight: `pullups 4x10@bw`\n- Unit suffix: `bench 3x8@60kg` or `bench 3x8@135lb` (lb is converted and stored as kg)\n- Uneven sets: `bench 8,8,6@60` (per-set reps, one weight) or `bench 8@60,6@65` (per-set reps and weights)\n- Multiple exercises in one call: comma-separated\n\nExamples:\n\n```bash\nworkout-claw log \"squat 5x5@100, leg-press 4x10@200, leg-curl 3x12@40\" --muscle legs\nworkout-claw log \"deadlift 1x5@140\" --note \"PR attempt — felt strong\"\nworkout-claw log \"\" --cardio \"run 5km 24min\"     # cardio-only session\n```\n\n### Optional flags on `log`\n\n| Flag | Meaning |\n|---|---|\n| `--muscle <g>` | back \\| legs \\| chest \\| shoulders \\| arms \\| core \\| cardio (default: inferred from the exercises, or from the optional weekday split in `~/.workout-claw/config.json`) |\n| `--cardio \"<entry>\"` | e.g. `\"incline-walk 20min @4.5kmh i6\"` — minutes, speed, incline |\n| `--note \"<text>\"` | free-text annotation |\n| `--date YYYY-MM-DD` | date to log under (default: today, local time; invalid dates are rejected) |\n| `--time HH:MM` | override (default: now) |\n\n### Optional weekday split\n\nBy default the session's muscle group is inferred from the exercises you logged (most sets wins). If you follow a fixed split, create `~/.workout-claw/config.json`:\n\n```json\n{ \"split\": { \"mon\": \"back\", \"wed\": \"legs\", \"fri\": \"chest\" } }\n```\n\nOn those weekdays the configured group is used; `--muscle` always wins. No split ships with the package.\n\n## Data safety\n\nDay files are written to a temp file and renamed into place, so a crash cannot leave a half-written log. A day file that is not valid JSON is never treated as empty: commands fail with a `corrupt JSON` error and leave the file untouched.\n\n## Data shape\n\nOne JSON file per day at `~/.workout-claw/logs/YYYY-MM-DD.json`. Array of sessions (typically one per day, but multi-session days are supported).\n\n```json\n[\n  {\n    \"id\": \"MWDxpbQE\",\n    \"time\": \"17:00\",\n    \"muscle_group\": \"chest\",\n    \"exercises\": [\n      {\n        \"name\": \"bench\",\n        \"muscle\": \"chest\",\n        \"sets\": [\n          { \"reps\": 10, \"weight_kg\": 60 },\n          { \"reps\": 10, \"weight_kg\": 60 },\n          { \"reps\": 10, \"weight_kg\": 60 },\n          { \"reps\": 10, \"weight_kg\": 60 }\n        ]\n      }\n    ],\n    \"cardio\": [\n      { \"type\": \"incline-walk\", \"minutes\": 20, \"speed_kmh\": 4.5, \"incline\": 6 }\n    ],\n    \"notes\": \"...\"\n  }\n]\n```\n\nThe `muscle` field per exercise is **auto-inferred at log time** via a keyword lookup (`src/lib/exercise-map.ts`). Sessions logged in earlier versions without this field are enriched on read.\n\n## Architecture\n\nThree layers, separable:\n\n1. **`SKILL.md`** — the agent-facing contract. Describes triggers, when to invoke, which flags to use. No code.\n2. **`workout-claw` CLI** — TypeScript/Node binary. Parses input, computes PRs and volume, writes JSON.\n3. **`~/.workout-claw/logs/*.json`** — the data. Diffable, queryable, portable.\n\nThe agent (e.g., a Claude Code skill) reads `SKILL.md`, decides to invoke the CLI, calls it via Bash, parses the YAML output, and relays a friendly summary to the user. The CLI is stateless and non-interactive (except `edit`, which spawns `$EDITOR`).\n\n## Roadmap\n\nShipped:\n- ✅ v0.1 — `log`, `history`, `pr`, `summary` (per-day JSON, fitdown input, Epley 1RM)\n- ✅ v0.2 — `last`, `delete`, `edit`\n- ✅ v0.3 — per-exercise muscle tags, `volume` command for cross-day rollups\n- ✅ v0.4.0 — reliability: atomic writes, fail-on-corrupt, flexible input, `--date` validation (see [`CHANGELOG.md`](./CHANGELOG.md))\n\nBacklog (see [`TODO.md`](./TODO.md)):\n- next — bodyweight-adjusted volume (so `@bw` exercises contribute to total kg lifted)\n- next — `progress <exercise>` curve (top-N 1RMs over time)\n- next — RPE per set: `bench 4x10@60r8`\n\n## License\n\nMIT.\n\n## Credits\n\nBuilt on the architectural pattern established by [Peter Martischka's `nutrition-claw`](https://github.com/Pita/nutrition-claw). The fitdown syntax is borrowed from [`datavis-tech/fitdown`](https://github.com/datavis-tech/fitdown) — `bench: 4x10@60` is a genuinely elegant format for both humans and LLMs to read and write.\n\nFile v0.4.0:_meta.json\n\n{\n  \"ownerId\": \"kn7brz0vy1j7e8y31vxdm6fmdd86r1f8\",\n  \"slug\": \"workout-claw\",\n  \"version\": \"0.4.0\",\n  \"publishedAt\": 1791395668751\n}\n\nFile v0.4.0:skill-card.md\n\n## Description:\n\nLogs workouts, retrieves training history, estimates personal records, and summarizes exercise volume using a local CLI.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dsdevq](https://clawhub.ai/user/dsdevq)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nPeople and their agents use this skill to record gym sessions, review workout history and volume, estimate lifting records, and correct or remove sessions stored locally.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill depends on a separately installed global npm CLI.\n\nMitigation: Review and trust the CLI package before installing or running it.\n\nRisk: Deleting a session has no confirmation prompt and may be irreversible; editing changes saved records.\n\nMitigation: Confirm the user's intent and session ID before destructive changes, and back up important workout records.\n\nRisk: Broad workout-related triggers may match ambiguous requests.\n\nMitigation: Clarify whether the user wants to view or change records before acting.\n\n## Reference(s):\n\n- [workout-claw on ClawHub](https://clawhub.ai/dsdevq/skills/workout-claw)\n- [fitdown input notation](https://github.com/datavis-tech/fitdown)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Guidance]\n\n**Output Format:** [Plain-language workout summaries and CLI command guidance; CLI responses are YAML]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Workout records are stored locally as JSON; personal records are estimated from logged sets.]\n\n## Skill Version(s):\n\n0.4.0 (source: server-resolved ClawHub release; bundled SKILL.md still says 0.3.1)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.4.0:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Denys Sychov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.3.1: 6 files, 8978 bytes\n\nFiles: LICENSE (1069b), README.md (6424b), skill-card.md (2203b), SKILL.md (5332b), TODO.md (1813b), _meta.json (131b)\n\nFile v0.3.1:SKILL.md\n\n---\nname: workout-claw\ndescription: Log workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage.\nauthor: Denys Sychov\nversion: 0.3.1\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"workout-claw\"]}}}\ntriggers:\n  - \"log workout\"\n  - \"log my workout\"\n  - \"track exercise\"\n  - \"gym session\"\n  - \"what's my PR\"\n  - \"what is my PR\"\n  - \"workout history\"\n  - \"lift history\"\n  - \"today's workout\"\n  - \"last workout\"\n  - \"show last session\"\n  - \"delete workout\"\n  - \"remove session\"\n  - \"edit workout\"\n  - \"fix my workout\"\n  - \"back volume\"\n  - \"chest volume\"\n  - \"leg volume\"\n  - \"how much volume\"\n  - \"muscle volume\"\n  - \"weekly volume\"\n---\n\n# workout-claw\n\nLocal-first gym workout tracker. Plain-JSON storage at `~/.workout-claw/`. Invokable as a CLI by an agent — no MCP server, no daemon.\n\n## Setup\n\nThis skill ships a SKILL.md manifest via ClawHub, but the `workout-claw` CLI binary lives on npm. Both layers are required.\n\n```bash\nopenclaw skills install workout-claw    # installs this SKILL.md\nnpm install -g workout-claw             # installs the CLI binary\n```\n\nRequires Node >= 20. Once both are installed, the CLI is on PATH and other skills can invoke it.\n\n## When to invoke\n\nUser describes a workout session, asks about progress, or wants to see a PR. Examples that should trigger this skill:\n\n- \"I just did chest day — bench 4x10 at 60, incline DB 4x12 at 20, triceps 4x12 at 40\"\n- \"Log today's workout\"\n- \"What's my bench PR?\"\n- \"Show my back workouts from the last 4 weeks\"\n- \"What did I do at the gym today?\"\n\n## How to invoke\n\nUse the `workout-claw` CLI via Bash. All commands output YAML to stdout, errors to stderr.\n\n### Log a workout\n\n```bash\nworkout-claw log \"bench 4x10@60, incline-db-press 4x12@20, triceps-pushdown 4x12@40\"\n```\n\nOptional flags:\n- `--muscle <group>` — `back | legs | chest | shoulders | arms | core | full | cardio | other`. If omitted, inferred from weekday (Mon=back, Wed=legs, Fri=chest per `~/.life/domains/health.md`).\n- `--cardio \"<entry>\"` — e.g. `\"incline-walk 20min @4.5kmh i6\"` (minutes, speed kmh, incline)\n- `--note \"<text>\"` — free-text note\n- `--date YYYY-MM-DD` — override date\n- `--time HH:MM` — override time\n\n### Input syntax\n\n`<exercise> <sets>x<reps>@<weight>` per entry, comma-separated for multiple exercises.\n\n- Multi-word exercise names use dashes: `incline-db-press`, `barbell-row`\n- Bodyweight: `pullups 4x10@bw`\n- All weights in kg\n\n### Query history\n\n```bash\nworkout-claw history --muscle chest --weeks 4\nworkout-claw history --exercise bench\n```\n\n### Get a PR\n\n```bash\nworkout-claw pr bench\n```\n\nReturns best estimated 1RM via Epley formula: `weight × (1 + reps/30)`.\n\n### Cross-day muscle volume (v0.3+)\n\n```bash\nworkout-claw volume --muscle back --weeks 4\nworkout-claw volume --muscle chest --weeks 8\n```\n\nAggregates volume **per exercise**, not per session. Pullups on chest day count toward `back` volume; triceps-pushdown counts toward `arms`. Returns total kg lifted, sets, reps, days trained, and a per-date breakdown.\n\n**This is the right query for tracking weekly volume per muscle group** — far more accurate than `history --muscle X` which is session-grain.\n\n### Summary of today\n\n```bash\nworkout-claw summary\nworkout-claw summary --date 2026-05-15\n```\n\n### Most recent session\n\n```bash\nworkout-claw last\n```\n\nReturns the latest session across all dates — useful for \"what did I do at the gym?\" without naming a date.\n\n### Delete a session\n\n```bash\nworkout-claw delete <session-id>\n```\n\nSession IDs come from the `id` field in any `log` / `summary` / `last` output. No confirmation prompt — the CLI is non-interactive by design.\n\n### Edit a session\n\n```bash\nworkout-claw edit <session-id>\n```\n\nOpens the session JSON in `$EDITOR` (defaults to `vi`). On save: validates JSON, refuses to save if the `id` was changed. On parse error: original session unchanged. Useful for fixing typos in exercise names or set counts without a full delete + re-log.\n\n**Agent note:** `edit` requires an interactive editor, so the agent should not invoke this in a Telegram round-trip. Instead, when a user asks to fix a logged workout via Telegram, prefer `delete` + `log` again, or hand back the session ID and tell the user to run `workout-claw edit <id>` from their terminal.\n\n## Data location\n\n- `~/.workout-claw/logs/<date>.json` — one JSON file per day, array of sessions\n- Schema: see `src/lib/types.ts` in the workout-claw repo\n\n## Notes for the agent\n\n- After logging, relay the YAML summary back to the user in a readable form (don't dump raw YAML)\n- If the user names an exercise that doesn't match the dash-naming convention, normalize before invoking (e.g. \"incline DB press\" → `incline-db-press`)\n- Session-level `--muscle` is inferred from weekday — only set explicitly if the user names a non-standard split (e.g. arm day on a Tuesday). **Per-exercise muscle tags are inferred automatically** at log time via name lookup (pullups→back, bench→chest, etc.), so no extra input is needed.\n- When user describes cardio separately, use `--cardio` flag. When they describe both lifting + cardio in one breath, use both.\n- For \"how much back/chest/leg volume?\" questions, prefer **`volume --muscle X`** over `history --muscle X` — volume aggregates per-exercise, history filters per-session.\n\nFile v0.3.1:README.md\n\n# workout-claw\n\n> Local-first gym workout tracker. CLI + skill manifest, designed for LLM agent invocation. No cloud account, no daemon, no DB.\n\n`workout-claw` is a tiny CLI that logs gym sessions to plain JSON files on disk. It's built to be invoked by an LLM agent (Claude, GPT, etc.) through a SKILL.md contract — but it's perfectly usable from a terminal directly. Sister project to [`nutrition-claw`](https://github.com/Pita/nutrition-claw).\n\n## 30-second demo\n\n```bash\n$ workout-claw log \"pullups 4x10@bw, incline-db-press 4x12@20, bench 4x10@60, triceps-pushdown 4x12@40\" --cardio \"incline-walk 20min @4.5kmh i6\"\n\nlogged:\n  date: 2026-05-15\n  session_id: MWDxpbQE\n  muscle_group: chest\n  time: 17:00\n  exercises_count: 4\n  total_sets: 16\n  total_volume_kg: 5280\nexercises:\n  - name: pullups\n    muscle: back              # ← auto-tagged per-exercise, not just session-level\n    sets: 4\n    reps_per_set: 10\n    weight: bw\n  - name: bench\n    muscle: chest\n    sets: 4\n    reps_per_set: 10\n    weight: 60\n  ...\n```\n\n```bash\n$ workout-claw pr bench\nexercise: bench\nestimated_1rm_kg: 80           # ← Epley: 60 kg × (1 + 10/30)\nfrom_set:\n  date: 2026-05-15\n  weight_kg: 60\n  reps: 10\n\n$ workout-claw volume --muscle back --weeks 4\nmuscle: back\ntotals:\n  volume_kg: 0                 # ← bodyweight contributes 0 to kg volume (v0.4 will fix)\n  sets: 4\n  reps: 40\n  days_trained: 1              # ← pullups on chest day correctly counted as back work\n```\n\n## Why it exists\n\nThe [`workout-logger`](https://clawhub.ai/skills/workout-logger) skill on ClawHub describes a beautiful conversational UX for logging workouts — but it's a stub. No CLI, no datastore, no PR tracking. Your workouts land as plain-text journal entries you can't query.\n\n`workout-claw` is the missing implementation: it gives the agent a real backing CLI to invoke, with structured JSON storage you can `cat`, `jq`, or `git diff`. The agent handles natural-language input (\"log my chest workout: bench four sets of ten at 60\"); the CLI handles deterministic state.\n\nThis is the same split you find with `nutrition-claw`: the skill manifest is the contract, the CLI is the engine, plain JSON is the source of truth.\n\n## Install\n\n```bash\ngit clone <repo>\ncd workout-claw\nnpm install\nnpm run build\nnpm link                       # symlinks workout-claw to your PATH\n```\n\nRequires Node ≥ 20.\n\nFor OpenClaw integration:\n\n```bash\nmkdir -p ~/.openclaw/workspace/skills/workout-claw\ncp SKILL.md ~/.openclaw/workspace/skills/workout-claw/SKILL.md\nsystemctl --user restart openclaw-gateway.service\n```\n\n(Symlinks are rejected as a security measure — copy the file. `npm run openclaw:sync` does this in one command.)\n\n## Commands\n\n```\nworkout-claw log <exercises>           # parse fitdown-style input, append session\nworkout-claw history [--muscle X] [--exercise Y] [--weeks N]\nworkout-claw pr <exercise>             # Epley 1RM estimate\nworkout-claw volume --muscle X [--weeks N]   # cross-day volume rollup\nworkout-claw summary [--date YYYY-MM-DD]\nworkout-claw last                      # most recent session across all dates\nworkout-claw delete <session-id>\nworkout-claw edit <session-id>         # opens session JSON in $EDITOR\n```\n\n### Input syntax (fitdown-inspired)\n\n```\n<exercise> <sets>x<reps>@<weight>\n```\n\n- Multi-word exercise names use dashes: `incline-db-press`, `barbell-row`\n- Bodyweight: `pullups 4x10@bw`\n- Multiple exercises in one call: comma-separated\n\nExamples:\n\n```bash\nworkout-claw log \"squat 5x5@100, leg-press 4x10@200, leg-curl 3x12@40\" --muscle legs\nworkout-claw log \"deadlift 1x5@140\" --note \"PR attempt — felt strong\"\nworkout-claw log \"\" --cardio \"run 5km 24min\"     # cardio-only session\n```\n\n### Optional flags on `log`\n\n| Flag | Meaning |\n|---|---|\n| `--muscle <g>` | back \\| legs \\| chest \\| shoulders \\| arms \\| core \\| cardio (defaults: weekday → muscle if a split is established) |\n| `--cardio \"<entry>\"` | e.g. `\"incline-walk 20min @4.5kmh i6\"` — minutes, speed, incline |\n| `--note \"<text>\"` | free-text annotation |\n| `--date YYYY-MM-DD` | override (default: today) |\n| `--time HH:MM` | override (default: now) |\n\n## Data shape\n\nOne JSON file per day at `~/.workout-claw/logs/YYYY-MM-DD.json`. Array of sessions (typically one per day, but multi-session days are supported).\n\n```json\n[\n  {\n    \"id\": \"MWDxpbQE\",\n    \"time\": \"17:00\",\n    \"muscle_group\": \"chest\",\n    \"exercises\": [\n      {\n        \"name\": \"bench\",\n        \"muscle\": \"chest\",\n        \"sets\": [\n          { \"reps\": 10, \"weight_kg\": 60 },\n          { \"reps\": 10, \"weight_kg\": 60 },\n          { \"reps\": 10, \"weight_kg\": 60 },\n          { \"reps\": 10, \"weight_kg\": 60 }\n        ]\n      }\n    ],\n    \"cardio\": [\n      { \"type\": \"incline-walk\", \"minutes\": 20, \"speed_kmh\": 4.5, \"incline\": 6 }\n    ],\n    \"notes\": \"...\"\n  }\n]\n```\n\nThe `muscle` field per exercise is **auto-inferred at log time** via a keyword lookup (`src/lib/exercise-map.ts`). Sessions logged in earlier versions without this field are enriched on read.\n\n## Architecture\n\nThree layers, separable:\n\n1. **`SKILL.md`** — the agent-facing contract. Describes triggers, when to invoke, which flags to use. No code.\n2. **`workout-claw` CLI** — TypeScript/Node binary. Parses input, computes PRs and volume, writes JSON.\n3. **`~/.workout-claw/logs/*.json`** — the data. Diffable, queryable, portable.\n\nThe agent (e.g., a Claude Code skill) reads `SKILL.md`, decides to invoke the CLI, calls it via Bash, parses the YAML output, and relays a friendly summary to the user. The CLI is stateless and non-interactive (except `edit`, which spawns `$EDITOR`).\n\n## Roadmap\n\nShipped:\n- ✅ v0.1 — `log`, `history`, `pr`, `summary` (per-day JSON, fitdown input, Epley 1RM)\n- ✅ v0.2 — `last`, `delete`, `edit`\n- ✅ v0.3 — per-exercise muscle tags, `volume` command for cross-day rollups\n\nBacklog (see [`TODO.md`](./TODO.md)):\n- v0.4 — bodyweight-adjusted volume (so `@bw` exercises contribute to total kg lifted)\n- v0.4 — `progress <exercise>` curve (top-N 1RMs over time)\n- v0.4 — RPE per set: `bench 4x10@60r8`\n\n## License\n\nMIT.\n\n## Credits\n\nBuilt on the architectural pattern established by [Peter Martischka's `nutrition-claw`](https://github.com/Pita/nutrition-claw). The fitdown syntax is borrowed from [`datavis-tech/fitdown`](https://github.com/datavis-tech/fitdown) — `bench: 4x10@60` is a genuinely elegant format for both humans and LLMs to read and write.\n\nFile v0.3.1:_meta.json\n\n{\n  \"ownerId\": \"kn7brz0vy1j7e8y31vxdm6fmdd86r1f8\",\n  \"slug\": \"workout-claw\",\n  \"version\": \"0.3.1\",\n  \"publishedAt\": 1784550904081\n}\n\nFile v0.3.1:skill-card.md\n\n## Description:\n\nLog workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dsdevq](https://clawhub.ai/user/dsdevq)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nExternal users and agent developers use this skill to let an agent record workout sessions, query workout history, compute estimated PRs, and manage local workout records through the workout-claw CLI.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill depends on an unpinned globally installed npm CLI.\n\nMitigation: Review the npm package source and install a pinned, verified version before enabling the skill.\n\nRisk: The CLI can delete workout records by session ID without an interactive confirmation prompt.\n\nMitigation: Confirm destructive requests and session IDs before invoking delete, and prefer non-destructive history or summary commands when the user's intent is unclear.\n\nRisk: Broad workout-related triggers could cause accidental local workout-log changes.\n\nMitigation: Disable or narrow triggers when accidental log, edit, or delete operations would be unacceptable.\n\n## Reference(s):\n\n- [ClawHub release page](https://clawhub.ai/dsdevq/skills/workout-claw)\n- [Publisher profile](https://clawhub.ai/user/dsdevq)\n- [workout-logger skill](https://clawhub.ai/skills/workout-logger)\n- [nutrition-claw](https://github.com/Pita/nutrition-claw)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and readable summaries of YAML CLI output]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires the workout-claw CLI on PATH; CLI writes local JSON workout logs under ~/.workout-claw/.]\n\n## Skill Version(s):\n\n0.3.1 (source: frontmatter and server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.3.1:TODO.md\n\n# workout-claw — backlog\n\n## v0.2 — session editing (✅ shipped 2026-05-15)\n\n- [x] `workout-claw delete <session-id>` — remove a logged session by id.\n- [x] `workout-claw edit <session-id>` — open the session JSON in `$EDITOR` for manual fixes.\n- [x] `workout-claw last` — print the most recent session across all dates.\n\n## v0.3 — per-exercise muscle tagging (✅ shipped 2026-05-15)\n\n- [x] Optional `muscle` field on `ExerciseEntry`, auto-inferred at log time via exercise-name → muscle keyword map (`src/lib/exercise-map.ts`).\n- [x] Read-time enrichment (`withInferredMuscle`) so v0.2 logs without the field also work.\n- [x] New `volume --muscle X --weeks N` command — cross-day volume rollup per muscle group.\n- [x] `history --muscle X` now matches sessions where ANY exercise hits the target muscle, not just session-level focus.\n- [x] `log` / `summary` / `last` output surfaces muscle per exercise.\n\n## v0.4 — quality-of-life\n\n- [ ] Bodyweight-adjusted volume for `@bw` sets (use `health.md` weight, optionally minus assistance). Right now pullups contribute 0 kg to volume which understates load.\n- [ ] `workout-claw progress <exercise>` — top-N estimated 1RMs over time, not just the single best.\n- [ ] RPE per set in the parser: `bench 4x10@60r8` for RPE 8.\n\n## Out of scope for now\n\n- Semantic search / embeddings (nutrition-claw has this; we don't need it until the exercise vocabulary fragments).\n- Recovery suggestions, opinionated commentary (skill UX layer; let the agent handle it on top of CLI output).\n- Web/TUI frontend. CLI + agent is the product.\n\n## OpenClaw integration notes\n\n- `SKILL.md` source-of-truth lives here. Sync to OpenClaw workspace via `npm run openclaw:sync` (copies + restarts gateway).\n- Symlinks don't work — loader rejects them as `symlink-escape`.\n\nFile v0.3.1:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Denys Sychov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.3.0: 3 files, 3780 bytes\n\nFiles: skill-card.md (2141b), SKILL.md (4893b), _meta.json (131b)\n\nFile v0.3.0:SKILL.md\n\n---\nname: workout-claw\ndescription: Log workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage.\nauthor: Denys Sychov\nversion: 0.3.0\ntriggers:\n  - \"log workout\"\n  - \"log my workout\"\n  - \"track exercise\"\n  - \"gym session\"\n  - \"what's my PR\"\n  - \"what is my PR\"\n  - \"workout history\"\n  - \"lift history\"\n  - \"today's workout\"\n  - \"last workout\"\n  - \"show last session\"\n  - \"delete workout\"\n  - \"remove session\"\n  - \"edit workout\"\n  - \"fix my workout\"\n  - \"back volume\"\n  - \"chest volume\"\n  - \"leg volume\"\n  - \"how much volume\"\n  - \"muscle volume\"\n  - \"weekly volume\"\n---\n\n# workout-claw\n\nLocal-first gym workout tracker. Plain-JSON storage at `~/.workout-claw/`. Invokable as a CLI by an agent — no MCP server, no daemon.\n\n## When to invoke\n\nUser describes a workout session, asks about progress, or wants to see a PR. Examples that should trigger this skill:\n\n- \"I just did chest day — bench 4x10 at 60, incline DB 4x12 at 20, triceps 4x12 at 40\"\n- \"Log today's workout\"\n- \"What's my bench PR?\"\n- \"Show my back workouts from the last 4 weeks\"\n- \"What did I do at the gym today?\"\n\n## How to invoke\n\nUse the `workout-claw` CLI via Bash. All commands output YAML to stdout, errors to stderr.\n\n### Log a workout\n\n```bash\nworkout-claw log \"bench 4x10@60, incline-db-press 4x12@20, triceps-pushdown 4x12@40\"\n```\n\nOptional flags:\n- `--muscle <group>` — `back | legs | chest | shoulders | arms | core | full | cardio | other`. If omitted, inferred from weekday (Mon=back, Wed=legs, Fri=chest per `~/.life/domains/health.md`).\n- `--cardio \"<entry>\"` — e.g. `\"incline-walk 20min @4.5kmh i6\"` (minutes, speed kmh, incline)\n- `--note \"<text>\"` — free-text note\n- `--date YYYY-MM-DD` — override date\n- `--time HH:MM` — override time\n\n### Input syntax\n\n`<exercise> <sets>x<reps>@<weight>` per entry, comma-separated for multiple exercises.\n\n- Multi-word exercise names use dashes: `incline-db-press`, `barbell-row`\n- Bodyweight: `pullups 4x10@bw`\n- All weights in kg\n\n### Query history\n\n```bash\nworkout-claw history --muscle chest --weeks 4\nworkout-claw history --exercise bench\n```\n\n### Get a PR\n\n```bash\nworkout-claw pr bench\n```\n\nReturns best estimated 1RM via Epley formula: `weight × (1 + reps/30)`.\n\n### Cross-day muscle volume (v0.3+)\n\n```bash\nworkout-claw volume --muscle back --weeks 4\nworkout-claw volume --muscle chest --weeks 8\n```\n\nAggregates volume **per exercise**, not per session. Pullups on chest day count toward `back` volume; triceps-pushdown counts toward `arms`. Returns total kg lifted, sets, reps, days trained, and a per-date breakdown.\n\n**This is the right query for tracking weekly volume per muscle group** — far more accurate than `history --muscle X` which is session-grain.\n\n### Summary of today\n\n```bash\nworkout-claw summary\nworkout-claw summary --date 2026-05-15\n```\n\n### Most recent session\n\n```bash\nworkout-claw last\n```\n\nReturns the latest session across all dates — useful for \"what did I do at the gym?\" without naming a date.\n\n### Delete a session\n\n```bash\nworkout-claw delete <session-id>\n```\n\nSession IDs come from the `id` field in any `log` / `summary` / `last` output. No confirmation prompt — the CLI is non-interactive by design.\n\n### Edit a session\n\n```bash\nworkout-claw edit <session-id>\n```\n\nOpens the session JSON in `$EDITOR` (defaults to `vi`). On save: validates JSON, refuses to save if the `id` was changed. On parse error: original session unchanged. Useful for fixing typos in exercise names or set counts without a full delete + re-log.\n\n**Agent note:** `edit` requires an interactive editor, so the agent should not invoke this in a Telegram round-trip. Instead, when a user asks to fix a logged workout via Telegram, prefer `delete` + `log` again, or hand back the session ID and tell the user to run `workout-claw edit <id>` from their terminal.\n\n## Data location\n\n- `~/.workout-claw/logs/<date>.json` — one JSON file per day, array of sessions\n- Schema: see `src/lib/types.ts` in the workout-claw repo\n\n## Notes for the agent\n\n- After logging, relay the YAML summary back to the user in a readable form (don't dump raw YAML)\n- If the user names an exercise that doesn't match the dash-naming convention, normalize before invoking (e.g. \"incline DB press\" → `incline-db-press`)\n- Session-level `--muscle` is inferred from weekday — only set explicitly if the user names a non-standard split (e.g. arm day on a Tuesday). **Per-exercise muscle tags are inferred automatically** at log time via name lookup (pullups→back, bench→chest, etc.), so no extra input is needed.\n- When user describes cardio separately, use `--cardio` flag. When they describe both lifting + cardio in one breath, use both.\n- For \"how much back/chest/leg volume?\" questions, prefer **`volume --muscle X`** over `history --muscle X` — volume aggregates per-exercise, history filters per-session.\n\nFile v0.3.0:_meta.json\n\n{\n  \"ownerId\": \"kn7brz0vy1j7e8y31vxdm6fmdd86r1f8\",\n  \"slug\": \"workout-claw\",\n  \"version\": \"0.3.0\",\n  \"publishedAt\": 1778870624365\n}\n\nFile v0.3.0:skill-card.md\n\n## Description: <br>\nLog workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[dsdevq](https://clawhub.ai/user/dsdevq) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and agents use this skill to log local workout sessions, query training history, calculate estimated PRs, and summarize muscle volume through the workout-claw CLI. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill reads, writes, edits, and deletes local workout logs that may contain personal health data. <br>\nMitigation: Install only when the local workout-claw CLI is trusted, and treat workout notes and logs as personal health data. <br>\nRisk: The documented delete command has no confirmation prompt. <br>\nMitigation: Confirm the exact session ID with the user before issuing any delete command. <br>\nRisk: The edit command opens an interactive editor and may not work in chat-only or Telegram-style agent sessions. <br>\nMitigation: Avoid invoking interactive edit flows in remote chat sessions; provide the session ID or use delete plus log again when appropriate. <br>\n\n\n## Reference(s): <br>\n- [Workout Claw ClawHub Page](https://clawhub.ai/dsdevq/workout-claw) <br>\n- [Publisher Profile](https://clawhub.ai/user/dsdevq) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Shell commands, Text, Guidance] <br>\n**Output Format:** [Markdown with inline bash commands and readable summaries of CLI YAML output] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Commands operate on local JSON workout logs under the user's home directory.] <br>\n\n## Skill Version(s): <br>\n0.3.0 (source: frontmatter and server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>","readmeExcerpt":"Skill: workout-claw Owner: dsdevq Summary: Log workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage. Tags: latest:0.4.0 Version history: v0.4.0 | 2026-10-07T17:54:28.751Z | user 0.4.0: fail loudly on corrupt data, relax log parsing, harden dates. See CHANGELOG. v0.3.1 | 2026-07-20T12:35:04.081Z | user Fix exercise-map gap (barbell-press now maps to chest, not other); ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"openclaw skills install workout-claw    # installs this SKILL.md\nnpm install -g workout-claw             # installs the CLI binary"},{"language":"bash","snippet":"workout-claw log \"bench 4x10@60, incline-db-press 4x12@20, triceps-pushdown 4x12@40\""},{"language":"bash","snippet":"workout-claw history --muscle chest --weeks 4\nworkout-claw history --exercise bench"},{"language":"bash","snippet":"workout-claw pr bench"},{"language":"bash","snippet":"workout-claw volume --muscle back --weeks 4\nworkout-claw volume --muscle chest --weeks 8"},{"language":"bash","snippet":"workout-claw summary\nworkout-claw summary --date 2026-05-15"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: workout-claw\ndescription: Log workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage.\nauthor: Denys Sychov\nversion: 0.3.1\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"workout-claw\"]}}}\ntriggers:\n  - \"log workout\"\n  - \"log my workout\"\n  - \"track exercise\"\n  - \"gym session\"\n  - \"what's my PR\"\n  - \"what is my PR\"\n  - \"workout history\"\n  - \"lift history\"\n  - \"today's workout\"\n  - \"last workout\"\n  - \"show last session\"\n  - \"delete workout\"\n  - \"remove session\"\n  - \"edit workout\"\n  - \"fix my workout\"\n  - \"back volume\"\n  - \"chest volume\"\n  - \"leg volume\"\n  - \"how much volume\"\n  - \"muscle volume\"\n  - \"weekly volume\"\n---\n\n# workout-claw\n\nLocal-first gym workout tracker. Plain-JSON storage at `~/.workout-claw/`. Invokable as a CLI by an agent — no MCP server, no daemon.\n\n## Setup\n\nThis skill ships a SKILL.md manifest via ClawHub, but the `workout-claw` CLI binary lives on npm. Both layers are required.\n\n```bash\nopenclaw skills install workout-claw    # installs this SKILL.md\nnpm install -g workout-claw             # installs the CLI binary\n```\n\nRequires Node >= 20. Once both are installed, the CLI is on PATH and other skills can invoke it.\n\n## When to invoke\n\nUser describes a workout session, asks about progress, or wants to see a PR. Examples that should trigger this skill:\n\n- \"I just did chest day — bench 4x10 at 60, incline DB 4x12 at 20, triceps 4x12 at 40\"\n- \"Log today's workout\"\n- \"What's my bench PR?\"\n- \"Show my back workouts from the last 4 weeks\"\n- \"What did I do at the gym today?\"\n\n## How to invoke\n\nUse the `workout-claw` CLI via Bash. All commands output YAML to stdout, errors to stderr.\n\n### Log a workout\n\n```bash\nworkout-claw log \"bench 4x10@60, incline-db-press 4x12@20, triceps-pushdown 4x12@40\"\n```\n\nOptional flags:\n- `--muscle <group>` — `back | legs | chest | shoulders | arms | core | full | cardio | other`. If omitted, inferred from the exercises (most sets wins; a tie is `full`; cardio-only is `cardio`), unless the user has an optional `~/.workout-claw/config.json` weekday split (`{\"split\":{\"mon\":\"back\",\"wed\":\"legs\"}}`), which then applies on those days.\n- `--cardio \"<entry>\"` — e.g. `\"incline-walk 20min @4.5kmh i6\"` (minutes, speed kmh, incline)\n- `--note \"<text>\"` — free-text note\n- `--date YYYY-MM-DD` — date to log under (default: today in local time). Pass it explicitly when the user logs a past session or it is just after midnight. Anything that is not a real date is rejected.\n- `--time HH:MM` — override time\n\n### Input syntax\n\n`<exercise> <sets>x<reps>@<weight>` per entry, comma-separated for multiple exercises. Also accepted: a `kg`/`lb` suffix (`bench 3x8@60kg`, lb is stored as kg), spaces in names (`bench press 3x8@60`), and uneven sets: `bench 8,8,6@60` (per-set reps, one weight) or `bench 8@60,6@65` (per-set reps and weights).\n\n- Multi-word exercise names use dashes: `incline-db-press`, `barbell-row`\n- Bodyweight: `pullups 4x10@bw`\n- All weights in kg\n\n### Query history\n\n"},{"path":"README.md","content":"# workout-claw\n\n> Local-first gym workout tracker. CLI + skill manifest, designed for LLM agent invocation. No cloud account, no daemon, no DB.\n\n`workout-claw` is a tiny CLI that logs gym sessions to plain JSON files on disk. It's built to be invoked by an LLM agent (Claude, GPT, etc.) through a SKILL.md contract — but it's perfectly usable from a terminal directly. Sister project to [`nutrition-claw`](https://github.com/Pita/nutrition-claw).\n\n## 30-second demo\n\n```bash\n$ workout-claw log \"pullups 4x10@bw, incline-db-press 4x12@20, bench 4x10@60, triceps-pushdown 4x12@40\" --cardio \"incline-walk 20min @4.5kmh i6\"\n\nlogged:\n  date: 2026-05-15\n  session_id: MWDxpbQE\n  muscle_group: chest\n  time: 17:00\n  exercises_count: 4\n  total_sets: 16\n  total_volume_kg: 5280\nexercises:\n  - name: pullups\n    muscle: back              # ← auto-tagged per-exercise, not just session-level\n    sets: 4\n    reps_per_set: 10\n    weight: bw\n  - name: bench\n    muscle: chest\n    sets: 4\n    reps_per_set: 10\n    weight: 60\n  ...\n```\n\n```bash\n$ workout-claw pr bench\nexercise: bench\nestimated_1rm_kg: 80           # ← Epley: 60 kg × (1 + 10/30)\nfrom_set:\n  date: 2026-05-15\n  weight_kg: 60\n  reps: 10\n\n$ workout-claw volume --muscle back --weeks 4\nmuscle: back\ntotals:\n  volume_kg: 0                 # ← bodyweight contributes 0 to kg volume (v0.4 will fix)\n  sets: 4\n  reps: 40\n  days_trained: 1              # ← pullups on chest day correctly counted as back work\n```\n\n## Why it exists\n\nThe [`workout-logger`](https://clawhub.ai/skills/workout-logger) skill on ClawHub describes a beautiful conversational UX for logging workouts — but it's a stub. No CLI, no datastore, no PR tracking. Your workouts land as plain-text journal entries you can't query.\n\n`workout-claw` is the missing implementation: it gives the agent a real backing CLI to invoke, with structured JSON storage you can `cat`, `jq`, or `git diff`. The agent handles natural-language input (\"log my chest workout: bench four sets of ten at 60\"); the CLI handles deterministic state.\n\nThis is the same split you find with `nutrition-claw`: the skill manifest is the contract, the CLI is the engine, plain JSON is the source of truth.\n\n## Install\n\n```bash\ngit clone <repo>\ncd workout-claw\nnpm install\nnpm run build\nnpm link                       # symlinks workout-claw to your PATH\n```\n\nRequires Node ≥ 20.\n\nFor OpenClaw integration:\n\n```bash\nmkdir -p ~/.openclaw/workspace/skills/workout-claw\ncp SKILL.md ~/.openclaw/workspace/skills/workout-claw/SKILL.md\nsystemctl --user restart openclaw-gateway.service\n```\n\n(Symlinks are rejected as a security measure — copy the file. `npm run openclaw:sync` does this in one command.)\n\n## Commands\n\n```\nworkout-claw log <exercises>           # parse fitdown-style input, append session\nworkout-claw history [--muscle X] [--exercise Y] [--weeks N]\nworkout-claw pr <exercise>             # Epley 1RM estimate\nworkout-claw volume --muscle X [--weeks N]   # cross-day volume rollup\nworkout-claw summary [--date "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7brz0vy1j7e8y31vxdm6fmdd86r1f8\",\n  \"slug\": \"workout-claw\",\n  \"version\": \"0.4.0\",\n  \"publishedAt\": 1791395668751\n}"},{"path":"skill-card.md","content":"## Description:\n\nLogs workouts, retrieves training history, estimates personal records, and summarizes exercise volume using a local CLI.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dsdevq](https://clawhub.ai/user/dsdevq)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nPeople and their agents use this skill to record gym sessions, review workout history and volume, estimate lifting records, and correct or remove sessions stored locally.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill depends on a separately installed global npm CLI.\n\nMitigation: Review and trust the CLI package before installing or running it.\n\nRisk: Deleting a session has no confirmation prompt and may be irreversible; editing changes saved records.\n\nMitigation: Confirm the user's intent and session ID before destructive changes, and back up important workout records.\n\nRisk: Broad workout-related triggers may match ambiguous requests.\n\nMitigation: Clarify whether the user wants to view or change records before acting.\n\n## Reference(s):\n\n- [workout-claw on ClawHub](https://clawhub.ai/dsdevq/skills/workout-claw)\n- [fitdown input notation](https://github.com/datavis-tech/fitdown)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Guidance]\n\n**Output Format:** [Plain-language workout summaries and CLI command guidance; CLI responses are YAML]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Workout records are stored locally as JSON; personal records are estimated from logged sets.]\n\n## Skill Version(s):\n\n0.4.0 (source: server-resolved ClawHub release; bundled SKILL.md still says 0.3.1)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."},{"path":"LICENSE","content":"MIT License\n\nCopyright (c) 2026 Denys Sychov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Log workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage. Skill: workout-claw Owner: dsdevq Summary: Log workouts, track progress, compute PRs, edit/delete sessions via a local CLI. Local-first, JSON storage. Tags: latest:0.4.0 Version history: v0.4.0 | 2026-10-07T17:54:28.751Z | user 0.4.0: fail loudly on corrupt data, relax log parsing, harden dates. See CHANGELOG. v0.3.1 | 2026-07-20T12:35:04.081Z | user Fix exercise-map gap (barbell-press now maps to chest, not other);","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1595,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T18:49:02.002Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T18:49:02.002Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:50:03.825Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}