runemarkv0.10.0

Changelog

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

Unreleased

  • changedDocs: the README and the start page cover independent colour, symbol and hyperlink settings, the configurable details hint, the menu's navigation keys and the test helpers.
  • changedContributors: the hero recording is rendered with castwright 0.6.0.

0.10.0

8 November 2026

  • breakingSelect: Item, Group and Hint are #[non_exhaustive], so build them with new and the builder methods. Item::id must be unique within a menu.
  • addedConsole: Console::with_hyperlinks and hyperlinks_enabled switch OSC 8 hyperlinks independently of colour and symbols. They still follow the colour decision by default, so existing output is unchanged.
  • addedReports: Report::with_details_hint changes or removes the "(use --details to view all)" text on a compact "more findings" line. The default text is unchanged.
  • addedAPI: DiffBlock, Location and Badge gain write_to for streaming to any writer.
  • addedSelect: Home, End, PgUp and PgDn jump through the list, and keys typed before the menu opens are discarded.
  • addedNode: the console, render, error and diff options take stream: 'stdout' | 'stderr' to choose which stream color: 'auto' checks, and hyperlinks to switch OSC 8 links independently of colour.
  • addedNode: ReportInput accepts optional scopeNotes, vocabulary, topIssuesThreshold and detailsHint, with the Rust defaults when absent.
  • addednpm: the package has an exports map with a types entry. The native loader is no longer importable, and ESM named imports work.
  • addedDocs: a Testing guide, and guide sections for the top-issue summary, scope and status notes, badges and confidence, and writer-first write_to.
  • addedContributors: scripts/verify.sh runs the CI checks locally, and the repository has issue and pull request templates and monthly Dependabot updates.
  • changedPages: the project site uses the current shared theme (0.12.6).
  • changedSelect: Menu::render and the interactive menu follow the console's SymbolTheme and draw plain ASCII with the ASCII theme.
  • changedSelect: the menu redraws on terminal resize at once instead of at the next keypress.
  • changedSite: the start page gets a "How it renders" section on adaptive report width, next to the existing narrow-terminal example.
  • changedSite: the footer follows the page language instead of always showing German text, and the start page now carries a release teaser and an FAQ (theme 0.11.0).
  • changedReleases: the platform list comes from napi.targets only, release verification checks the build provenance attestations, and the publish job pins npm 11.
  • changedDocs: the README and the guide samples are compiled as doctests, and the crate warns about undocumented public items.
  • changedContributors: the Node tests compare against output rendered by the Rust core (fixtures under tests/fixtures/node-parity), so the byte-for-byte parity claim is tested.
  • fixedConsole: ColorMode::Auto treats an empty NO_COLOR as unset, as no-color.org specifies, and disables colour when TERM=dumb.
  • fixedSelect: Menu::run returns Outcome::Unavailable instead of an error when the process has no controlling terminal.
  • fixedSelect: the filter matches non-ASCII input case-insensitively and ranks by characters instead of bytes.
  • fixedSelect: narrow and short terminals redraw cleanly. The active tab, heading note and footer labels are shortened, and a terminal shorter than the menu chrome still gets one row.
  • fixedNode: metric.trend is validated even without a delta, and numbers that do not fit a u32 or a location.column without line throw instead of wrapping or being dropped.
  • fixednpm: the README and examples use color: 'auto', so NO_COLOR is honoured, and the build instructions install the tooling first.
  • fixedReleases: the npm package carries the MIT licence text, the licence names its holder, and the stray LICENSE-APACHE, which no manifest declared, is gone from the repository and the published crate.
  • fixedReleases: the npm package lock file matches the package version, and the release check covers it.
  • fixedDocs: the colour policy, API table, hyperlink and security pages match the code, and the README no longer states a version of its own. It said 0.3 was released while the crate and the npm package were at 0.9.1.
  • fixedSite: the hero alt text names the progress feature its command needs, and the start page reads platform, Rust and Node facts from the manifests.

0.9.1

26 October 2026

  • addedReleases: the Release workflow publishes the npm package itself through npm trusted publishing, after approval in the npm environment — no npm token is stored anywhere and the package carries a provenance statement. The native binaries carry signed build provenance attestations (gh attestation verify <file> --repo casoon/runemark).
  • addedContributors: examples/hero_demo.rs paces a progress run so there is something to record — every other example is over before a frame lands — and demo/record.sh renders it to assets/hero.svg with castwright. Both directories are excluded from the published crate, the way site/ and docs/ already are.
  • changedDocs: the project is written runemark everywhere, including at the start of a sentence, the way the documentation and the project page already did. README, CONTRIBUTING, the npm package's description and six doc comments had it capitalised.
  • changedSite: the hero shows a recording of that example, the progress bar filling and then the report it ends in, instead of a still of the report alone. An animated SVG with no script, which honours prefers-reduced-motion.
  • changedDocs: the Node contract is documented in one place instead of two. NODE_API.md is gone and its content lives in the project documentation; SECURITY.md keeps the policy and links there for the escape and trust model. Details: Node contract.
  • changedDocs: the selection guide covers picking several entries and the progress guide covers TerminalProgress::is_interactive. Both shipped without a page to point at, which is why their changelog entries carried the detail themselves. Details: Picking several.
  • changedContributors: cargo doc with default features and the Node binding's own test suite pass again. A doc link to Menu::run_multi, which only exists with the select feature, and a "pass" verdict literal where the contract says "passed" had both been failing CI.
  • fixedSelect: a plain cargo build no longer warns that Viewport::new, Viewport::with_width and matching_items are never used. All three are compiled only where the interactive path or a test reaches them; every gate here asks for --all-features, so nothing caught it.
  • fixedDocs: the platform table no longer promises a macOS Intel binary. It has not been built since 0.4.0, so an Intel Mac could not install the npm package the page said it could. Details: Node platforms.
  • fixedSite: the start page states neither a version nor a platform count of its own. It carried 0.3.1 while the crate was at 0.9.0, then npm 0.9.0, which the registry does not have, and six prebuilt Node platforms where five ship. The header carries the version, and the facts row the number the release script owns.

