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:
| Key | Effect |
|---|---|
x | Force-rerun only the selected task. Its upstream deps still use their cache hits — only the highlighted node re-executes. |
X | Force-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-tuicrate built onratatuiandcrossterm. - 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> --tuiopts the existingrunflow 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(aliashc) via--theme <name>orBROSKI_THEME.
Dashboard scroll + DAG labels + explain integration
The dashboard pane that shows logs for the highlighted task is now scrollable:
| Input | Effect |
|---|---|
| Mouse wheel | 3 lines per notch |
| PageUp / PageDown | 10 lines |
| Shift-↑ / Shift-↓ | 1 line |
| Shift-Home / Shift-End | Top / 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
| Key | Action |
|---|---|
| Type | Filter the task list (case-insensitive substring) |
| ↑ / ↓ / Home / End | Move highlight inside the filtered list |
| Tab | Replace input with the highlighted task name |
| Enter | Run the typed target (or the highlighted match if the input is partial) |
-- in input | Tokens after -- are forwarded as task passthrough args |
/ (leading) | Switch to the slash-command palette |
| Esc / Ctrl-U | Clear the input |
| q / Ctrl-C | Exit (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.
| Command | Effect |
|---|---|
/help | Show 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. |
/about | Show broski version. Alias: /version. |
/clear | Wipe session history and reset session counters. |
/refresh | Re-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. |
/quit | Exit 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,
broskiversion, short git rev, theme (withauto → darknotation 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/@outglob 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::ProgressEventis now public with structured variants:RunStarted,TaskQueued,TaskStarted,TaskPhase,LogLine,TaskFinished,RunFinished.RunOptionsgains opt-inevent_sink: Option<Sender<ProgressEvent>>andcapture_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::CancellationTokenwith two levels:CancelLevel::Soft— flips a flag; executor refuses to start new tasks.CancelLevel::Hard— sendsSIGTERMto 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. RunSummarycarries askipped: Vec<String>for tasks dequeued by cancellation.
broski history
broski historylists the most recent successful execution per task, newest first.broski history <task> --limit Nshows 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 fromCARGO_PKG_VERSION. - Broskifiles declaring
0.6or0.7validate 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 historyis 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.