v0.11.0
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 viahermes --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 theirrole='user'rows come from external integrations (Notion webhooks, scheduled crons, dashboard callers) and would mislead the summary. - scanner/hermes: empty
project_pathso resume stays in your cwd — Hermes is cwd-independent. The original PR setproject_path = ~/.hermes, which madeagfemitcd ~/.hermes && hermes --resume <id>and yanked the shell out of whatever project you were in.shell::cd_andnow skips thecdwhen 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
sessionsrow was already gone (surfacing as ghost rows on the next scan). Now wrapped in a singleBEGIN/COMMITviaConnection::transaction. - TUI: time sort always applied on first frame —
main.rsonly calledapply_sort()inside anif 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_modefalls through toSortMode::Timewhenconfig.sort_byisNone. - TUI: cwd-match boost removed from secondary sort — sessions whose
project_path == $PWDwere implicitly pushed above everything else, which made the time-sorted listing look broken when you launchedagffrom 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_VERSIONto 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>.jsonllayout — tracked in #35. Recent cursor-agent installs write transcripts as.jsonl(depth 4) instead of the legacy.txt(depth 3) the scanner expects, soagf list --agent cursor-agentreturns 0 sessions on those installs. Fix targeted for v0.11.1 or v0.12.
Install
cargo install agf
agf setup
agfOr grab a prebuilt binary from the assets below (macOS arm64/x86_64, Linux x86_64, Windows x86_64-msvc).