runemarkv0.3.1

Changelog

Generated from CHANGELOG.md in the project repository. Never maintained twice.

0.9.0

21 September 2026

  • addedMenu::run_multi picks any number of entries: space ticks the one under the cursor, enter confirms, and the result is Picked::Chosen with 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_ticked starts named entries ticked.

0.8.1

20 September 2026

  • addedThe Node binding passes a metric's verdict through as MetricInput.verdict. Metric::with_verdict landed in 0.6.0 and was never wired up, so Node callers still had only a tone — which is nothing in a pipe, in CI or under NO_COLOR, where Errors: 3 read exactly like a clean count. It is applied before an explicit tone, which still wins, matching the Rust side.

0.8.0

20 September 2026

  • addedGroup::in_tab puts a run of groups in one tab rather than one each, and Group::with_divider draws 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.
  • changedGroup carries two more public fields, tab and divider, so a literal construction of it no longer compiles. Group::new and the builders are unaffected.

0.7.1

20 September 2026

  • fixed0.7.0 did not compile on Rust 1.85, the version this crate declares. The tab digits were matched with a let chain, which is stable only from 1.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.0 while the crate beside it was 0.7.0, so every workflow that touches bindings/node failed to resolve. Its package version was bumped for the release, its dependency on the crate was not.

0.7.0

19 September 2026

  • addedLayout::Tabs arranges 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-Tab and the digits 1–9 switch 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.
  • addedMenu::with_summary adds 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.
  • changedMenu::render ignores Layout::Tabs and 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

  • addedMetric::with_verdict renders 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 under NO_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 explicit with_tone still 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 / search in 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 / search in 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::render still 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, and Backspace widens the query again. Matching is tiered: the query as a substring of the name, then as a subsequence of it (dpl finds deploy), then as a substring of the description — a name the user is typing towards beats a description that happens to share letters.
  • addedEsc leaves 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 binding q as a hint can still be searched for quality.
  • 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 more and ↓ N more marking 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

  • addedselect feature: 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 is libc and the interactive path is Unix-only — elsewhere Menu::run reports Outcome::Unavailable, which is the same fallback a pipeline takes.
  • addedMenu::render produces the same layout as plain text and needs no feature, so a non-interactive caller has something to show.
  • addedSelectMode follows ColorMode and ProgressMode: Auto is interactive only for a terminal, and a menu that cannot be interactive returns Outcome::Unavailable without blocking on a read.

0.3.3

14 September 2026

  • fixedTerminalProgress::stderr no longer selects the indicatif bar where indicatif hides its output (TERM unset or dumb); every notice was silently dropped there. Such terminals now get plain lifecycle lines.
  • addedTerminalProgress::is_interactive reports 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 indicatif style when an operation starts.
  • changedUpdate the optional indicatif dependency to 0.18 (drops the unmaintained number_prefix crate).

0.3.1

12 September 2026

  • addedNative Node.js bindings and the @casoon/runemark TypeScript 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.0 was 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::report API.
  • 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 semantic Tone API.
  • addedTTY-aware color policy with NO_COLOR support.