Skip to content

Releases: hefgi/suivi

Release list

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 13 Jul 08:47
a062d91

Added

  • suivi track <path> [--name NAME] — first-class command to add a project to tracking. Auto-backfills historical (untracked) turns whose cwd falls under the new path, using config::find_project longest-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 (--yes to skip). Historical DB rows are preserved.
  • stats --until YYYY-MM-DD — closes the open-ended --since into a finite range. clap-enforced constraints: requires --since, conflicts with --today/--week/--month/--all. Renders custom 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 whose cwd matches an exclude entry.
  • suivi doctor --fix-outliers — clamps historical turns whose agent_duration_secs or wall window exceeds tracking.max_turn_secs. Dry-run by default, --yes to apply.
  • suivi doctor --fix-from-transcripts — for historical Claude Code turns, rewrites ended_at and agent_duration_secs by 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_at now comes from the transcript, not from now. 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 than transcript_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 = 0 and effective_duration_secs = 0 — the human buffer is skipped when there's nothing to attribute it to.
  • stats --today/--week/--month scopes the Top projects/agents section to the active flag (was hardcoded to "this week"). The activity graph in project/agent views 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.
  • stats silently 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 + 2h when 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 --today silently used an unbounded window because the since-filter for the "today" branch was None. 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

Choose a tag to compare

@github-actions github-actions released this 11 Jun 20:07
a33baf4

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 pre and suivi hook stop with buffer correction
  • CLI: suivi init, suivi status, suivi doctor --prune --check
  • Analytics: suivi stats with today/week/all-time summary, --projects, --history, --graph, --daily
  • Output formats: --format text|json|csv for suivi stats
  • CONTRIBUTING.md at the repo root (the README already linked it) (#21)
  • suivi uninstall (+ --purge): removes suivi's hook entries from every
    agent config, the inverse of suivi 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 rename accumulated_secs to agent_secs;
    history exports gain an agent_duration_secs column. Per-turn
    effective_duration_secs is still stored and exported.

Fixed

  • Agent thinking time was always recorded as 0: hook stop read a duration_ms
    field that no agent sends; durations now fall back to ended_at − started_at (#16)
  • Turns interrupted before Stop fired were lost as stale rows; hook pre now
    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 payload agent field is honored, and
    sniffing remains only as a fallback for old installs (#17)
  • suivi init only installs hooks for agents actually present on the machine,
    and re-runs upgrade outdated hook commands in place (#17, #18)
  • cargo test no 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 --history timestamps use the local timezone
    instead of UTC; --since dates are local midnight (#20)
  • Invalid --since dates now error instead of being silently ignored (#20)
  • suivi status reports "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)