Skip to content

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 04 May 01:43
· 20 commits to main since this release

Minor release. Adds Hermes Agent support — huge thanks to @SHL0MS for the clean PR (#34) — plus a small batch of follow-up usability fixes that surfaced during dogfooding on the same day.

Added

  • Hermes Agent support (#34, by @SHL0MS) — adds Hermes Agent (Nous Research's self-improving agent) as a first-class scanner. Reads top-level sessions from ~/.hermes/state.db (SQLite); aggregates child-session titles as additional summaries; cascade-deletes messages → child sessions → parent → on-disk JSON dumps under ~/.hermes/sessions/session_<id>.json. Resume via hermes --resume <session_id>.

Fixed (follow-ups on top of #34)

  • scanner/hermes: surface up to 4 user-message previews on CLI/TUI sessions — Hermes lazily generates titles after the first exchange, so short sessions stay un-titled and the listing fell back to bare cli session (model) — N msgs. The query now pulls the first 4 user messages, strips <user_query> wrapper tags, caps each line at 160 chars, and surfaces them as conversation history in the detail pane. CLI/TUI sessions only (YYYYMMDD_HHMMSS_* ids) — dashboard:* / api-* / named ids still use the source/model fallback because their role='user' rows come from external integrations (Notion webhooks, scheduled crons, dashboard callers) and would mislead the summary.
  • scanner/hermes: empty project_path so resume stays in your cwd — Hermes is cwd-independent. The original PR set project_path = ~/.hermes, which made agf emit cd ~/.hermes && hermes --resume <id> and yanked the shell out of whatever project you were in. shell::cd_and now skips the cd when the quoted path is empty ("" / '' / \"\"), and the Hermes scanner leaves it empty. display_path() renders empty paths as so the TUI doesn't show a blank cell.
  • delete/hermes: cascade in a single SQLite transaction — the four DELETEs ran independently, so a mid-cascade failure could leave orphan messages whose sessions row was already gone (surfacing as ghost rows on the next scan). Now wrapped in a single BEGIN/COMMIT via Connection::transaction.
  • TUI: time sort always applied on first framemain.rs only called apply_sort() inside an if let Some(sort_by) = config.sort_by, so the default-sort path silently rendered the cache's per-agent grouping order. A session from 11 minutes ago could land below sessions from a month ago on the first paint. Now always applied; sort_mode falls through to SortMode::Time when config.sort_by is None.
  • TUI: cwd-match boost removed from secondary sort — sessions whose project_path == $PWD were implicitly pushed above everything else, which made the time-sorted listing look broken when you launched agf from inside a project (11 sessions from "this project" first, then suddenly a 2-minute-old session from elsewhere). The boost was implicit (no on-screen indicator), so users read it as "time sort is wrong." Pinning is still honored — that's an explicit user action.
  • cache: bump CACHE_VERSION to 3 — Hermes Agent gained a new entry in the per-agent cache map, and Hermes session payloads now carry first-user-message previews instead of bare source/model fallbacks. Without bumping, 0.10.x cache files would surface as stale "cli session (...)" summaries on first 0.11.0 launch until the underlying DB mtime happened to change. The bump forces a one-time rescan on upgrade.

Known issues (out of scope for this release)

  • Cursor CLI scanner is broken on the current agent-transcripts/<id>/<id>.jsonl layout — tracked in #35. Recent cursor-agent installs write transcripts as .jsonl (depth 4) instead of the legacy .txt (depth 3) the scanner expects, so agf list --agent cursor-agent returns 0 sessions on those installs. Fix targeted for v0.11.1 or v0.12.

Install

cargo install agf
agf setup
agf

Or grab a prebuilt binary from the assets below (macOS arm64/x86_64, Linux x86_64, Windows x86_64-msvc).