Releases: hefgi/suivi
Releases · hefgi/suivi
Release list
v0.3.0
Added
suivi track <path> [--name NAME]— first-class command to add a project to tracking. Auto-backfills historical(untracked)turns whosecwdfalls under the new path, usingconfig::find_projectlongest-match semantics so nested tracked projects keep ownership of their own turns.suivi untrack <path-or-name>— remove a project from tracking. Confirms with(y/N)by default (--yesto skip). Historical DB rows are preserved.stats --until YYYY-MM-DD— closes the open-ended--sinceinto a finite range. clap-enforced constraints: requires--since, conflicts with--today/--week/--month/--all. Renderscustom range (YYYY-MM-DD → YYYY-MM-DD)in section titles.- Config
[[exclude]]list with built-in defaults (/private/var/folders,/tmp,~/.cache). Excluded paths are skipped at hook time — turns from temp dirs never enter the DB. suivi doctor --prune-excluded— one-shot cleanup of already-recorded turns whosecwdmatches an exclude entry.suivi doctor --fix-outliers— clamps historical turns whoseagent_duration_secsor wall window exceedstracking.max_turn_secs. Dry-run by default,--yesto apply.suivi doctor --fix-from-transcripts— for historical Claude Code turns, rewritesended_atandagent_duration_secsby scanning the JSONL transcript for the last live-activity event. Reclaims phantom idle time recorded when sessions were suspended (laptop sleep, walk-away). Reclaimed 84.7 hours on the maintainer's DB.- Config knobs:
tracking.max_turn_secs(fallback cap for agents without transcripts, default 7200s),tracking.transcript_gap_threshold_secs(transcript inter-event gap for Claude Code, default 300s).
Changed
- Claude Code
ended_atnow comes from the transcript, not fromnow. The Stop hook scans the JSONL for the last user/assistant/system/attachment event within the turn's window and truncates at the first gap larger thantranscript_gap_threshold_secs(default 5 min). Suspended sessions no longer record hours of phantom work; legitimate long autonomous runs are preserved without a cap. - Signal-less turns (transcript has no in-window events) now record
agent_duration_secs = 0andeffective_duration_secs = 0— the human buffer is skipped when there's nothing to attribute it to. stats --today/--week/--monthscopes the Top projects/agents section to the active flag (was hardcoded to "this week"). The activity graph inproject/agentviews does the same.- Daily activity graph now correctly clips turns that span midnight, splitting attribution across the calendar days they touch. A turn from 23:00 to 02:00 no longer credits 3 hours to the start day.
statssilently auto-clamps outliers on every invocation (belt-and-suspenders alongside the write-time clamp).
Fixed
- The write-time cap was setting
ended_at = started_at + 2hwhen clamping — plausible-looking but wrong for suspended sessions. Claude Code turns now use the transcript-derived end; other agents still use the cap fallback with the same behavior as before. stats --todaysilently used an unbounded window because the since-filter for the "today" branch wasNone. Now correctly bounded.- The per-project and per-agent activity graphs used a hardcoded 30-day window regardless of the active flag; they now follow the flag's window.
v0.2.0
Added
- Foundation: error types, agent trait, database schema, config loading, logging utilities
- Agent support: Claude Code, Codex, OpenCode (session-level), Pi (experimental)
- Hook handlers:
suivi hook preandsuivi hook stopwith buffer correction - CLI:
suivi init,suivi status,suivi doctor --prune --check - Analytics:
suivi statswith today/week/all-time summary,--projects,--history,--graph,--daily - Output formats:
--format text|json|csvforsuivi stats CONTRIBUTING.mdat the repo root (the README already linked it) (#21)suivi uninstall(+--purge): removes suivi's hook entries from every
agent config, the inverse ofsuivi init(#23)
Changed
- The second headline metric is now agent time — the sum of each turn's
real duration — replacing "accumulated" effective time, which blended human
buffers into agent effort and double-counted attention across parallel
sessions (#10). Summary JSON/CSV renameaccumulated_secstoagent_secs;
history exports gain anagent_duration_secscolumn. Per-turn
effective_duration_secsis still stored and exported.
Fixed
- Agent thinking time was always recorded as 0:
hook stopread aduration_ms
field that no agent sends; durations now fall back toended_at − started_at(#16) - Turns interrupted before
Stopfired were lost as stale rows;hook prenow
closes any open turn in the session at the next prompt (#16) - Agent attribution no longer depends on env/parent-process sniffing: hook
commands pass--agent <id>, the payloadagentfield is honored, and
sniffing remains only as a fallback for old installs (#17) suivi initonly installs hooks for agents actually present on the machine,
and re-runs upgrade outdated hook commands in place (#17, #18)cargo testno longer writes hook files into the developer's real home
directory (#18)- SQLite uses WAL and a 5s busy timeout so concurrent hooks from parallel
sessions don't silently drop turns on lock contention (#19) - "Today", daily buckets, and
--historytimestamps use the local timezone
instead of UTC;--sincedates are local midnight (#20) - Invalid
--sincedates now error instead of being silently ignored (#20) suivi statusreports "not installed" for absent agents instead of a
misleading hook-health state (#18)- Every command panicked with "Broken pipe" when piped to an early-exiting
consumer; SIGPIPE now uses the default disposition (#23) - OpenCode tracking recorded one truncated turn per session; the plugin now
tracks per user message with verified event payloads (#24) - Both JS plugins shelled out synchronously through temp files on every
event; payloads now go to suivi's stdin via non-blocking spawn (#24, #25) - The per-project and per-agent mini-graphs bucketed days in UTC, missing
the local-timezone fix that covered the other views (#26)