Output contract
bodyweightis now a JSON number inworkouts list/workouts show(#33). It was emitted as a quoted string ("175") whileworkouts statsemitted the same field as a number — one field, two types depending on subcommand. It is now a number everywhere, ornullwhen absent or unparseable.nullrather than0so a missing measurement can't be mistaken for a real one. This is a breaking change for consumers that readbodyweightas a string.- New
sessionDurationSecondsfield (#36).sessionDurationwas only available as a human phrase ("01 hours 06 minutes 01 seconds") sitting next to genuinely numericcaloriesBurnedandprCount. The numeric field is additive — the human string is preserved, so existing consumers are unaffected. - No more usage dump on error (#31). Cobra printed its full usage/flags block to stderr on any flag-parse or
RunEfailure, burying the actual message. Errors are now a singleError: <msg>line on stderr, exit 1; stdout stays data-only.--helpand bare invocation are unchanged.
Fixes
- One bodyweight row per day (#30). Bodyweight is read off each workout post, so logging two workouts on one calendar day produced two rows for that date, double-counting it in per-day trend and plateau analysis. Entries now collapse to one row per local calendar day, keeping the latest measurement. Applies to both
bodyweights listand the monthly averages inbodyweights stats. - Routines: no more placeholder sets (#51). Zero-weight/zero-rep placeholder sets were rendered as real sets, and bodyweight-only movements picked up a meaningless
@+0suffix.
Install
brew tap quantcli/tap
brew install liftoff-export
# or upgrade:
brew upgrade liftoff-exportWhat's Changed
- bodyweights: collapse to one row per local day (#30) (#53)
- workouts list/show JSON: numeric bodyweight + sessionDurationSeconds (#33, #36) (#54)
- Silence cobra usage/error dump on failure (#31) (#52)
- fix(routines): drop placeholder zero sets and "@+0" bodyweight suffix (#51)
Thanks to @vinistoisr for #52, #53, and #54.
Full Changelog: v1.2.0...v1.3.0