Changelog
Generated from CHANGELOG.md in the project repository. Never maintained twice.
0.9.0
21 September 2026
- added
Menu::run_multipicks any number of entries: space ticks the one under the cursor, enter confirms, and the result isPicked::Chosenwith the ticked ids in display order. Ticks are kept by id, so they survive the filter and switching tabs. Hints are neither shown nor answered there, since a key that ended the menu would drop what was ticked.Menu::with_tickedstarts named entries ticked.
0.8.1
20 September 2026
- addedThe Node binding passes a metric's verdict through as
MetricInput.verdict.Metric::with_verdictlanded in0.6.0and was never wired up, so Node callers still had only a tone — which is nothing in a pipe, in CI or underNO_COLOR, whereErrors: 3read exactly like a clean count. It is applied before an explicittone, which still wins, matching the Rust side.
0.8.0
20 September 2026
- added
Group::in_tabputs a run of groups in one tab rather than one each, andGroup::with_dividerdraws a divider in front of a tab where the row stops being one kind of thing and starts being another. Inside a shared tab each group keeps its label as a heading, so the grouping survives and only the row gets its length back. - changed
Groupcarries two more public fields,tabanddivider, so a literal construction of it no longer compiles.Group::newand the builders are unaffected.
0.7.1
20 September 2026
- fixed
0.7.0did not compile on Rust1.85, the version this crate declares. The tab digits were matched with aletchain, which is stable only from1.88; the local toolchain accepted it and the declared minimum was never tried. The same key is now read without one, and a digit no tab carries is swallowed rather than falling through to a hint bound to it. - fixedThe Node binding required
runemark ^0.6.0while the crate beside it was0.7.0, so every workflow that touchesbindings/nodefailed to resolve. Its package version was bumped for the release, its dependency on the crate was not.
0.7.0
19 September 2026
- added
Layout::Tabsarranges a menu's groups as a row of tabs, showing only the active group's entries. For a list that would otherwise be taller than the terminal:←→,Tab/Shift-Taband the digits1–9switch groups, and the cursor lands on the first entry of the one it arrives at. A rule under the active tab marks it, so the group is still named with colour off. The application decides when to ask for it — a menu knows how many entries it has, not how much of the screen its caller is willing to spend. - added
Menu::with_summaryadds a second heading line, for what the menu adds up to — how many entries, how many groups — which the list itself only says by being counted. - changed
Menu::renderignoresLayout::Tabsand lists every group. Nothing on the other end of a pipe can press a key to reach the second tab, so hiding one there would lose entries rather than save lines. - changedThe search spans every group in either layout, and leaves the tab row while it runs. Tabs answer "I know roughly where"; the filter answers "I know exactly what", which is the case tabs are worst at.
0.6.0
19 September 2026
- added
Metric::with_verdictrenders the verdict's symbol in front of a metric, and supplies its tone where none was set. A tone alone disappears with colour: piped or underNO_COLOR, a failing metric read exactly like a passing one, which made metrics unusable for status in the tools most likely to be piped. An explicitwith_tonestill wins, in whichever order the two are called, and the symbol counts towards the width that decides whether metrics stack.
0.5.2
19 September 2026
- fixedA short menu no longer advertises
/ searchin its footer. Filtering still works — the key is never taken away — but a two-entry yes/no question offering to search itself reads as clutter, and below a handful of entries every one of them is already on screen.
0.5.1
19 September 2026
- fixedAn interactive menu now shows
/ searchin its footer./is reserved for the filter and cannot be bound as a hint, so nothing else could advertise it — a key the menu answers to but never mentions is a key nobody presses.Menu::renderstill offers no keys: printed to a pipe there is no keyboard.
0.5.0
19 September 2026
- added
/filters a menu as you type. Groups with nothing left disappear, the cursor sits on the best match, andBackspacewidens the query again. Matching is tiered: the query as a substring of the name, then as a subsequence of it (dplfindsdeploy), then as a substring of the description — a name the user is typing towards beats a description that happens to share letters. - added
Escleaves the filter before it leaves the menu, so a mistyped query costs one key rather than the whole selection. While filtering, every printable key is part of the query, so a menu bindingqas a hint can still be searched forquality. - added
/is reserved and can no longer be bound as a hint key.
0.4.2
19 September 2026
- fixedA menu entry longer than the terminal is wide wrapped to column zero, which destroyed the two-column layout — a 78-character description behind a 19-column label column produced 101-column lines. Entries are now shortened to fit, with
…marking the cut. Wrapping is deliberately not used: it would change how many lines the frame occupies, which the redraw depends on. - fixedWhere the label column leaves too little room for a description to say anything, the description is dropped rather than cut to a stub.
0.4.1
18 September 2026
- fixedA menu taller than the terminal corrupted the display. Redrawing moved the cursor up by the full frame height, which a short terminal clamps, so each frame ate the lines above it. The body is now windowed to what the terminal can show, with
↑ N moreand↓ N moremarking what is out of view, and the window moves the least amount that keeps the cursor visible. - fixedThe redraw now moves up by the number of lines actually written rather than a separately computed height, which is what let the two drift apart.
0.4.0
18 September 2026
- added
selectfeature: a grouped, keyboard-driven menu (Menu,Group,Item,Hint,Outcome,SelectMode). This is the first API in the crate that reads from the terminal; the documented design boundary is updated accordingly. It drives termios directly, so the only dependency islibcand the interactive path is Unix-only — elsewhereMenu::runreportsOutcome::Unavailable, which is the same fallback a pipeline takes. - added
Menu::renderproduces the same layout as plain text and needs no feature, so a non-interactive caller has something to show. - added
SelectModefollowsColorModeandProgressMode:Autois interactive only for a terminal, and a menu that cannot be interactive returnsOutcome::Unavailablewithout blocking on a read.
0.3.3
14 September 2026
- fixed
TerminalProgress::stderrno longer selects theindicatifbar whereindicatifhides its output (TERMunset ordumb); every notice was silently dropped there. Such terminals now get plain lifecycle lines. - added
TerminalProgress::is_interactivereports whether a live progress bar is rendered.
0.3.2
14 September 2026
- fixedNarrow report layouts now wrap a finding's rule ID, confidence and location onto continuation lines with the hanging indent instead of overflowing the given width.
- fixedThe interactive progress bar no longer flashes one frame in the default
indicatifstyle when an operation starts. - changedUpdate the optional
indicatifdependency to 0.18 (drops the unmaintainednumber_prefixcrate).
0.3.1
12 September 2026
- addedNative Node.js bindings and the
@casoon/runemarkTypeScript package. - addedA versioned, object-oriented Node API that accepts plain data objects while keeping Rust presentation models internal.
- addedFull plain-text golden rendering tests and hardened terminal escape sanitization.
- addedMulti-platform packaging and TypeScript contract test fixtures.
- fixedThe npm package now ships native binaries for all six supported platforms.
@casoon/runemark@0.3.0was an incomplete npm-only release that contained only the macOS arm64 binary; there is no 0.3.0 crate release.
0.2.0
30 July 2026
- changedPublic presentation types are now non-exhaustive so Runemark can extend its semantic vocabulary without a breaking release. This is a breaking change for downstream exhaustive matches and struct literals.
- changedReport internals are split into model and renderer modules while preserving the public
runemark::reportAPI. - fixedDetailed reports now explicitly identify findings that were not provided in the report data instead of implying a complete list.
0.1.1
29 July 2026
- fixedReport rendering now accepts trait-object writers without an intermediate buffer.
0.1.0
29 July 2026
- addedInitial
Console,ColorMode, and semanticToneAPI. - addedTTY-aware color policy with
NO_COLORsupport.