v0.8.0
Minor: the statusline now works at the terminal level — tmux, starship, zsh/bash,
PowerShell, terminal titles — so Codex and opencode sessions get a live cost line too,
not just Claude Code. Neither Codex nor opencode exposes a command-backed status hook
(openai/codex#17827 and anomalyco/opencode#8619 are open), so the surface moved to the
terminal itself (SPEC-0075, PRs #217/#221).
feat
aireceipts statusline --cwd <path>selects the newest session attributed to that
path instead of the machine's globally newest one, so a tmuxstatus-rightline
(--cwd "#{pane_current_path}") shows each pane its own session. Attribution is
guarded: Claude Code's lossy project-directory encoding is confirmed against the
transcript's own recordedcwdafter load, sessions launched from the home directory
(or/) never ancestor-match everything, dot-segments resolve lexically, full-parse
work is capped, and no match renders the neutral placeholder — never another
project's line. Cursor sessions carry no cwd and are excluded. Relative paths resolve
against the invocation directory; a usable Claude Code stdin payload still wins.
Recipes for tmux, starship, plain zsh/bash, PowerShell, and OSC terminal titles are
indocs/statusline.md— the Claude Code nativestatusLinehook remains the
recommended (richer, faster) surface where it exists (PRs #217, #221).~/.aireceipts/statusline.json({"items": ["brand", "cost", …]}) sets a persistent
default segment list for the statusline. Precedence: explicit--format> config
file > built-in default. An invalid file degrades to the default line with one stderr
note (exit 0); the--formatflag keeps its fail-fast contract (PR #221).- Telemetry:
--cwdinvocations are polling surfaces, so they count locally but never
network-flush (a 15-second tmux poll adds zero events). The
integration_surface_renderedevent gainsscopedandconfigFilebooleans — never
the path or the format string (docs/telemetry.md, PR #221).
fix
- The published CLI is ~3.5× faster wherever sqlite-backed sessions (opencode,
Cursor) are read (PR #214). tsup'sremoveNodeProtocoldefault rewrote
import("node:sqlite")toimport("sqlite")indist/, which fails at runtime, so
every published build silently fell back to spawning thesqlite3CLI per query —
measured 4.0s → 1.15s for one statusline render on a sqlite-heavy machine. On
Node ≥ 22.13 thesqlite3binary is no longer needed at all; older runtimes keep the
fallback. Built-artifact regression tests now pin the import specifier and the
in-process read path.
chore
- CI gains a
windows-latestjob (cwd matching, statusline suites, built-CLI e2e). Its
first runs surfaced and fixed three real Windows issues:.cmdspawns need a shell
under Node's CVE-2024-27980 hardening, goldens/fixtures gained-textline-ending
exemptions, and absolute POSIX paths are never drive-prefixed bypath.resolve
(PR #221). - OpenSSF Scorecard hardening: esbuild override for the open advisory, absolute
SECURITY.mdlink (PR #212); adopterpr-checkworkflow hardened with
continue-on-error+ concurrency groups (PR #207).
Rendered receipt output is byte-identical (receipt goldens unchanged; the help golden
gains the --cwd line); the default statusline
line renders through the exact same code path as 0.7.2 when neither --cwd nor a
config file is present.