Skip to main content

v0.7 Release Notes

v0.7.0 is the current stable Broski release line. It introduces a live TUI dashboard, cooperative cancellation, structured streaming events from the executor, and a broski history command, while keeping the CLI's existing output behavior byte-identical when no TUI is requested.

Highlights

Selective DAG force-rerun (x / X)

After a run completes, the dashboard stays live. You can now re-run individual tasks without leaving the TUI:

KeyEffect
xForce-rerun only the selected task. Its upstream deps still use their cache hits — only the highlighted node re-executes.
XForce-rerun the entire original target from scratch. All tasks bypass the cache (--force semantics).

Both keys are silently ignored while a run is still in progress. The dashboard resets and shows the new execution live; press x / X again to iterate further, or q to exit.

Under the hood, x sets RunOptions::force_tasks = {selected_task} and X sets RunOptions::force = true. No cache entries are deleted — the existing record is simply skipped and overwritten after re-execution.

Live TUI dashboard

  • New broski-tui crate built on ratatui and crossterm.
  • Three entrypoints:
    • broski tui (no task) opens the interactive launcher: filter the task list with type-ahead, hit Enter, watch it run, return to the launcher when it finishes.
    • broski tui <task> runs through the dashboard directly.
    • broski run <task> --tui opts the existing run flow into the dashboard.
  • DAG view, log tail, summary bar, and help footer are all live-updating.
  • ETA estimates per task and aggregate remaining-time badges are prefetched from the artifact store before the first frame.
  • Named themes: default, dark, light, high-contrast (alias hc) via --theme <name> or BROSKI_THEME.

Dashboard scroll + DAG labels + explain integration

The dashboard pane that shows logs for the highlighted task is now scrollable:

InputEffect
Mouse wheel3 lines per notch
PageUp / PageDown10 lines
Shift-↑ / Shift-↓1 line
Shift-Home / Shift-EndTop / tail

Auto-follows the tail by default; locks position when you scroll up; pressing Shift-End (or scrolling fully back down) re-engages follow. While locked, the log pane title shows ↑N so it's obvious you're reviewing older output.

The DAG widget now adds inline (cached) / (skipped) / (dry-run) / (failed) tags next to the task name once it reaches a terminal state, in addition to the existing ⊙/⊘/✓/✗ glyphs. When --explain is set, each task gets a dim sub-line ↳ <first reason> underneath, and the log pane prepends the full reasons list at the top of the selected task's output.

broski tui <task> --explain and broski run <task> --tui --explain are now supported (the prior mutex relaxed; only --dry-run and --watch remain mutually exclusive with --tui).

Interactive tasks in the TUI

When a chosen target's resolved DAG includes any @mode interactive task, the TUI suspends itself for the duration: leaves raw mode + alt screen + mouse capture, hands the real TTY to the child via Stdio::inherit, restores the dashboard when the child exits. Dev servers, REPLs, prompts, and Ctrl-C handling all work as expected. Embedded PTY (DAG visible alongside the interactive child) is a follow-up.

Launcher key map

KeyAction
TypeFilter the task list (case-insensitive substring)
↑ / ↓ / Home / EndMove highlight inside the filtered list
TabReplace input with the highlighted task name
EnterRun the typed target (or the highlighted match if the input is partial)
-- in inputTokens after -- are forwarded as task passthrough args
/ (leading)Switch to the slash-command palette
Esc / Ctrl-UClear the input
q / Ctrl-CExit (only when input is empty)

Slash commands

Type / in the input box to flip into a Claude-CLI-style command palette. The right column shows the suggestion list; Tab completes to the canonical form, Enter dispatches.

CommandEffect
/helpShow key map + slash command catalog in the status banner. Aliases: /h, /?.
/theme <name>Switch theme live: default, dark, light, high-contrast (alias hc), or auto.
/aboutShow broski version. Alias: /version.
/clearWipe session history and reset session counters.
/refreshRe-load broskifile from disk; rebuild task list and stats. Alias: /reload.
/cache prune <MB>Prune the artifact store to the given size budget; report freed bytes.
/quitExit the launcher. Aliases: /q, /exit.

Auto theme

--theme auto (or BROSKI_THEME=auto, or /theme auto) queries the terminal's actual background color via OSC 11 and picks Dark or Light accordingly. Resolution is best-effort: if the terminal doesn't support the query (or there is no TTY), the launcher falls back to Theme::Default cleanly.

Stats panel

The launcher's right column always shows live information when in Filter mode:

  • Workspace card — path, broski version, short git rev, theme (with auto → dark notation when resolved).
  • Cache card — object count and total size on disk in human-readable units.
  • Session card — total runs, ✓✗⊘ outcome counters, accumulated wall-clock.
  • Task detail — when a task is highlighted: description, deps, @in/@out glob counts, and the most recent successful run's duration + relative age.
  • Recent runs — last few completed runs from this session.

The snapshot is refreshed after every Run / /refresh / /cache prune. The input box now hosts a real blinking cursor instead of a static glyph.

Streaming executor event API

  • broski_core::ProgressEvent is now public with structured variants: RunStarted, TaskQueued, TaskStarted, TaskPhase, LogLine, TaskFinished, RunFinished.
  • RunOptions gains opt-in event_sink: Option<Sender<ProgressEvent>> and capture_output: bool.
  • Per-phase timing: ResolveInputs, Fingerprint, CacheRestore, StagePrep, CommandExec, OutputPromote, CacheStore.
  • The legacy CLI rendering path is unchanged when no event sink is provided.

Cooperative cancellation

  • New broski_core::CancellationToken with two levels:
    • CancelLevel::Soft — flips a flag; executor refuses to start new tasks.
    • CancelLevel::Hard — sends SIGTERM to all registered child PIDs.
  • TUI two-stage Ctrl-C: first press = soft, second press within two seconds = hard exit. The status bar reflects CANCELLING → TERMINATING → CANCELLED.
  • RunSummary carries a skipped: Vec<String> for tasks dequeued by cancellation.

broski history

  • broski history lists the most recent successful execution per task, newest first.
  • broski history <task> --limit N shows the last N runs for a single task with absolute time, duration, and short fingerprint.
  • Backed by SQLite via the existing artifact store; no extra writes on hot paths.

Validator version drift fix

  • Replaced the hard-coded broskifile-version allowlist ("0.1" | … | "0.5") with a derived ceiling from CARGO_PKG_VERSION.
  • Broskifiles declaring 0.6 or 0.7 validate cleanly against the v0.7.0 binary.
  • Forward-incompatible declarations (e.g. 1.0) still fail with an actionable upgrade message.

Operational impact

  • Dashboard-driven cancellation replaces "kill the terminal and hope the cache is consistent" with a graceful soft → hard escalation.
  • broski history is the first read-only audit command, useful for "is the cache actually being hit?" investigations.
  • Streaming events let custom integrations (CI dashboards, IDE plugins) consume Broski's executor without parsing CLI output.
  • ETAs in the TUI rely on prior successful runs; first-time-ever runs simply omit them.

Operational notes

  • MSRV unchanged at 1.78.0.
  • Quality gate green: cargo fmt --all --check, cargo clippy --workspace --all-targets --all-features -- -D warnings, cargo test --workspace --all-features.
  • Two-terminal interactive concurrency regression guard from v0.6 still passes.