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,GroupandHintare#[non_exhaustive], so build them withnewand the builder methods.Item::idmust be unique within a menu. - addedConsole:
Console::with_hyperlinksandhyperlinks_enabledswitch 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_hintchanges or removes the "(use --details to view all)" text on a compact "more findings" line. The default text is unchanged. - addedAPI:
DiffBlock,LocationandBadgegainwrite_tofor streaming to any writer. - addedSelect:
Home,End,PgUpandPgDnjump 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 streamcolor: 'auto'checks, andhyperlinksto switch OSC 8 links independently of colour. - addedNode:
ReportInputaccepts optionalscopeNotes,vocabulary,topIssuesThresholdanddetailsHint, with the Rust defaults when absent. - addednpm: the package has an
exportsmap 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.shruns 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::renderand the interactive menu follow the console'sSymbolThemeand 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.targetsonly, 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::Autotreats an emptyNO_COLORas unset, as no-color.org specifies, and disables colour whenTERM=dumb. - fixedSelect:
Menu::runreturnsOutcome::Unavailableinstead 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.trendis validated even without adelta, and numbers that do not fit au32or alocation.columnwithoutlinethrow instead of wrapping or being dropped. - fixednpm: the README and examples use
color: 'auto', soNO_COLORis 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.3was released while the crate and the npm package were at0.9.1. - fixedSite: the hero alt text names the
progressfeature 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
npmenvironment — 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.rspaces a progress run so there is something to record — every other example is over before a frame lands — anddemo/record.shrenders it toassets/hero.svgwith castwright. Both directories are excluded from the published crate, the waysite/anddocs/already are. - changedDocs: the project is written
runemarkeverywhere, 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.mdis gone and its content lives in the project documentation;SECURITY.mdkeeps 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 docwith default features and the Node binding's own test suite pass again. A doc link toMenu::run_multi, which only exists with theselectfeature, and a"pass"verdict literal where the contract says"passed"had both been failing CI. - fixedSelect: a plain
cargo buildno longer warns thatViewport::new,Viewport::with_widthandmatching_itemsare 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.1while the crate was at0.9.0, thennpm 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_multipicks any number of entries — space ticks the one under the cursor, enter confirms, andPicked::Chosencarries the ticked ids in display order. Confirming with nothing ticked is an answer, not a cancellation. Details: Picking several. - addedSelect:
Menu::with_tickedstarts 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_verdictlanded in0.6.0and was never wired up, so Node callers had only a tone, which is nothing in a pipe or underNO_COLOR. It is applied before an explicittone, which still wins. Details: Metrics as outcomes.
0.8.0
20 September 2026
- breakingSelect:
Groupcarries two more public fields,tabanddivider, so a literal construction of it no longer compiles.Group::newand the builders are unaffected. - addedSelect:
Group::in_tabputs a run of groups in one tab rather than one each, andGroup::with_dividermarks 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.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. - fixedNode: the 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
- addedSelect:
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. The application decides when to ask for the layout. Details: Groups as tabs. - addedSelect:
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. - changedSelect:
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. - 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_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. An explicitwith_tonestill wins. Details: Metrics as outcomes.
0.5.2
19 September 2026
- fixedSelect: a 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
- fixedSelect: an 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
- addedSelect:
/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 name as a substring, then as a subsequence (dplfindsdeploy), then the description. Details: Filtering. - addedSelect:
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. - 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 moremark 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
selectfeature 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 islibcand the interactive path is Unix-only. Details: Selection. - addedSelect:
Menu::renderproduces the same layout as plain text and needs no feature, so a non-interactive caller has something to show. - addedSelect:
SelectModefollowsColorModeandProgressMode:Autois interactive only for a terminal, and a menu that cannot be interactive returnsOutcome::Unavailablewithout blocking on a read. Details: Without a terminal. - removednpm: the package no longer ships a macOS Intel binary (
darwin-x64). Five targets remain, andpackages/runemark/scripts/release-binaries.mjsis the list.
0.3.3
14 September 2026
- addedProgress:
TerminalProgress::is_interactivereports whether a live progress bar is rendered. Details: Progress. - fixedProgress:
TerminalProgress::stderrno longer selects theindicatifbar whereindicatifhides its output (TERMunset ordumb); every notice was silently dropped there. Such terminals now get plain lifecycle lines.
0.3.2
14 September 2026
- changedProgress: the optional
indicatifdependency moves to 0.18, which drops the unmaintainednumber_prefixcrate. - 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
indicatifstyle when an operation starts.
0.3.1
12 September 2026
- addedNode: native Node.js bindings and the
@casoon/runemarkTypeScript 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.0was 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::reportAPI. - 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,ColorModeand semanticToneAPI, with a TTY-aware colour policy that honoursNO_COLOR. Details: Colour policy.