Skip to content

Release v2.7.0

Choose a tag to compare

@github-actions github-actions released this 24 May 07:55
· 49 commits to main since this release

✨ Features

  • feat(fetcher): add shared llm_pricing helper (cf40ec1)
  • feat(fetcher): add codex_subscription — rate-limit utilisation from local JSONL (1b5d7b2)
  • feat(fetcher): add codex_usage — local Codex CLI session rollup (ebb7760)
  • feat(fetcher/codex): scaffold module + shared session helpers (b8c1be2)
  • feat(fetcher): add claude_subscription — Max-plan utilisation via oauth/usage (59e3fdc)
  • feat(fetcher): add claude_code_usage — local Claude Code session rollup (9a0111d)

🐛 Bug Fixes

  • fix(fetcher/codex): address coderabbit review findings (aad0c6e)
  • fix(fetcher/claude_code_usage): address coderabbit review findings (73f6808)

📝 Other Changes

  • chore: bump version to v2.7.0 (a0c1afb)
  • perf(fetcher/claude_code_usage): skip stale JSONL files by mtime (6d09272)
  • perf(fetcher/codex_usage): skip JSONL files outside the since window by filename (bfc728f)
  • test(fetcher/codex): cover render_body branches for each shape (a01d64f)
  • refactor(fetcher/claude_code_usage): use shared llm_pricing helper (07939bb)
  • refactor(fetcher/codex_usage): use shared llm_pricing helper (c55aa0c)
  • chore: sync llm pricing daily via Actions (ad0978a)
  • test(fetcher): restore SPLASHBOARD_HOME via RAII guard for panic safety (8bfd057)
  • test(fetcher/gitlab/common): assert structural project path instead of hard-coded slug (2d18654)
  • test(render/media_image): cover draw_thumbnail's zero-sized area guard returning Ok before any image load, so a degenerate zero-width or zero-height layout slot can't surface a spurious [image: …] error — only reachable by calling draw_thumbnail directly, since the public render path never hands a renderer a zero-sized area (7f16c4c)
  • test(fetcher/git/repo_name): cover fetch's "project" literal fallback when the cwd is the filesystem root, where there is no directory basename and no git repo above it so both arms of detect_name come up empty (b46b452)
  • test(xtask/themes): cover pretty_name's None arm for empty underscore segments rendering as blank words, theme_for's unwrap_or_default fallback materialising the default theme for an unknown slug, and render_one's happy path plus both failure contexts: a missing demo config failing render_config_html_with_theme's read_to_string, and an output path pre-created as a directory surfacing the write context after a successful render (582a811)
  • test(render/animated_splitflap): cover apply_flap's guard and continue arms — bailing out on a zero-sized area, taking the elapsed_ms >= settle_at continue so a fully settled cell keeps its original glyph past the animation window, and the else { continue } arm resolving out-of-range cells to no cell instead of panicking when the area overflows the buffer (545d511)
  • test(render/chart_histogram): cover render_histogram's own empty-series guard (only reachable by calling it directly, since render_payload short-circuits empty bodies upstream) leaving the buffer blank, and boost_to_visible passing an all-zero count slice straight through when the zero peak leaves nothing to lift (dc72516)
  • test(render/grid_table): cover the inline layout honouring right alignment so content sits flush against the right edge with leading padding, and render's defence-in-depth guard drawing nothing instead of panicking when handed a non-Entries body directly (fbbb28a)
  • test(xtask/preset_index): cover run's create and write failure paths — surfacing the create context when a directory component is a regular file and the write context when the index path is pre-created as a directory, with a shared unique_temp_dir helper tagging each case (ebfe8ee)
  • test(render/chart_sparkline): cover render leaving the slot untouched when handed a non-NumberSeries body, the line style emitting a blank chart for an empty value window, and draw_line_series/draw_zero_baseline's defence-in-depth guards for a zero-sized area, an over-long value slice, and mid/bottom rows past the buffer (037092b)
  • test(render/list_ranking): cover fit_label's zero-width, pad, and truncate-with-ellipsis branches, pad_left prepending spaces only when shorter than the target width, and align_rect offsetting for center/right while passing the area through unchanged for no hint, zero content width, or content wider than the area (8a0b507)
  • test(render/text_ascii): cover figlet_wrapped's raw-input fallback when the font renders nothing (empty string and all-control-code input), blocks_width and pixel_name taking the conservative defaults on an unrecognised PixelSize, and render's defence-in-depth Body::Text guard drawing a blank cell instead of panicking when handed a non-Text body (0d78814)
  • test(fetcher/code/scan): cover the tracked walkers' early-continue branches — for_each_tracked_path and for_each_tracked_file skipping a symlink that fails is_regular_file and (Linux-only) a non-UTF-8 path that fails the str::from_utf8 decode, asserting only the regular keep.rs entry is ever visited (531bcca)
  • test(cli/cache): cover run_cache subcommand dispatch — Path resolving the cache dir under SPLASHBOARD_HOME, List treating a missing cache dir as empty in both plain and json modes, Clear removing seeded .json/.lock entry files, and Clear with a widget_id dispatching through run_cache_clear to clear_one's no-entry diagnostic (5dd4af4)
  • test(xtask/html_snapshot): cover color_hex mapping every ANSI-16 named color to its exact hex value, exercising all sixteen Color enum arms from Black through White including the dim and Light* bright variants (28f00b2)
  • test(fetcher/deal/free_games): cover Platform's config_value tokens and url_slug codes for all nine storefronts, feed_url slug embedding for every non-aggregate platform, and parse_platform/parse_kind case-insensitive matching of every known storefront and the explicit game keyword (ccf0365)
  • test(runtime): cover finalize_splash restoring cursor visibility so the post-splash shell prompt gets a visible cursor, asserting an explicit hide is flipped back to shown via TestBackend's cursor-visibility debug output (9b98aa6)
  • test(render/list_links): cover render_links's zero-dimension area early return, write_row's no-op arm when set_stringn draws zero cells, and the OSC 8 suppression paths skipping the hyperlink wrap in both write_row and wrap_osc8 (90f5abc)
  • test(fetcher/gitlab/common): cover payload's metadata-unset wrapping, project_from_url's https-userinfo bail when the credential chunk embeds a slash, and resolve_project's cwd-git-remote fallback recovering the project path from the origin URL (eb4eba3)
  • test(fetcher/huggingface_trending): cover render_sync TextBlock shape emitting one rank-prefixed line per entry, with the heart count and the optional download count formatted and the latter omitted when absent (1e9c943)
  • test(fetcher/github/action_status): cover render_body Entries shape for the classified status/branch/conclusion rows and the conclusion ? fallback when a still-running workflow has no conclusion (804d95b)
  • test(render/list_cards): cover natural_height's non-ImageLinkedList fallback arm, render_cards and draw_text zero-dimension no-op guards, and the draw_thumbnail path via a missing-file card whose image-load error is swallowed (128d0d6)
  • test(render/animated_figlet_morph): park until process uptime clears the 260ms fade window so render_morph deterministically takes the crossfade-out branch instead of the fade-in path a fast suite would otherwise hit (dfe38fd)
  • test(fetcher/steam/games): cover text_block_body and entries_body empty-input placeholder arms, plus image_linked_body and image_body cached-thumbnail resolution via pre-seeded cache files without network I/O (d588376)
  • test(fetcher/steam/player_summary): cover avatar download and thumbnail-cache resolution for ImageLinkedList and Image bodies over a local HTTP server, asserting the cached .png path is reused without a second request (5f9a47d)
  • test(fetcher/wikipedia/trending): cover ImageLinkedList thumbnail resolution over a local HTTP server for fetch_thumbnail_url source extraction, missing-thumbnail and request-failure None arms, plus the empty-article chain entry (71e32d1)
  • test(fetcher/news): cover fetch shape dispatch over a local HTTP server for default/text-block/image/image-linked bodies, the count clamp, and parse/status error surfacing (3bc0b7b)
  • test(cache): cover warm_from None-disk arm, is_lock_stale missing-file bail, ensure_parent parentless path, io_err Other-kind wrapping, and try_acquire_with lock-dir creation failure (ab3c2a8)
  • test(cache/clear): cover clear_one missing-widget and realtime-fetcher errors, empty-cache diagnostic, and entry/lock removal in plain and json modes (1bba315)
  • test(fetcher/lastfm): cover render_body shape dispatch for charts and every top_* fetcher, including the text_body fallback arm (871d30b)
  • test(runtime): cover cache_keys_for realtime/unknown filtering, distinct per-widget keys, and load_entries key parity (9f17ddd)
  • test(fetcher/forge_items): cover dispatch_rows_async ImageLinkedList thumbnail resolution for missing, unsupported-scheme, and cache-hit avatars (3a527a8)
  • test(fetcher/deal/free_games): cover fetch validation rejections and entry_to_row store split, free-offer marking, and timestamp fallbacks (f12c144)
  • test(fetcher/lastfm/scrobbles_today): cover render_body shape dispatch, text fallback, and every body builder (c507212)
  • test(fetcher/deal/games): cover store_name id mapping and fetch_deals success, status, parse, request, and oversized-body paths (04c099f)
  • test(fetcher/gitlab/pipeline_status): cover sample_body shapes, metadata, cache_key variation, and fetch validation paths (9b02747)
  • test(fetcher/crypto_trending): cover render_sync text_block, render_for_shape image/non-image paths, and shared http client (2c4319f)
  • test(fetcher/wikipedia/trending): cover render_sync text_block, build_summary_url encoding, and render_for_shape non-image path (eced2fb)
  • test(fetcher/lastfm/top): cover Period deserialisation and body builders for every shape (ad60121)
  • test(fetcher/deal/steam_daily): cover entry_to_row parsing, fallbacks, and cache_key (f870941)
  • test(fetcher/huggingface_trending): cover get_json status/parse/size/request paths and render_for_shape image branches (2bb8dc7)
  • test(fetcher/gitlab): cover repo_stars sample_body, metadata, cache_key, and fetch validation paths (aa16985)
  • test(fetcher/steam): cover owned_games render_body shapes, cache_key, and fetch validation (7373b81)
  • test(fetcher/steam): cover recently_played render_body shapes, cache_key, and fetch validation (f17d963)
  • test(fetcher/deal): cover common label, body_for_shape, and image_linked paths (4612d0a)
  • test(fetcher/lastfm): cover parse_json status, envelope, and size paths (c592945)
  • test(fetcher/gitlab): cover repo_issues metadata, cache_key, and fetch validation paths (85bc788)
  • test(runtime): cover next_refresh_secs countdown logic and fmt_duration_compact (618d441)
  • test(fetcher/steam): cover client request_json and get_json error paths (ffa48c5)
  • test(fetcher/steam): cover player_summary render_body shapes, parsing, and fallbacks (b86e921)
  • test(fetcher/steam): cover charts render_body shapes and response parsing (32fdeeb)
  • chore: update flake.nix hashes for v2.6.0 (c53f6da)