time-lens
Installation
SKILL.md
Project Time Tracker
Combines five data sources → reconciles → produces HTML dashboard + Markdown report.
Scripts
All scripts live in scripts/ next to this SKILL.md. Run them with python3:
| Script | Purpose | Key flags |
|---|---|---|
git_sessions.py |
Parse git history → sessions → hours | <repo> --since YYYY-MM-DD --until YYYY-MM-DD [--raw] |
wakatime_fetch.py |
WakaTime API → daily hours, filtered to project | --start YYYY-MM-DD --end YYYY-MM-DD --project name |
claude_messages.py |
Claude Code user prompts + activity timestamps per day | --project-path /abs/path or --filter name |
codex_messages.py |
Codex CLI user prompts + activity timestamps per day | --project-path /abs/path or --filter name |
cursor_messages.py |
Cursor IDE user prompts + activity timestamps per day | --project-path /abs/path or --filter name |
reconcile.py |
Merges the JSON output of the scripts above into a single hour estimate, with an optional supervised-vs-unattended split | --git f.json --claude f.json --codex f.json --since Y-M-D --until Y-M-D [--gap-hours 0.5] [--presence-window-min 10] [--tz Area/City] [--daily] |
claude_messages.py, codex_messages.py, and cursor_messages.py each output two timestamp arrays: timestamps (user prompts only — for prompt-count metrics) and activity_timestamps (every timestamped event, including tool-call/tool-result cycles and assistant replies — use this one for reconciliation). See "Use activity_timestamps, not timestamps" in references/reconciliation.md for why this distinction matters — using prompt-only timestamps for hour reconciliation silently drops real work time.