Releases: neochoon/agenthud
Releases · neochoon/agenthud
v0.18.2
Fixed
- No more
--trust-toolswarning on Kiro summaries.kiro-cli
documents--trust-tools=as "trust no tools" (the guard that keeps a
headless summary run from silently executing filesystem/shell tools)
but then warns that the empty value looks like a custom MCP tool. That
benign stderr line is now stripped from the passed-through output while
real diagnostics still surface.
Changed
- CI actions moved off the deprecated Node 20 runtime.
actions/checkoutv4→v6,actions/setup-nodev4→v6, and
softprops/action-gh-releasev2→v3 — all now on Node 24, ahead of
GitHub forcing the switch on 2026-06-16. No user-facing change.
v0.18.1
Fixed
- Kiro summary engine now actually summarizes.
summary --engine kiropreviously fed the activity report tokiro-clion stdin while
passing the prompt as a positional argument — but Kiro reads stdin
only when no positional question is given, so it ignored the report
and replied that the log was empty. The prompt and report are now
combined onto stdin (no positional), so the model sees both. Claude
and Codex are unaffected. - No more EPIPE crash when an engine closes stdin early. Writing the
large report to a child that had already closed its input surfaced as
an unhandledEPIPEerror and aborted the process; the stdin pipe now
has an error handler, so the run degrades gracefully.
v0.18.0
Added
- Pluggable summary engine.
agenthud summaryis no longer hard-wired
toclaude— it can now run through Claude Code, OpenAI Codex CLI, or
Kiro CLI. Pick one per run with--engine <claude|codex|kiro|auto>, or
set a default withsummary.enginein~/.agenthud/config.yaml. The
default isauto, which detects the first installed CLI in
claude → codex → kiro order. This lets Codex- or Kiro-only users
generate summaries without installing Claude.
Changed
- Summary cache is now keyed by engine and model, not just date. Each
cached daily/range summary records which (engine, model) produced it via
an inert HTML-comment marker; switching the engine or model regenerates
the summary instead of serving the previous engine's stale text. Caches
written before this release are treated as Claude output and reused for
Claude requests, so existing summaries are not needlessly regenerated on
upgrade.
v0.17.0
Added
- OpenAI Codex CLI as a fourth session provider. Reads
~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl(override
CODEX_SESSIONS_DIR). Sessions group bycwd, show the model
(turn_context.model), a context-window gauge (taken directly
from thetoken_countevent — no inference), and a cyancodex
provider label. Sub-agents are separate rollout files linked by
parent_thread_idand nest under their parent; older
(source: { subagent: "<role>" }, no parent link) sub-agents
surface at top level instead of being dropped. - Per-agent session-file schemas for all four providers under
docs/schemas/(Claude, Kiro CLI, Kiro IDE, Codex), each with
thejqcommands used to derive it.
Changed
- Repositioned as a multi-agent monitor. README, npm
description/keywords, and FEATURES now cover Claude Code + Codex
CLI + Kiro IDE + Kiro CLI rather than Claude-only. The same
project worked from multiple agents merges into one tree row. - Consistent session-row titles across providers. Every
provider now shows the latest substantial user message (skipping
slash commands), matching Claude. Previously Codex/Kiro CLI
showed the first prompt and Kiro IDE showed an auto-generated
label ("Clean State") the user never typed. - Cool sessions render dim. The active count is hot + warm, but
cool sessions used to render bright like active ones — visually
contradicting the count. Cool now dims (still expanded/visible,
unlike collapsed cold); only hot/warm render bright.
Performance
- Discovery is cached per file by (path, mtime). The Claude
provider re-read every session + sub-agent file's tail on each
~2 s poll; with hundreds of mostly-cold files this was ~1.4 s and
blocked navigation. Cold files now read once — warm discovery
~1450 ms → ~6 ms. - The activity viewer no longer re-parses unchanged files.
Parsed history is cached by (path, mtime), so reading or
navigating a stable session costs nothing. - Growing JSONL parses only the appended tail. When a session
file grows, agenthud re-parses just the new bytes (bounded-tail,
with the seam aligned to a turn boundary so nothing cross-line
straddles it) instead of the whole file. On a 25 MB session a new
response went from ~150 ms to ~12 ms, and stays bounded as the
session keeps growing. Kiro IDE (single JSON document) still
parses whole, gated by mtime.
v0.16.0
Added
- Kiro IDE sessions appear alongside Claude Code and Kiro CLI.
Reads the IDE's VSCode-fork storage
(<app-storage>/Kiro/User/globalStorage/kiro.kiroagent/,
override:KIRO_IDE_SESSIONS_DIR). Sessions group by
workspaceDirectory, thetitlebecomes the row description,
selectedModelthe model, andcontextUsagePercentagethe
context gauge. Rows carry a magentakiro-ideprovider label. - Kiro IDE sub-agents nest under their parent. Unlike the CLI,
IDE sub-agents live asinvokeSubAgentactions inside the
parent's execution log (taggedsubExecutionId), not as
separate files. agenthud parses those execution documents,
surfaces each sub-agent as a tree row, and renders its tool
stream (runCommand→ Bash,readFiles→ Read, etc.) in the
activity viewer. waitingbadge for IDE approval gates. A sub-agent parked on
aPendingAction(the IDE's run-command approval prompt) shows
[waiting]— answering the "is it even running?" question
directly.AGENTHUD_HOMEenv override for the app data directory
(~/.agenthud), mirroringCLAUDE_PROJECTS_DIR/
KIRO_SESSIONS_DIR. Used for test isolation and mounted/synced
setups.
Changed
- Live badges are recency-gated across all providers. A
.lock
file (Kiro CLI) or arunningexecution (Kiro IDE) only drives a
[working]/[waiting]badge when the session was touched in the
last 30 minutes — the same rule Claude already used. A terminal
left open for hours now falls back to the time-based
[cool]/[cold]badge instead of looking perpetually active. - Session-row description shows the latest user message of any
length. The previous 10-character minimum dropped short
follow-ups ("ok", "go", "yes") in favor of a stale older
message; now the literal latest non-slash-command message wins.
Fixed
agenthud reporttruncated piped output.process.exit(0)
fired before the async stdout pipe drained, silently cutting
~40% of a long report (| grep/| lesslost trailing session
blocks while a file redirect kept everything). All exits after a
stdout write now flush first.- Kiro IDE sessions were missing from reports — history
entries carried no timestamps, so the same-day filter dropped
them. Activities now inherit the session file's mtime. - macOS/Windows watch mode never refreshed on non-Claude
activity. Polling was Linux-only;fs.watchonly covers the
Claude projects dir, so Kiro CLI/IDE changes never triggered an
update. Polling is now always primary on every platform. KIRO_SESSIONS_DIRoverrides routed to the wrong parser.
Activity from an overridden Kiro root was parsed as Claude JSONL
(and came back empty). Routing now prefix-matches each provider's
actual configured root.summary --last Nd --forcerebuilt ranges from stale daily
caches.--forcenow regenerates the per-day summaries too.--with-gitduplicated commits once per session of the same
project; commits are now fetched once per project.--date 2026-02-31was accepted (JS silently normalized it
to Mar 3); impossible dates are now rejected.--help/--version/-Vcreated~/.agenthud/config.yaml
as a side effect; read-only commands now short-circuit before
loading config.- Summary cache could be left partial on a crash. Output now
streams to a temp file and renames into place on success. taskactivity type was inconsistent between the default
include set,--include all, and the generated config template —
all three now agree, so first-run and later-run payloads match.- Multi-provider project order depended on provider registration
order; merged trees are now re-sorted by status/mtime.
Internal
- Provider abstraction (
src/data/providers/) withSessionProvider
interface; Claude / Kiro CLI / Kiro IDE are independent providers
merged into one tree. - Per-provider session-file schemas under
docs/schemas/. - CI gained a lint gate; the publish workflow now refuses tags
whose commit is not an ancestor ofmain. @types/nodepinned to the lowest supported runtime (^20);
publish builds on Node 20.
v0.15.0
Added
- Kiro CLI sessions appear alongside Claude Code. agenthud now
reads~/.kiro/sessions/cli/(override:KIRO_SESSIONS_DIR) as
a second session source. Both providers merge into one tree —
the same project worked from both CLIs renders as a single row
with combined counts. Discovery uses Kiro's.jsonsidecar
(cwdfor grouping,titleas the row description,
parent_session_idfor sub-agent nesting) and the.lockfile
as the liveness signal. The Kiro JSONL record format
(Prompt/AssistantMessage/ToolResults) is parsed into
the same activity stream the viewer, report, and summary
consume. - Provider label on session rows. Top-level sessions show
which CLI created them —claude(yellow) orkiro
(magenta) — between elapsed time and model name. - Context-window usage gauge on session rows. A colored
NN%
(green < 60%, yellow 60–85%, red ≥ 85%) shows how full each
session's context is. Kiro reports the percentage directly in
its sidecar; Claude derives it from the last assistant turn's
usage fields with an adaptive window inference (usage > 200K ⇒
the session must be on the 1M long-context window). Verified
against/contextoutput. - Report headers carry provenance. Markdown session blocks
now read## project (start – end) · provider · model; the
JSON format gainsproviderandmodelkeys per session. The
summary LLM sees the provenance for free. - Canonical tool labels across providers. Kiro's raw tool
names (shell,subagent,introspect,web_fetch) map to
the Claude-style canonical taxonomy (Bash,Task,Read,
WebFetch) at the parser boundary, so report include-filters
and the activity viewer treat both providers uniformly.
Unknown names pass through visibly instead of being mislabeled. - Per-provider session-file schema docs at
docs/schemas/
(claude-session.md, kiro-session.md), each ending with the jq
commands used to derive the field inventory — re-run them to
falsify the doc against your own sessions.
Changed
- Census is now the single source of truth for per-project
counts.computeCensusbuilds a per-project map in the same
walk as the tree-wide totals and ProjectRow reads from it, so
the panel title and row counts can no longer disagree. - Fable/Mythos model ids shorten like other families
(claude-fable-5→fable-5).
Fixed
- Windows: Kiro session history routed to the wrong parser.
The path check hardcoded/separators; backslash paths now
normalize first.
v0.14.1
Changed
- ProjectRow name renders dim when no session or sub-agent is
active. Previously every non-hidden project name was bold
bright white regardless of activity, so a tree full of
cool/cold projects with one genuinely hot one all looked
equally "alive" at a glance. New rule: bold + bright only when
isProjectAlive(project)— at least one session or sub-agent
is hot or warm. Otherwise dim, non-bold. Hidden projects still
dim with⊘; selection background still wins.
v0.14.0
Changed (BREAKING)
- Hide moved from
htoShift+H. Lowercasehis now the
vim-left alias for←(jump to parent). The old binding
(h= hide) was a footgun: vim users coming for navigation
hithand silently hid whichever item was selected. The
user wouldn't even remember pressing it. CapitalHkeeps the
mutation behind a deliberate keystroke.
Added
- Tree-wide census in the Projects panel title. Each level
shows total + visible-active count:
12p (3) · 68 sessions (5) · 142 sub-agents (2) · ⊘ 14 hidden (1).
The(N)parentheticals are green so the eye lands on the
actionable count. The hidden(M)is yellow — the alert for
content you can't see. Narrow terminals fall back to short
form (68s (5),142a (2)), then drop segments from the
right; the hidden alert is the last thing to go. akey toggles "show hidden items" in the tree. Hidden
projects and sessions render dim with a⊘marker so they're
recognizable at a glance. Combined with theHchange below,
a full hide → toggle → unhide cycle now lives inside the TUI —
no more state.yaml editing to recover an accidentally-hidden
item.His now a toggle, not just hide. PressingHon a
visible item hides it (same as before); pressing it on a
hidden item unhides it. Combine withato reveal hidden
items in the tree, navigate to the one you want, and toggle
withH.- Per-project session + sub-agent counts on the project row.
> myproj ~/path 5 sessions (2) · 142 sub-agents (3) 3m.
Totals are dim; active subset(N)is mid-tone green
(non-bold, softer than the panel-title census so it doesn't
compete with the row's own[hot]/[warm]badge). Width-
aware: short form5s (2) · 142a (3), dropped entirely on
very narrow terminals. - Status bar surfaces hidden-but-still-active items. A hidden
session producing live activity used to be completely
invisible — combined with thehfootgun above, that broke
discovery in a way that took astate.yamledit to recover.
Now the title bar shows the count:· ⊘ N hidden(dim) or
· ⊘ M active in N hidden(yellowM) when something hot
or warm is hidden. - Cold sessions under active projects collapse to a
... N coldsentinel. Active projects often hold a long
tail of historical cold sessions that bury the live work;
pressing↵on the sentinel reveals them.
Changed (layout)
- Census moved to the Projects panel title bar; branding +
keybindings moved to a single bottom row. The top status
bar was wasted space (just "AgentHUD vX · ⊘ N hidden …"
floating above the panels) and the Projects title was equally
wasted (just "Projects"). Both fixed: census now sits where
it belongs — directly above the tree it describes — and the
bottom row carries the brand + keys. - Session row description = latest substantial user request.
Was: first natural-language user prompt (often stale by hour
3 of a long session). Now: the most recent user message that
is ≥ 10 chars and doesn't start with/(so trivial
follow-ups like "ok", "go", "yes" and slash commands like
/compact,/clearare skipped). Falls back to first prompt
when no later message qualifies. t(toggle tracking) now requires tree focus. It moves
the tree cursor — accidentally pressing it while reading the
viewer used to yank focus away. TheTRK ●indicator still
appears on both tree and viewer banners while the mode is on.t: trackandr: refreshhints dropped from the status
bar. Tracking is a niche mode; refresh is automatic via the
2s poll + fs.watch. Both keys still work and are documented
in the?help.
Fixed
- Hidden sub-agents are now MARKED, not filtered, in the data
layer. Previously hidden sub-agents were silently dropped
before the tree was built, so the panel-title census
undercounted sub-agent totals, the yellow hidden-active alarm
was silent for them, and thea(show hidden) +H(unhide)
round-trip couldn't reach them at all. Now they ride along
withhidden: trueand the show-hidden/unhide flow works
end-to-end. Hno longer teleports selection whenshowHiddenis on.
In show-hidden mode the row stays rendered (dimmed with⊘)
after hiding, so jumping selection away made no sense — the
user just acted on that row and expects to remain on it. Now
selection only advances when the row is about to disappear
(showHiddenoff).- Cold session rows render dim instead of bold-bright. The
cold IDs used to compete visually with the active rows in the
same project.
v0.13.3
Changed
- README install section split into "Try without installing" /
"Install for daily use", each showing bothnpmandbun.
The previous structure mixed annpx agenthudinstall hint with
bareagenthud …Quickstart commands — copy-paste failed for
anyone who took the trial path. Two clearly-labeled H2 sections
now exist side-by-side; the Quickstart still targets the
daily-use form, andbunusers are first-class instead of
"check the docs". Doc-only; no behavior changes.
v0.13.2
Changed
- Package description and keywords optimized for npm search
ranking. Description rewritten to compress every realistic
search query — "Claude Code", "TUI", "dashboard", "live
monitor", "parallel sessions", "sub-agents", "LLM", "digest" —
into one natural sentence without keyword-stuffing reading.
Keywords expanded from 7 to 26 across the Claude/Anthropic /
agent / TUI / observability / session-monitor / LLM-summary
clusters, with phrase keywords likeclaude-code-tuiand
claude-code-clifor multi-word query matches. Pure metadata
change, no code or behavior shift; surfaces in npm's search
index on next crawl.