cm1_typo_fix_BEGIN
fix: correct `npm install` typo in README
cm1_typo_fix_END
cm2_feature_add_BEGIN
feat(api): add endpoint to fetch posts for a user
cm2_feature_add_END
cm3_refactor_BEGIN
refactor(utils): use strptime for date parsing

Replace manual split/int parsing with strptime to reduce code
surface and rely on stdlib validation for malformed input.
cm3_refactor_END
cm4_perf_fix_BEGIN
perf(posts): batch author lookup to avoid N+1 queries

Previously issued one SELECT per post to fetch its author. Collect
unique author_ids and fetch them in a single query, then join in
memory.
cm4_perf_fix_END
cm5_whitespace_BEGIN
style: normalize whitespace in api/auth.py
cm5_whitespace_END
cm6_test_add_BEGIN
test(clamp): cover invalid bounds and below-range inputs
cm6_test_add_END
cm7_breaking_change_BEGIN
feat(auth)!: require mfa_code on login

BREAKING CHANGE: `login()` now requires an `mfa_code` argument.
Callers must collect and pass the user's MFA code; existing
two-argument calls will fail.
cm7_breaking_change_END
cm8_docs_only_BEGIN
docs(api): document JWT auth header and token lifetime
cm8_docs_only_END