0.9.0

21 September 2026

  • addedSelect: Menu::run_multi picks any number of entries — space ticks the one under the cursor, enter confirms, and Picked::Chosen carries the ticked ids in display order. Confirming with nothing ticked is an answer, not a cancellation. Details: Picking several.
  • addedSelect: Menu::with_ticked starts named entries ticked. Ticks are kept by id, so they survive the filter and switching tabs.

0.8.1

20 September 2026

  • changedCrate: no library changes from 0.8.0. The version exists so the npm package, which shares the crate's version, can carry the Node fix below.
  • fixedNode: a metric's verdict is passed through as MetricInput.verdict. Metric::with_verdict landed in 0.6.0 and was never wired up, so Node callers had only a tone, which is nothing in a pipe or under NO_COLOR. It is applied before an explicit tone, which still wins. Details: Metrics as outcomes.

0.8.0

20 September 2026

  • breakingSelect: Group carries two more public fields, tab and divider, so a literal construction of it no longer compiles. Group::new and the builders are unaffected.
  • addedSelect: Group::in_tab puts a run of groups in one tab rather than one each, and Group::with_divider marks where the row stops being one kind of thing. Inside a shared tab each group keeps its label as a heading, so only the row gets its length back. Details: Groups that share a tab.

0.7.1

20 September 2026

  • fixedCrate: 0.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.
  • fixedNode: the 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

  • addedSelect: Layout::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. The application decides when to ask for the layout. Details: Groups as tabs.
  • addedSelect: Menu::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.
  • changedSelect: Menu::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.
  • changedSelect: the 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". Details: Filtering.

0.6.0

19 September 2026

  • addedReports: Metric::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. An explicit with_tone still wins. Details: Metrics as outcomes.

0.5.2

19 September 2026

  • fixedSelect: a 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

  • fixedSelect: an 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

  • addedSelect: / 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 name as a substring, then as a subsequence (dpl finds deploy), then the description. Details: Filtering.
  • addedSelect: Esc 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.
  • changedSelect: / is reserved and can no longer be bound as a hint key.

0.4.2

19 September 2026

  • fixedSelect: a menu entry longer than the terminal is wide wrapped to column zero, which destroyed the two-column layout. Entries are now shortened to fit, with … marking the cut; wrapping would change how many lines the frame occupies, which the redraw depends on. Details: Terminals smaller than the menu.
  • fixedSelect: where 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

  • fixedSelect: a menu taller than the terminal corrupted the display: the redraw moved up by the full frame height, which a short terminal clamps, so each frame ate the lines above. The body is now windowed, and ↑ N more / ↓ N more mark what is off screen. Details: Terminals smaller than the menu.
  • fixedSelect: the 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: the select feature adds a grouped, keyboard-driven menu (Menu, Group, Item, Hint, Outcome, SelectMode) — the first API in the crate that reads from the terminal. It drives termios directly, so the only dependency is libc and the interactive path is Unix-only. Details: Selection.
  • addedSelect: Menu::render produces the same layout as plain text and needs no feature, so a non-interactive caller has something to show.
  • addedSelect: SelectMode 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. Details: Without a terminal.
  • removednpm: the package no longer ships a macOS Intel binary (darwin-x64). Five targets remain, and packages/runemark/scripts/release-binaries.mjs is the list.

0.3.3

14 September 2026

  • addedProgress: TerminalProgress::is_interactive reports whether a live progress bar is rendered. Details: Progress.
  • fixedProgress: TerminalProgress::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.

0.3.2

14 September 2026

  • changedProgress: the optional indicatif dependency moves to 0.18, which drops the unmaintained number_prefix crate.
  • fixedReports: narrow layouts now wrap a finding's rule id, confidence and location onto continuation lines with the hanging indent instead of overflowing the given width.
  • fixedProgress: the interactive bar no longer flashes one frame in the default indicatif style when an operation starts.

0.3.1

12 September 2026

  • addedNode: native Node.js bindings and the @casoon/runemark TypeScript package, with a versioned, object-oriented API that accepts plain data objects while keeping Rust presentation models internal. Details: Node contract.
  • changedContributors: plain-text golden rendering tests and TypeScript contract test fixtures.
  • fixednpm: the 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. Details: Node platforms.
  • securityConsole: terminal escape sequences in application text are sanitised before they are written. Details: Security.

0.2.0

30 July 2026

  • breakingAPI: public presentation types are now non-exhaustive, so runemark can extend its semantic vocabulary without a breaking release. Downstream exhaustive matches and struct literals no longer compile.
  • changedReports: report internals are split into model and renderer modules while preserving the public runemark::report API.
  • fixedReports: detailed 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

  • fixedReports: rendering now accepts trait-object writers without an intermediate buffer.

0.1.0

29 July 2026

  • addedConsole: initial Console, ColorMode and semantic Tone API, with a TTY-aware colour policy that honours NO_COLOR. Details: Colour policy.