diff --git a/blog/2026-07-04-nushell_v0_114_0.md b/blog/2026-07-04-nushell_v0_114_0.md
new file mode 100644
index 00000000000..f23eb56cbe0
--- /dev/null
+++ b/blog/2026-07-04-nushell_v0_114_0.md
@@ -0,0 +1,2298 @@
+---
+title: Nushell 0.114.0
+author: The Nu Authors
+author_site: https://www.nushell.sh/blog
+author_image: https://www.nushell.sh/blog/images/nu_logo.png
+excerpt: Today, we're releasing version 0.114.0 of Nu. This release brings sharper type checking, POSIX-style `--` option parsing, the new `run` command for pipeline-friendly scripts, and nice built-in support for working with Semantic Versioning.
+---
+
+# Nushell 0.114.0
+
+Today, we're releasing version 0.114.0 of Nu. This release brings sharper type checking, POSIX-style `--` option parsing, the new `run` command for pipeline-friendly scripts, and nice built-in support for working with Semantic Versioning.
+
+# Where to get it
+
+Nu 0.114.0 is available as [pre-built binaries](https://github.com/nushell/nushell/releases/tag/0.114.0) or from [crates.io](https://crates.io/crates/nu). If you have Rust installed you can install it using `cargo install nu`.
+
+As part of this release, we also publish a set of optional [plugins](https://www.nushell.sh/book/plugins.html) you can install and use with Nushell.
+
+# Table of contents
+
+
+
+# Highlights and themes of this release
+
+## The type checker got new glasses
+
+[@Bahex](https://github.com/Bahex) continued tightening up Nushell's type system this release. Commands can now infer output types from pipeline input more precisely, `$in` gets typed from the surrounding pipeline, optional values carry their `nothing`-ness more honestly, and `let` bindings in pipelines no longer have to shrug and call everything `any`.
+
+This means some mistakes move from "surprise, runtime error" to "hey, maybe fix that before running it". Very rude of the parser, but also very helpful.
+
+There is also one important default change: `enforce-runtime-annotations` is now opt-out, so runtime assignment annotations get checked by default.
+
+Read the details in the first [type system entry](#type-system-improvements-1), the second [type system entry](#type-system-improvements), and the note about [`enforce-runtime-annotations`](#promoted-enforce-runtime-annotations-to-opt-out).
+
+## `--` means "no really, stop parsing flags"
+
+Thanks to [@fdncred](https://github.com/fdncred), Nushell commands now understand the classic POSIX `--` end-of-options delimiter. If you need to pass `-weird`, `--looks-like-a-flag`, or similar gremlins as plain positional values, you can now do that without trying to outsmart the parser.
+
+```nushell
+def greet [--upper, name] { if $upper { $name | str uppercase } else { $name } }
+greet -- -Alice
+```
+
+That `-Alice` is now just Alice having a dash day, not an accidental flag.
+
+Take a look at the main [`--` option parsing entry](#added-posix-style-option-parsing-for-nushell-commands) and the follow-up [`--wrapped` fix](#fixed-a-bug-in-option-parsing).
+
+## Scripts can join the pipeline with `run`
+
+The new `run` command from [@fdncred](https://github.com/fdncred) lets a Nushell script behave like a pipeline stage. Pipe data in, let the script transform it, and pipe the result onward. Tiny reusable pipeline workers, basically.
+
+```nushell
+"Hello Nushell!" | run shout.nu | str camel-case
+```
+
+Scripts can be simple bare pipeline transforms or define a `main` entry point, and they run in isolation so their local bits do not leak back into your session.
+
+See more examples [here](#added-run-command-for-using-scripts-in-pipelines).
+
+## SemVer is a real value now
+
+Nushell now has semantic version support, also from [@fdncred](https://github.com/fdncred). You can parse SemVer strings, turn them into records, build them back up, sort them correctly, and bump versions without doing string surgery with safety scissors.
+
+```nushell
+'1.2.3-alpha.1' | into semver | semver bump release
+```
+
+If your scripts deal with releases, package versions, or "is `1.10.0` bigger than `1.2.0`?" moments, this should make life nicer.
+
+Read the full SemVer tour [here](#added-semantic-version-parsing-and-commands).
+
+# Changes
+
+## Breaking changes
+
+### Submodules are no longer implicitly imported
+
+Importing a module no longer implicitly imports its exported sub-modules.
+
+```nushell
+export module foo {
+ export def bar [] {}
+
+ export module sub {
+ export def baz [] {}
+ }
+}
+
+use foo
+foo bar # valid
+foo sub baz # invalid, `sub` is not implicitly imported
+```
+
+To have your modules keep the old behavior, you will need to export the modules contents explicitly:
+
+```nushell
+export module foo {
+ export def bar [] {}
+
+ export module sub {
+ export def baz [] {}
+ }
+ export use sub
+}
+
+use foo
+foo bar # valid
+foo sub baz # valid
+```
+
+::: note
+`use`ing a module inside another module does _not_ run the imported module's `export-env` block.
+
+(See [`export-env` runs only when the use call is evaluated](https://www.nushell.sh/book/modules/creating_modules.html#export-env-runs-only-when-the-use-call-is-evaluated))
+
+Thus, explicit `use`s as recommended above will not run `export-env` blocks, which is inline with how the previous implicit imports worked.
+:::
+
+### Type System Improvements
+
+This release comes with a handful of improvements to the type system, specifically the parse time type checking. But beware! Type annotations that previously seemed fine might raise errors, as they might have been passing only because typing information was insufficient to check it at parse time.
+
+#### Commands' output types are now inferred based on pipeline input type.
+
+```nushell
+let str = "foo" | str uppercase
+let str_list = ["foo", "bar" ] | str uppercase
+
+scope variables
+| where name starts-with '$str'
+| select name type
+```
+
+
+
+
+```ansi:no-line-numbers title="Before"
+[39m╭───┬───────────┬──────╮[0m
+[39m│[0m [1;32m#[0m [39m│[0m [1;32mname[0m [39m│[0m [1;32mtype[0m [39m│[0m
+[39m├───┼───────────┼──────┤[0m
+[39m│[0m [1;32m0[0m [39m│[0m [39m$str[0m [39m│[0m [39many[0m [39m│[0m
+[39m│[0m [1;32m1[0m [39m│[0m [39m$str_list[0m [39m│[0m [39many[0m [39m│[0m
+[39m╰───┴───────────┴──────╯[0m
+```
+
+
+
+
+```ansi:no-line-numbers title="After"
+[39m╭───┬───────────┬──────────────╮[0m
+[39m│[0m [1;32m#[0m [39m│[0m [1;32mname[0m [39m│[0m [1;32mtype[0m [39m│[0m
+[39m├───┼───────────┼──────────────┤[0m
+[39m│[0m [1;32m0[0m [39m│[0m [39m$str[0m [39m│[0m [39mstring[0m [39m│[0m
+[39m│[0m [1;32m1[0m [39m│[0m [39m$str_list[0m [39m│[0m [39mlist[0m [39m│[0m
+[39m╰───┴───────────┴──────────────╯[0m
+```
+
+
+
+
+#### Optional parameters' type now reflects the fact it might be `null`
+
+The (parse time) types of optional parameters and flags _without a default value_ are now a union of their type `T` and `nothing`
+
+- with no default value the type is `oneof`
+- with a default value type is `T`
+
+Demonstrating with LSP inlay hints:
+
+```ansi title="Before - Optional Parameter"
+[38;5;8m [2m 1[22m [38;5;13mdef[38;5;8m [38;5;12mfoo[38;5;8m [38;5;7m[[38;5;9mopt_param[38;5;7m?:[38;5;8m [38;5;11mint[38;5;7m][38;5;8m [38;5;7m{[38;5;8m
+ [2m 2[22m [38;5;13mlet[38;5;8m [38;5;7mvar[38;5;15m[48;5;8m:[38;5;8m [38;5;15mint[38;5;8m[49m [38;5;7m=[38;5;8m [38;5;9m$[38;5;12mopt_param[38;5;8m
+ [2m 3[22m [38;5;7m}[38;5;8m
+ [2m ~[0m
+```
+
+```ansi title="After - Optional Parameter"
+[38;5;8m [2m 1[22m [38;5;13mdef[38;5;8m [38;5;12mfoo[38;5;8m [38;5;7m[[38;5;9mopt_param[38;5;7m?:[38;5;8m [38;5;11mint[38;5;7m][38;5;8m [38;5;7m{[38;5;8m
+ [2m 2[22m [38;5;13mlet[38;5;8m [38;5;7mvar[38;5;15m[48;5;8m:[38;5;8m [38;5;15moneof[38;5;8m[49m [38;5;7m=[38;5;8m [38;5;9m$[38;5;12mopt_param[38;5;8m
+ [2m 3[22m [38;5;7m}[38;5;8m
+ [2m ~[0m
+```
+
+```ansi title="After - Default Parameter"
+[38;5;8m [2m 1[22m [38;5;13mdef[38;5;8m [38;5;12mfoo[38;5;8m [38;5;7m[[38;5;9mopt_param[38;5;7m?:[38;5;8m [38;5;11mint[38;5;8m [38;5;7m=[38;5;8m [38;5;3m42[38;5;7m][38;5;8m [38;5;7m{[38;5;8m
+ [2m 2[22m [38;5;13mlet[38;5;8m [38;5;7mvar[38;5;15m[48;5;8m:[38;5;8m [38;5;15mint[38;5;8m[49m [38;5;7m=[38;5;8m [38;5;9m$[38;5;12mopt_param[38;5;8m
+ [2m 3[22m [38;5;7m}[38;5;8m
+ [2m ~[0m
+```
+
+#### More precise type widening
+
+More type information is preserved. e.g.:
+
+```nushell
+let list = [["a" "b" "c"] [1 2 3]]
+let elem = $list.0
+```
+
+Previously `$elem`'s type would be `list>`, now `$elem`'s type is `oneof, list>`.
+
+#### Operator type checking now accounts of `oneof` types
+
+Nushell as language tries to strike a careful balance between correctness and convenience.
+One should be able to trust nu's type system will help them write correct and robust scripts, but nu shouldn't shouldn't get in the way of a nice REPL experience.
+
+Because of that, some operations that might be invalid but aren't definitely so do not raise parse errors and such checks are delegated to runtime.
+
+For example `int`'s can only be added with `int`'s and `float`'s, yet the following code does not raise parse time error.
+
+```nushell
+def foo [anything: any] {
+ 10 + $anything
+}
+```
+
+But previously, despite being `oneof` being specific than `any`, would be rejected by the type checker for addition to `int`s.
+
+```nushell
+def foo [maybe_int: oneof] {
+ 10 + $maybe_int
+}
+```
+
+```ansi:no-line-numbers
+Error: [31mnu::parser::operator_unsupported_type
+
+[39m [31m×[39m The '+' operator does not work on values of type 'oneof'.
+ ╭─[[22;1;36;4mrepl_entry #2:2:8[22;39;24m]
+ [22;2m1[22m │ def foo [maybe_int: oneof] {
+ [22;2m2[22m │ 10 + $maybe_int
+ · [22;1;35m ┬[33m ─────┬────
+[22;39m · [22;1;35m│[22;39m [22;1;33m╰── oneof
+[22;39m · [22;1;35m╰── does not support 'oneof'
+[22;39m [22;2m3[22m │ }
+ ╰────[m
+```
+
+Now, as long as the two operands have a possibility of being valid for an operation the parse time type checker will accept the expression, leaving errors to runtime type checking.
+
+### Promoted `enforce-runtime-annotations` to opt-out
+
+In Nushell 0.108.0, [`enforce-runtime-annotations`](https://www.nushell.sh/blog/2025-10-15-nushell_v0_108_0.html#enforce-assignment-type-annotations-at-runtime-16079-toc) experimental option was added. With this release `enforce-runtime-annotations` is promoted to being opt-out, meaning that by default this experimental option is enabled now.
+
+This option enforces type checking of let assignments at runtime, catching type errors that might have been missed in parse time type checking due to insufficient type information.
+
+If you experience any trouble with this, you can disable it via the command-line argument:
+
+```nushell
+nu --experimental-options '[enforce-runtime-annotations=false]'
+```
+
+or via the environment variable:
+
+```nushell
+NU_EXPERIMENTAL_OPTIONS="enforce-runtime-annotations=false" nu
+```
+
+### Reedline vi mode improvements
+
+Vi mode now has a proper visual mode: press `v` to start a selection, then use motions together with `d`, `c`, `y`,
+or `r`, including selections that span multiple lines.
+In vi normal mode, the caret now rests on the last grapheme instead of after it,
+and `h` and `l` can move across line boundaries.
+Visual mode also has its own prompt indicator, which defaults to the vi-normal
+indicator.
+
+### Changes to spreadsheet commands: `from xlsx` & `from ods`
+
+This release comes with various improvements to `from xlsx` and `from ods` commands, and makes them behave as similarly as the file formats themselves allow.
+
+#### More accurate command signatures
+
+These commands' signatures previously incorrectly indicated that they return tables.
+They return _records_ that contain _tables_, with a table for each sheet in the file.
+
+Also, signature of the `from ods` command previously had `string` as its input type rather than `binary`. This has been fixed.
+
+#### Support for more data types
+
+Previously importing `datetime` values were supported only for `xlsx` files.
+
+This release not only adds that for `ods` files as well, but also broadens the `datetime` formats that can be imported.
+
+Aside from that, values that couldn't be properly coerced to nushell types were simply imported as `null`. Now those values are imported as `string` or `float` depending on the source data.
+
+#### Finer control over spreadsheet headers
+
+Last release changed `from xlsx` to use the first row of a sheet as the imported table's headers, and added a new flag, `--header-row`, to control which row should be used as the header or if any row should become the headers at all.
+
+This release removes it.
+
+Don't worry! Instead of the `--header-row` flag, `from xlsx` _and_ `from ods` get two new flags that will provide finer control over how spreadsheets are imported:
+
+- `--noheaders`: What it says on the tin, identical to same flag on `from csv`, `from tsv` and `from ssv` commands.
+- `--first-row`: This is where it gets a little interesting. `from xlsx` and `from ods` skip reading all leading empty rows. This is how it has worked for a long time.
+ `--first-row=0` allows you to turn that off and keep those empty lines. It can also be used to start reading from an arbitrary row: `--first-row $n`
+
+Let's see how this works with an example:
+
+- The contents of the file, with all the conveniences like skipping empty rows or auto headers off:
+ ```nushell
+ open example.xlsx --raw
+ | from xlsx --noheaders --first-row 0
+ ```
+ ```ansi :no-line-numbers
+ ╭────────┬───────────────────────────────────────────────╮
+ │ │ ╭───┬─────────┬─────────┬─────────┬─────────╮ │
+ │ [22;1;32mSheet1[22;39m │ │ [22;1;32m#[22;39m │ [22;1;32mcolumn0[22;39m │ [22;1;32mcolumn1[22;39m │ [22;1;32mcolumn2[22;39m │ [22;1;32mcolumn3[22;39m │ │
+ │ │ ├───┼─────────┼─────────┼─────────┼─────────┤ │
+ │ │ │ [22;1;32m0[22;39m │ │ │ │ │ │
+ │ │ │ [22;1;32m1[22;39m │ │ │ │ │ │
+ │ │ │ [22;1;32m2[22;39m │ │ │ │ │ │
+ │ │ │ [22;1;32m3[22;39m │ a │ b │ c │ d │ │
+ │ │ │ [22;1;32m4[22;39m │ 0.00 │ 1.00 │ 2.00 │ 3.00 │ │
+ │ │ │ [22;1;32m5[22;39m │ 10.00 │ 11.00 │ 12.00 │ 13.00 │ │
+ │ │ │ [22;1;32m6[22;39m │ 20.00 │ 21.00 │ 22.00 │ 23.00 │ │
+ │ │ │ [22;1;32m7[22;39m │ 30.00 │ 31.00 │ 32.00 │ 33.00 │ │
+ │ │ ╰───┴─────────┴─────────┴─────────┴─────────╯ │
+ ╰────────┴───────────────────────────────────────────────╯
+ ```
+- How it is imported by default:
+ ```nushell
+ open example.xlsx
+ # or `open example.xlsx --raw | from xlsx`
+ ```
+ ```ansi :no-line-numbers
+ ╭────────┬───────────────────────────────────────╮
+ │ │ ╭───┬───────┬───────┬───────┬───────╮ │
+ │ [22;1;32mSheet1[22;39m │ │ [22;1;32m#[22;39m │ [22;1;32ma[22;39m │ [22;1;32mb[22;39m │ [22;1;32mc[22;39m │ [22;1;32md[22;39m │ │
+ │ │ ├───┼───────┼───────┼───────┼───────┤ │
+ │ │ │ [22;1;32m0[22;39m │ 0.00 │ 1.00 │ 2.00 │ 3.00 │ │
+ │ │ │ [22;1;32m1[22;39m │ 10.00 │ 11.00 │ 12.00 │ 13.00 │ │
+ │ │ │ [22;1;32m2[22;39m │ 20.00 │ 21.00 │ 22.00 │ 23.00 │ │
+ │ │ │ [22;1;32m3[22;39m │ 30.00 │ 31.00 │ 32.00 │ 33.00 │ │
+ │ │ ╰───┴───────┴───────┴───────┴───────╯ │
+ ╰────────┴───────────────────────────────────────╯
+ ```
+ Most of the time, this is what you want.
+- Or if your file doesn't have any headers and all the rows are data:
+ ```nushell
+ open example.xlsx --raw | from xlsx --noheaders
+ ```
+ ```ansi :no-line-numbers
+ ╭────────┬───────────────────────────────────────────────╮
+ │ │ ╭───┬─────────┬─────────┬─────────┬─────────╮ │
+ │ [22;1;32mSheet1[22;39m │ │ [22;1;32m#[22;39m │ [22;1;32mcolumn0[22;39m │ [22;1;32mcolumn1[22;39m │ [22;1;32mcolumn2[22;39m │ [22;1;32mcolumn3[22;39m │ │
+ │ │ ├───┼─────────┼─────────┼─────────┼─────────┤ │
+ │ │ │ [22;1;32m0[22;39m │ a │ b │ c │ d │ │
+ │ │ │ [22;1;32m1[22;39m │ 0.00 │ 1.00 │ 2.00 │ 3.00 │ │
+ │ │ │ [22;1;32m2[22;39m │ 10.00 │ 11.00 │ 12.00 │ 13.00 │ │
+ │ │ │ [22;1;32m3[22;39m │ 20.00 │ 21.00 │ 22.00 │ 23.00 │ │
+ │ │ │ [22;1;32m4[22;39m │ 30.00 │ 31.00 │ 32.00 │ 33.00 │ │
+ │ │ ╰───┴─────────┴─────────┴─────────┴─────────╯ │
+ ╰────────┴───────────────────────────────────────────────╯
+ ```
+
+### Type System Improvements
+
+#### Typed `$in`
+
+`$in` variable is now typed based on the pipeline input type of the surrounding expression.
+
+
+
+
+```ansi:no-line-numbers title="Before. Error is caught at runtime."
+Error: [31mnu::shell::operator_incompatible_types[0m
+
+ [31m×[0m Types 'int' and 'string' are not compatible for the '+' operator.
+ ╭─[[36;1;4msource:1:5[0m]
+ [2m1[0m │ 2 | $in + "foo"
+ · [35;1m ─┬─[0m[33;1m ┬[0m[32;1m ──┬──[0m
+ · [35;1m│[0m [33;1m│[0m [32;1m╰── [32;1mstring[0m[0m
+ · [35;1m│[0m [33;1m╰── [33;1mdoes not operate between 'int' and 'string'[0m[0m
+ · [35;1m╰── [35;1mint[0m[0m
+ ╰────
+```
+
+
+
+
+```ansi:no-line-numbers title="After. Error is caught at parse time."
+Error: [31mnu::parser::operator_incompatible_types[0m
+
+ [31m×[0m Types 'int' and 'string' are not compatible for the '+' operator.
+ ╭─[[36;1;4msource:1:5[0m]
+ [2m1[0m │ 2 | $in + "foo"
+ · [35;1m ─┬─[0m[33;1m ┬[0m[32;1m ──┬──[0m
+ · [35;1m│[0m [33;1m│[0m [32;1m╰── [32;1mstring[0m[0m
+ · [35;1m│[0m [33;1m╰── [33;1mdoes not operate between 'int' and 'string'[0m[0m
+ · [35;1m╰── [35;1mint[0m[0m
+ ╰────
+```
+
+
+
+
+#### Better type inference of `let` bindings
+
+`let` bindings in the middle of a pipeline, or at the end of it, are now properly typed based ont the pipeline input type.
+
+You can observe this using `scope variables`:
+
+```nushell
+42 | let x
+
+scope variables
+| where name == '$x'
+| select name type
+```
+
+```ansi:no-line-numbers
+[39m╭───┬──────┬──────╮[0m
+[39m│[0m [1;32m#[0m [39m│[0m [1;32mname[0m [39m│[0m [1;32mtype[0m [39m│[0m
+[39m├───┼──────┼──────┤[0m
+[39m│[0m [1;32m0[0m [39m│[0m [39m$x[0m [39m│[0m [39mint[0m [39m│[0m
+[39m╰───┴──────┴──────╯[0m
+```
+
+or with LSP type hints:
+
+```ansi:no-line-numbers
+[38;5;3m42[3;90m [23;39m|[3;90m [38;5;13mlet[38;5;8m [38;5;7mvar[38;5;15m[48;5;8m:[38;5;8m [38;5;15mint
+```
+
+This type information is of course passed through to the rest of the pipeline:
+
+```nushell
+def accepts-int []: int -> int {}
+
+"foo" | let x | accepts-int
+```
+
+```ansi:no-line-numbers
+Error: [31mnu::shell::only_supports_this_input_type[0m
+
+ [31m×[0m Input type not supported.
+ ╭─[[36;1;4msource:3:9[0m]
+ [2m2[0m │
+ [2m3[0m │ "foo" | let x | accepts-int
+ · [35;1m ─┬─[0m[33;1m ─────┬─────[0m
+ · [35;1m│[0m [33;1m╰── [33;1monly int input data is supported[0m[0m
+ · [35;1m╰── [35;1minput type: string[0m[0m
+ ╰────
+```
+
+#### Command `def`initions
+
+Type checking and inference inside `def` blocks are now affected by the commands input/output signatures.
+
+```nushell
+def accepts-int []: int -> int {}
+
+def foo []: string -> any {
+ accepts-int
+}
+```
+
+```ansi:no-line-numbers
+Error: [31mnu::parser::input_type_mismatch[0m
+
+ [31m×[0m Command does not support string input.
+ ╭─[[36;1;4msource:4:2[0m]
+ [2m3[0m │ def foo []: string -> any {
+ [2m4[0m │ accepts-int
+ · [35;1m ─────┬─────[0m
+ · [35;1m╰── [35;1mcommand doesn't support string input[0m[0m
+ [2m5[0m │ }
+ ╰────
+```
+
+#### `if-else`, `match`
+
+Conditionals (`if`, `match`) are now properly typed:
+
+- output of the expression is a union of all possible output types (based on the branches)
+
+ ```nushell :line-numbers
+ if $x == $y {
+ 42
+ } else {
+ "foo"
+ }
+ | let out # oneof
+
+ match $x {
+ 1 => 1,
+ 2 => "foo",
+ _ => { {a: 1} }
+ }
+ | let out # oneof>
+ ```
+
+- without a fallback (a final `else` branch for `if` chains, a wildcard pattern for `match` expressions) the output types of conditional expressions include `nothing`
+
+ ```nushell :line-numbers
+ if $x == $y {
+ 42
+ }
+ | let out # oneof
+
+ match $x {
+ 1 => 1,
+ 2 => "foo",
+ }
+ | let out # oneof
+ ```
+
+- branch blocks get pipeline input type information
+ ```nushell :line-numbers
+ [1, 2, 3]
+ | if true {
+ let input # list
+ $input | into string
+ } else {
+ # pass through
+ }
+ | let out # oneof, list>
+ ```
+
+### Errors with more `details` and file relative spans
+
+The error record you receive in `try {..} catch {..}` blocks no longer has a `json` field. A new field named `details` takes its place instead. It holds the same information as the `json` field but requires no deserialization stop like `from json`.
+
+There is one small but significant difference: the error labels now have additional `location` field in addition to `span`.
+`location` contains the name of the file the label points to, with `start` and `end` offsets that are relative to the file itself.
+
+```nushell :line-numbers title="example.nu"
+use std/assert
+
+export def wrong [] {
+ assert equal (2 + 2) 5
+}
+```
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36muse[22m[39m [32mexample.nu[0m
+> [1m[36mwrong[22m[39m
+Error: [31mnu::shell::error
+[39m
+ [31m×[39m These are not equal.
+ ╭─[[1m[4m[36m/tmp/example.nu:4:16[22m[24m[39m]
+ [2m3[22m │ export def wrong [] {
+ [2m4[22m │ assert equal (2 + 2) 5
+ · [1m[35m ───┬───[33m ┬[22m[39m
+ · [1m[35m│[22m[39m [1m[33m╰── right: 5[22m[39m
+ · [1m[35m╰── left: 4[22m[39m
+ [2m5[22m │ }
+ ╰────
+[38;5;14m
+> [1m[36mtry[22m[39m [1m[34m{ [36mwrong[34m }[22m[39m [1m[36mcatch[22m[39m [1m[32m{ [36mget[22m[39m [32mdetails[1m }[22m[39m
+╭─────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────╮
+│ [1m[32mmsg[22m[39m │ These are not equal. │
+│ │ ╭───┬──────────┬────────────────────┬────────────────────────────────────────────────────╮ │
+│ [1m[32mlabels[22m[39m │ │ [1m[32m#[22m[39m │ [1m[32mtext[22m[39m │ [1m[32mspan[22m[39m │ [1m[32mlocation[22m[39m │ │
+│ │ ├───┼──────────┼────────────────────┼────────────────────────────────────────────────────┤ │
+│ │ │ [1m[32m0[22m[39m │ left: 4 │ ╭───────┬────────╮ │ ╭───────┬────────────────────────────────────────╮ │ │
+│ │ │ │ │ │ [1m[32mstart[22m[39m │ 170639 │ │ │ [1m[32mfile[22m[39m │ D:\Projects\nushell\scratch\example.nu │ │ │
+│ │ │ │ │ │ [1m[32mend[22m[39m │ 170646 │ │ │ [1m[32mstart[22m[39m │ 56 │ │ │
+│ │ │ │ │ ╰───────┴────────╯ │ │ [1m[32mend[22m[39m │ 63 │ │ │
+│ │ │ │ │ │ ╰───────┴────────────────────────────────────────╯ │ │
+│ │ │ [1m[32m1[22m[39m │ right: 5 │ ╭───────┬────────╮ │ ╭───────┬────────────────────────────────────────╮ │ │
+│ │ │ │ │ │ [1m[32mstart[22m[39m │ 170647 │ │ │ [1m[32mfile[22m[39m │ D:\Projects\nushell\scratch\example.nu │ │ │
+│ │ │ │ │ │ [1m[32mend[22m[39m │ 170648 │ │ │ [1m[32mstart[22m[39m │ 64 │ │ │
+│ │ │ │ │ ╰───────┴────────╯ │ │ [1m[32mend[22m[39m │ 65 │ │ │
+│ │ │ │ │ │ ╰───────┴────────────────────────────────────────╯ │ │
+│ │ ╰───┴──────────┴────────────────────┴────────────────────────────────────────────────────╯ │
+│ [1m[32mcode[22m[39m │ │
+│ [1m[32murl[22m[39m │ │
+│ [1m[32mhelp[22m[39m │ │
+│ [1m[32minner[22m[39m │ [list 0 items] │
+╰─────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────╯[0m
+```
+
+With these file relative spans, making external tools for reporting nushell errors should be much easier.
+
+### Removed deprecated `grid` record input support
+
+In the last release, `grid` command was modified to accept a column name argument rather than implicitly displaying the `name` column. The implicit assumption of `name` was deprecated, along with accepting a single record rather than a table.
+These deprecated behaviors of `grid` command is removed with this release.
+
+```nushell
+# This will no longer work.
+{ name: test } | grid
+
+# And should be updated to receive tables and include the column name as an argument.
+[{ name: test }] | grid name
+```
+
+### Standard library improvements
+
+- Following general type system improvements, standard library commands now also have more accurate type annotations.
+
+- `std/iter find-index` returns `null` instead of `-1` when failing to find a suitable element
+
+#### `std/iter scan` now has the same signature as `reduce`
+
+::: warning
+This is a breaking change.
+:::
+
+Previously `iter scan` always needed an initial value to start off of (equivalent to `reduce`'s `--fold`), and to compensate for it a `--noinit` flag to remove that initial value from the output.
+
+Now it's signature is identical to `reduce`:
+
+
+
+
Before
+
+
+```nushell
+[1 2 3] | iter scan 0 {|x, y| $x + $y}
+```
+
+
+
+
+```nushell
+[1 2 3] | iter scan 0 --noinit {|x, y| $x + $y}
+```
+
+
+
After
+
+
+```nushell
+[1 2 3] | iter scan --fold 0 {|x, y| $x + $y}
+```
+
+
+
+
+```nushell
+[1 2 3] | iter scan {|x, y| $x + $y}
+```
+
+
+
+Output
+
+
+
+```nushell
+[0, 1, 3, 6]
+```
+
+
+
+
+```nushell
+[1, 3, 6]
+```
+
+
+
+
+
+#### More streaming
+
+The following commands now stream:
+
+- `std/iter`:
+ - `intersperse`
+ - `flat-map`
+- `std-rfc/conversion`
+ - `into list`
+- `std-rfc/tables`
+ - `select column-slices`
+ - `reject column-slices`
+
+These commands don't really "stream", in that they don't return a stream. Instead they now avoid eagerly collecting input streams:
+
+- `std-rfc/conversions`
+ - `name-values`: strictly an internal change with possible performance benefits
+- `std-rfc/iter`
+ - `only`: will at most consume 2 items from the input
+
+### Other breaking changes
+
+- We changed how "hits" are displayed by making them relative to the cwd in the hopes that it makes them more usable. It works this way for `idx find` and `idx search`. ([#18477](https://github.com/nushell/nushell/pull/18477))
+
+## Additions
+
+### KDL format support
+
+This release adds support for KDL `v2.0.0` with `to kdl` and `from kdl` commands.
+
+```ansi:no-line-numbers
+[96m> [32m'
+hello 1 2 3
+
+// Comment
+world prop=string-value {
+[39m [32mchild 1
+[39m [32mchild 2
+[39m [32mchild #inf
+}
+'
+[22;1;35m|[22;39m [22;1;36mfrom kdl
+[22;39m╭───┬───────┬────────────────┬─────────────────────────┬──────────────────────────────────────────────────────────────────╮
+│ [22;1;32m#[22;39m │ [22;1;32mname[22;39m │ [22;1;32margs[22;39m │ [22;1;32mprops[22;39m │ [22;1;32mchildren[22;39m │
+├───┼───────┼────────────────┼─────────────────────────┼──────────────────────────────────────────────────────────────────┤
+│ [22;1;32m0[22;39m │ hello │ ╭───┬───╮ │ {record 0 fields} │ [list 0 items] │
+│ │ │ │ [22;1;32m0[22;39m │ 1 │ │ │ │
+│ │ │ │ [22;1;32m1[22;39m │ 2 │ │ │ │
+│ │ │ │ [22;1;32m2[22;39m │ 3 │ │ │ │
+│ │ │ ╰───┴───╯ │ │ │
+│ [22;1;32m1[22;39m │ world │ [list 0 items] │ ╭──────┬──────────────╮ │ ╭───┬───────┬─────────────┬───────────────────┬────────────────╮ │
+│ │ │ │ │ [22;1;32mprop[22;39m │ string-value │ │ │ [22;1;32m#[22;39m │ [22;1;32mname[22;39m │ [22;1;32margs[22;39m │ [22;1;32mprops[22;39m │ [22;1;32mchildren[22;39m │ │
+│ │ │ │ ╰──────┴──────────────╯ │ ├───┼───────┼─────────────┼───────────────────┼────────────────┤ │
+│ │ │ │ │ │ [22;1;32m0[22;39m │ child │ ╭───┬───╮ │ {record 0 fields} │ [list 0 items] │ │
+│ │ │ │ │ │ │ │ │ [22;1;32m0[22;39m │ 1 │ │ │ │ │
+│ │ │ │ │ │ │ │ ╰───┴───╯ │ │ │ │
+│ │ │ │ │ │ [22;1;32m1[22;39m │ child │ ╭───┬───╮ │ {record 0 fields} │ [list 0 items] │ │
+│ │ │ │ │ │ │ │ │ [22;1;32m0[22;39m │ 2 │ │ │ │ │
+│ │ │ │ │ │ │ │ ╰───┴───╯ │ │ │ │
+│ │ │ │ │ │ [22;1;32m2[22;39m │ child │ ╭───┬─────╮ │ {record 0 fields} │ [list 0 items] │ │
+│ │ │ │ │ │ │ │ │ [22;1;32m0[22;39m │ inf │ │ │ │ │
+│ │ │ │ │ │ │ │ ╰───┴─────╯ │ │ │ │
+│ │ │ │ │ ╰───┴───────┴─────────────┴───────────────────┴────────────────╯ │
+╰───┴───────┴────────────────┴─────────────────────────┴──────────────────────────────────────────────────────────────────╯
+```
+
+### Introducing `polars map-batches`
+
+Provides a new polars command `polars map-batches` that provides the ability to map a custom Nushell closure over one or more dataframe columns.
+
+```ansi :no-line-numbers title="Return a constant series from a closure"
+[38;5;14m> [1m[34m[[[22m[32ma[1m[34m [22m[32mb[1m[34m]; [[35m1[34m [35m4[34m] [[35m2[34m [35m5[34m] [[35m3[34m [35m6[34m]][35m
+|[22m[39m [1m[36mpolars into-df[35m
+|[22m[39m [1m[36mpolars map-batches[22m[39m [1m[34m--name[22m[39m [32mout[39m [1m[32m{ [36m[[35m10[36m [35m20[36m [35m30[36m][32m }[22m[39m [32ma[39m
+╭───┬─────╮
+│ [1m[32m#[22m[39m │ [1m[32mout[22m[39m │
+├───┼─────┤
+│ [1m[32m0[22m[39m │ 10 │
+│ [1m[32m1[22m[39m │ 20 │
+│ [1m[32m2[22m[39m │ 30 │
+╰───┴─────╯[0m
+```
+
+```ansi :no-line-numbers title="Double the values of a column via a Nushell closure"
+[38;5;14m> [1m[34m[[[22m[32ma[1m[34m [22m[32mb[1m[34m]; [[35m1[34m [35m4[34m] [[35m2[34m [35m5[34m] [[35m3[34m [35m6[34m]][35m
+|[22m[39m [1m[36mpolars into-df[35m
+|[22m[39m [1m[36mpolars map-batches[22m[39m [1m[32m{|cols| [22m[35m$cols[39m [1m[35m|[22m[39m [1m[36mfirst[22m[39m [1m[35m|[22m[39m [1m[36mpolars get[22m[39m [32ma[39m [1m[35m|[22m[39m [1m[36meach[22m[39m [1m[34m{ [22m[35m$in[39m [33m*[39m [1m[35m2[34m }[32m}[22m[39m [32ma[39m
+╭───┬───╮
+│ [1m[32m#[22m[39m │ [1m[32ma[22m[39m │
+├───┼───┤
+│ [1m[32m0[22m[39m │ 2 │
+│ [1m[32m1[22m[39m │ 4 │
+│ [1m[32m2[22m[39m │ 6 │
+╰───┴───╯[0m
+```
+
+```ansi :no-line-numbers title="Sum two columns element-wise and rename result"
+[38;5;14m> [1m[34m[[[22m[32ma[1m[34m [22m[32mb[1m[34m]; [[35m1[34m [35m4[34m] [[35m2[34m [35m5[34m] [[35m3[34m [35m6[34m]][35m
+|[22m[39m [1m[36mpolars into-df[35m
+|[22m[39m [1m[36mpolars map-batches[22m[39m [1m[34m--name[22m[39m [32ma_plus_b[39m [1m[32m{ |cols|
+ [36mlet[22m[39m [35ma[39m = [35m$cols[39m [1m[35m|[22m[39m [1m[36mget[22m[39m [1m[35m0[22m[39m [1m[35m|[22m[39m [1m[36mpolars get[22m[39m [32ma[39m
+ [1m[36mlet[22m[39m [35mb[39m = [35m$cols[39m [1m[35m|[22m[39m [1m[36mget[22m[39m [1m[35m1[22m[39m [1m[35m|[22m[39m [1m[36mpolars get[22m[39m [32mb[39m
+ [35m$a[39m [1m[35m|[22m[39m [1m[36mzip[22m[39m [35m$b[39m [1m[35m|[22m[39m [1m[36meach[22m[39m [1m[32m{ |pair| [22m[35m$pair[39m.[1m[35m0[22m[39m [33m+[39m [35m$pair[39m.[1m[35m1[32m }
+}[22m[39m [32ma[39m [32mb[39m
+╭───┬──────────╮
+│ [1m[32m#[22m[39m │ [1m[32ma_plus_b[22m[39m │
+├───┼──────────┤
+│ [1m[32m0[22m[39m │ 5 │
+│ [1m[32m1[22m[39m │ 7 │
+│ [1m[32m2[22m[39m │ 9 │
+╰───┴──────────╯[0m
+```
+
+### Add `commandline complete` to invoke nushell completions
+
+Add `commandline complete` command. This can be used to obtain the suggestions that nushell itself would normally suggest. Some examples:
+
+- `commandline complete` — return completions based on the current commandline contents (i.e. what would be suggested when pressing `Tab`)
+- `'./a' | commandline complete --type directory` — return directory paths relative to the current directory that start with `a`
+- `'%ls -' | commandline complete --detailed` — return all flags the builtin `ls` command accepts, including their descriptions.
+
+These completions can be used in custom command completions, for example to wrap a builtin command with additional options, or to obtain a list of suggested paths for further filtering or processing.
+
+### Add `--pretty` flag and align table columns in `to nuon`
+
+`to nuon` now aligns table columns when using `--indent`, `--tabs`, or the new `--pretty` (`-p`) flag, making output easier to read. `--pretty` is shorthand for `--indent 2`.
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[34m[[[22m[32mname[1m[34m, [22m[32mage[1m[34m]; [[22m[32mAlice[1m[34m, [35m30[34m], [[22m[32mBob[1m[34m, [35m25[34m]][22m[39m [1m[35m|[22m[39m [1m[36mto nuon[22m[39m [1m[34m--pretty[22m[39m
+[
+ [name, age];
+ [Alice, 30],
+ [Bob, 25]
+][0m
+```
+
+### Added `run` command for using scripts in pipelines
+
+There's a new command named `run` that allows scripts to participate in a nushell pipeline with input and output.
+
+It keeps execution isolated so script artifacts do not leak into the parent scope. Script resolution remains aligned with existing behavior (cwd / `NU_LIB_DIRS` / explicit paths); `PATH`-based lookup is not included at this time.
+
+#### Script Forms Supported
+
+##### Bare scripts (scripts without def main)
+
+The script body is evaluated directly as a pipeline transform (using implicit or explicit `$in` as usual).
+
+```nushell title="run-script1.nu"
+str uppercase
+```
+
+```ansi
+[38;5;14m> [32m"Hello Nushell!"[39m [1m[35m|[22m[39m [1m[36mrun[22m[39m [36mrun-script1.nu[39m
+HELLO NUSHELL![0m
+```
+
+##### Scripts with `def main` entry point
+
+If a top-level `def main` is defined, run invokes that entrypoint.
+
+```nushell title="run-script2.nu"
+def main [] {
+ str length
+}
+```
+
+```ansi
+[38;5;14m> [32m"Hello Nushell!"[39m [1m[35m|[22m[39m [1m[36mrun[22m[39m [36mrun-script2.nu[39m
+14[0m
+```
+
+##### Scripts with full pipelines
+
+```ansi
+[38;5;14m> [32m"Hello Nushell!"[39m [1m[35m|[22m[39m [1m[36mrun[22m[39m [36mrun-script1.nu[39m [1m[35m|[22m[39m [1m[36mstr camel-case[22m[39m
+helloNushell[38;5;14m
+> [32m"Hello Nushell!"[39m [1m[35m|[22m[39m [1m[36mrun[22m[39m [36mrun-script2.nu[39m [1m[35m|[22m[39m [35m$in[39m [33m+[39m [1m[35m5[22m[39m
+19[0m
+```
+
+### Added POSIX-style `--` option parsing for Nushell commands
+
+Nushell now supports the POSIX `--` end-of-options delimiter for built-in commands, custom commands, and `def --wrapped` commands.
+
+When `--` appears in a command invocation, it stops all flag parsing. Any arguments after `--` are treated as positional operands, even if they start with `-` or `--`. The `--` token itself is consumed and does not appear in the command's arguments.
+
+```ansi title="Pass dash-prefixed values as positional args, not flags"
+[38;5;14m> [0m [1m[36mdef[22m[39m [32mgreet[39m [1m[32m[--upper, name][22m[39m [1m[32m{
+ [36mif[22m[39m [35m$upper[39m [1m[34m{ [22m[35m$name[39m [1m[35m|[22m[39m [1m[36mstr uppercase[34m }[22m[39m [1m[36melse[22m[39m [1m[34m{ [22m[35m$name[1m[34m }[32m
+}[22m[38;5;14m
+> [1m[36mgreet[22m[39m -- [32m-Alice[39m # -Alice is now a positional, not an unknown flag
+-Alice[0m
+```
+
+```ansi title="Useful for passing flag-like values to rest parameters"
+[38;5;14m> [1m[36mdef[22m[39m [32mprocess[39m [1m[32m[...args][22m[39m [1m[32m{ [22m[35m$args[1m[32m }[22m[38;5;14m
+> [1m[36mprocess[22m[39m -- [32m--verbose[39m [32m-x[39m [32mfoo[39m # -- consumed; args = ["--verbose", "-x", "foo"]
+╭───┬───────────╮
+│ [1m[32m0[22m[39m │ --verbose │
+│ [1m[32m1[22m[39m │ -x │
+│ [1m[32m2[22m[39m │ foo │
+╰───┴───────────╯[0m
+```
+
+```ansi title="Works with def --wrapped too"
+[38;5;14m> [1m[36mdef[22m[39m [1m[34m--wrapped[22m[39m [32mmy-git[39m [1m[32m[...args][22m[39m [1m[32m{ [36mprint[22m[39m [33m...[35m$args[1m[32m }[22m[38;5;14m
+> [1m[36mmy-git[22m[39m [1m[32mcommit[22m[39m [1m[32m--[22m[39m [1m[32m-m[22m[39m [1m[32m"my message"[22m[39m # -- NOT consumed; -m passed as operand
+commit
+--
+-m
+my message[0m
+```
+
+For `extern`-declared known external commands, `--` continues to be passed through to the external binary unchanged (as those programs manage their own argument parsing).
+
+### Added stream and error controls to `ignore`
+
+Update the `ignore` command with flags to control whether stderr, stdout, or both get consumed and if errors are show which update `$env.LAST_EXIT_CODE`. This should work on internal and external commands.
+
+Existing behavior is the default when no new flags are provided to avoid breaking changes.
+
+- Added `--stderr` (`-e`) to consume stderr while allowing stdout to pass through.
+- Added `--stdout` (`-o`) to consume stdout while allowing stderr output through.
+- Added `--show-errors` (`-x`) to show external/internal errors and set `$env.LAST_EXIT_CODE` (external exit code for external failures, `1` for internal failures).
+
+### Added `--context` support to `idx search`
+
+Add context to your `idx search` queries by using `--context/-c` and a nushell range. The range has to be in the form of `negative_number..positive_number` where `negative_number` is the before lines to show and the `positive_number` is the after lines to show in the `with_context` record key.
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36midx search[22m[39m [32mfoo[39m [1m[34m--context[22m[39m [1m[35m-3[22m[33m..[1m[35m5[22m[39m [1m[35m|[22m[39m [1m[36mfirst[22m[39m
+╭───────────────┬─────────────────────────────────────────────────────────────────────────────────────────────╮
+│ [1m[32mrelative_path[22m[39m │ crates\nu-utils\src\default_files\doc_config.nu │
+│ [1m[32mline_number[22m[39m │ 249 │
+│ [1m[32mcolumn[22m[39m │ 51 │
+│ [1m[32mbyte_offset[22m[39m │ 10991 │
+│ [1m[32mline[22m[39m │ # Example: If a directory contains only "forage", "food", and "forest", │
+│ │ ╭───┬───────┬───────╮ │
+│ [1m[32mmatches[22m[39m │ │ [1m[32m#[22m[39m │ [1m[32mstart[22m[39m │ [1m[32mend[22m[39m │ │
+│ │ ├───┼───────┼───────┤ │
+│ │ │ [1m[32m0[22m[39m │ 11042 │ 11045 │ │
+│ │ ╰───┴───────┴───────╯ │
+│ │ ╭───┬─────────────────────────────────────────────────────────────────────────────────────╮ │
+│ [1m[32mwith_context[22m[39m │ │ [1m[32m0[22m[39m │ # Default: true │ │
+│ │ │ [1m[32m1[22m[39m │ $env.config.completions.partial = true │ │
+│ │ │ [1m[32m2[22m[39m │ │ │
+│ │ │ [1m[32m3[22m[39m │ # Example: If a directory contains only "forage", "food", and "forest", │ │
+│ │ │ [1m[32m4[22m[39m │ # typing "ls " and pressing Tab will partially complete the first matching letters. │ │
+│ │ │ [1m[32m5[22m[39m │ # If the directory also includes "faster", only "f" would be partially completed. │ │
+│ │ │ [1m[32m6[22m[39m │ │ │
+│ │ │ [1m[32m7[22m[39m │ # completions.use_ls_colors (bool): Apply LS_COLORS to file/path completions. │ │
+│ │ │ [1m[32m8[22m[39m │ # true: Use LS_COLORS for styling file completions. │ │
+│ │ ╰───┴─────────────────────────────────────────────────────────────────────────────────────╯ │
+╰───────────────┴─────────────────────────────────────────────────────────────────────────────────────────────╯[0m
+```
+
+### Allowed `idx search --context` to accept counts or ranges
+
+This change allows `idx search --context` to be supplied as either an `int` or as a `range`.
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36midx search[22m[39m [32mfoo[39m [1m[34m--context[22m[39m [1m[35m2[22m[39m [1m[35m|[22m[39m [1m[36mfirst[22m[39m
+╭───────────────┬─────────────────────────────────────────────────────────────────────────────────────────────╮
+│ [1m[32mrelative_path[22m[39m │ crates\nu-utils\src\default_files\doc_config.nu │
+│ [1m[32mline_number[22m[39m │ 249 │
+│ [1m[32mcolumn[22m[39m │ 51 │
+│ [1m[32mbyte_offset[22m[39m │ 10991 │
+│ [1m[32mline[22m[39m │ # Example: If a directory contains only "forage", "food", and "forest", │
+│ │ ╭───┬───────┬───────╮ │
+│ [1m[32mmatches[22m[39m │ │ [1m[32m#[22m[39m │ [1m[32mstart[22m[39m │ [1m[32mend[22m[39m │ │
+│ │ ├───┼───────┼───────┤ │
+│ │ │ [1m[32m0[22m[39m │ 11042 │ 11045 │ │
+│ │ ╰───┴───────┴───────╯ │
+│ │ ╭───┬─────────────────────────────────────────────────────────────────────────────────────╮ │
+│ [1m[32mwith_context[22m[39m │ │ [1m[32m0[22m[39m │ $env.config.completions.partial = true │ │
+│ │ │ [1m[32m1[22m[39m │ │ │
+│ │ │ [1m[32m2[22m[39m │ # Example: If a directory contains only "forage", "food", and "forest", │ │
+│ │ │ [1m[32m3[22m[39m │ # typing "ls " and pressing Tab will partially complete the first matching letters. │ │
+│ │ │ [1m[32m4[22m[39m │ # If the directory also includes "faster", only "f" would be partially completed. │ │
+│ │ ╰───┴─────────────────────────────────────────────────────────────────────────────────────╯ │
+╰───────────────┴─────────────────────────────────────────────────────────────────────────────────────────────╯[0m
+```
+
+### Introducing Polars bitwise commands
+
+Introducing polars bitwise commands:
+
+- `polars math bitwise-and` - Perform an aggregation of bitwise ANDs over a column expression.
+- `polars math bitwise-count-ones` - Compute the number of set bits for each element in an integer column expression.
+- `polars math bitwise-count-zeros` - Compute the number of unset bits for each element in an integer column expression.
+- `polars math bitwise-leading-ones` - Compute the number of leading set bits for each element in an integer column expression.
+- `polars math bitwise-leading-zeros` - Compute the number of leading unset bits for each element in an integer column expression.
+- `polars math bitwise-or` - Perform an aggregation of bitwise ORs over a column expression.
+- `polars math bitwise-trailing-ones` - Compute the number of trailing set bits for each element in an integer column expression.
+- `polars math bitwise-trailing-zeros` - Compute the number of trailing unset bits for each element in an integer column expression.
+- `polars math bitwise-xor` - Perform an aggregation of bitwise XORs over a column expression.
+
+### Add non UTF-8 text support for `url encode`/`url decode`
+
+- `url encode` can now encode binary input too, adding support for encoding non UTF-8 texts
+
+ ```ansi
+ [38;5;14m> [32m'£ rates'[39m [1m[35m|[22m[39m [1m[36mencode[22m[39m [32miso-8859-1[39m [1m[35m|[22m[39m [1m[36murl encode[22m[39m
+ %A3%20rates[0m
+ ```
+
+- `url decode` can now decode inputs that do not evaluate to UTF-8 texts by returning a binary value (only with the `--binary` switch)
+ ```ansi
+ [38;5;14m> [32m'%A3%20rates'[39m [1m[35m|[22m[39m [1m[36murl decode[22m[39m [1m[34m--binary[22m[39m [1m[35m|[22m[39m [1m[36mdecode[22m[39m [32miso-8859-1[39m
+ £ rates[0m
+ ```
+
+### Support reedline menu input/output modes and list description position
+
+Reedline menus can now be configured with `input_mode` (`diff`, `cursor_prefix`, `full_buffer`) and `output_mode` (`suggested_span`, `full_buffer`, `extend_to_end`) to control what text the menu reads from the buffer and how an accepted suggestion is written back.
+List menus additionally accept `description_position` (`before` / `after`). The existing `only_buffer_difference` flag still works and is treated as a shorthand (`true = diff`, `false = cursor_prefix`).
+
+### Added `random pass` for generating passwords
+
+New command `random pass` generates random passwords.
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[35m0[22m[33m..[1m[35m10[22m[39m [1m[35m|[22m[39m [1m[36meach[22m[39m [1m[32m{[36mrandom pass[32m}[22m[39m
+╭────┬──────────────╮
+│ [1m[32m0[22m[39m │ WR9+*T4em#&2 │
+│ [1m[32m1[22m[39m │ >~z$0I-E<3&x │
+│ [1m[32m2[22m[39m │ "%uF9qafB%+{ │
+│ [1m[32m3[22m[39m │ VMI5h+T4,XcX │
+│ [1m[32m4[22m[39m │ B,diE+Z`#O6g │
+│ [1m[32m5[22m[39m │ 9fKehf4|F,xr │
+│ [1m[32m6[22m[39m │ 6d?nH1|HV^ck │
+│ [1m[32m7[22m[39m │ iH>5l?`P7q2x │
+│ [1m[32m8[22m[39m │ w>w2I(v67=9E │
+│ [1m[32m9[22m[39m │ QYqc}g8ux#!U │
+│ [1m[32m10[22m[39m │ #Jla4UAoJ+: Length of the generated password (default 12).
+ [36m-u[39m, [36m--no-uppercase[39m: Exclude uppercase letters A-Z.
+ [36m-l[39m, [36m--no-lowercase[39m: Exclude lowercase letters a-z.
+ [36m-n[39m, [36m--no-numbers[39m: Exclude numbers 0-9.
+ [36m-s[39m, [36m--no-symbols[39m: Exclude symbols like !@#$%.
+ [36m--include-ambiguous[39m: Include ambiguous characters O, 0, l, 1.
+ [36m--include-similar[39m: Include similar characters i, l, 1.
+ [36m--require-each-type[39m: Guarantee at least one char from each enabled character type.[0m
+```
+
+### Allow `is-terminal` to detect redirection
+
+The `is-terminal` command can detect redirection now. It now defaults to `--stdout`.
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36mis-terminal[22m[39m
+true[38;5;14m
+> [1m[36mis-terminal[22m[39m [1m[35m|[22m[39m [35m$in[39m
+false[38;5;14m
+> [1m[36mis-terminal[22m[39m [1m[35mo>[22m[39m [32mfile[38;5;14m
+> [1m[36mopen[22m[39m [1m[36mfile[22m[39m
+false[38;5;14m
+> [1m[36mlet[22m[39m [35mx[39m = [1m[34m([36mis-terminal[34m)[22m[38;5;14m
+> [35m$x[39m
+false[0m
+```
+
+### Added `--right` to `split row` and `split column`
+
+Both `split row` and `split column` now support `--right`, which modifies where splits are skipped, e.g.:
+
+```ansi :no-line-numbers
+[38;5;14m> [32m'some-package-1.0'[39m [1m[35m|[22m[39m [1m[36msplit row[22m[39m [32m'-'[39m [1m[34m--number[22m[39m [1m[35m2[22m[39m
+╭───┬─────────────╮
+│ [1m[32m0[22m[39m │ some │
+│ [1m[32m1[22m[39m │ package-1.0 │
+╰───┴─────────────╯[38;5;14m
+> [32m'some-package-1.0'[39m [1m[35m|[22m[39m [1m[36msplit row[22m[39m [32m'-'[39m [1m[34m--number[22m[39m [1m[35m2[22m[39m [1m[34m--right[22m[39m
+╭───┬──────────────╮
+│ [1m[32m0[22m[39m │ some-package │
+│ [1m[32m1[22m[39m │ 1.0 │
+╰───┴──────────────╯[0m
+```
+
+### Added some commands for set operations and combinations
+
+Added `union`, `intersect`, `difference`, `combinations`, and `permutations` as built-in filter commands. These provide immutable, functional list operations.
+
+`union`: Returns a deduplicated list of unique elements present in either the input list or the given list.
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36m[[35m1[36m [35m2[36m [35m3[36m [35m4[36m][22m[39m [1m[35m|[22m[39m [1m[36munion[22m[39m [1m[36m[[35m3[36m [35m4[36m [35m5[36m [35m6[36m][22m[39m
+╭───┬───╮
+│ [1m[32m0[22m[39m │ 1 │
+│ [1m[32m1[22m[39m │ 2 │
+│ [1m[32m2[22m[39m │ 3 │
+│ [1m[32m3[22m[39m │ 4 │
+│ [1m[32m4[22m[39m │ 5 │
+│ [1m[32m5[22m[39m │ 6 │
+╰───┴───╯[38;5;14m
+> [1m[36m[{[22m[32ma[1m[36m:[35m1[36m} {[22m[32ma[1m[36m:[35m2[36m}][22m[39m [1m[35m|[22m[39m [1m[36munion[22m[39m [1m[36m[{[22m[32ma[1m[36m:[35m2[36m} {[22m[32ma[1m[36m:[35m3[36m}][22m[39m
+╭───┬───╮
+│ [1m[32m#[22m[39m │ [1m[32ma[22m[39m │
+├───┼───┤
+│ [1m[32m0[22m[39m │ 1 │
+│ [1m[32m1[22m[39m │ 2 │
+│ [1m[32m2[22m[39m │ 3 │
+╰───┴───╯[0m
+```
+
+`intersect`: Returns a deduplicated list of unique elements present in both the input list and the given list.
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36m[[35m1[36m [35m2[36m [35m3[36m [35m4[36m][22m[39m [1m[35m|[22m[39m [1m[36mintersect[22m[39m [1m[36m[[35m3[36m [35m4[36m [35m5[36m [35m6[36m][22m[39m
+╭───┬───╮
+│ [1m[32m0[22m[39m │ 3 │
+│ [1m[32m1[22m[39m │ 4 │
+╰───┴───╯[38;5;14m
+> [1m[36m[[35m1[36m [35m2[36m [35m3[36m][22m[39m [1m[35m|[22m[39m [1m[36mintersect[22m[39m [1m[36m[[35m4[36m [35m5[36m [35m6[36m][22m[39m
+╭────────────╮
+│ [2mempty list[22m │
+╰────────────╯[0m
+```
+
+`difference`: Returns a deduplicated list of unique elements present in the input list but not in the given list.
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36m[[35m1[36m [35m2[36m [35m3[36m [35m4[36m][22m[39m [1m[35m|[22m[39m [1m[36mdifference[22m[39m [1m[36m[[35m3[36m [35m4[36m [35m5[36m [35m6[36m][22m[39m
+╭───┬───╮
+│ [1m[32m0[22m[39m │ 1 │
+│ [1m[32m1[22m[39m │ 2 │
+╰───┴───╯[38;5;14m
+> [1m[36m[{[22m[32ma[1m[36m:[35m1[36m} {[22m[32ma[1m[36m:[35m2[36m} {[22m[32ma[1m[36m:[35m3[36m}][22m[39m [1m[35m|[22m[39m [1m[36mdifference[22m[39m [1m[36m[{[22m[32ma[1m[36m:[35m2[36m} {[22m[32ma[1m[36m:[35m4[36m}][22m[39m
+╭───┬───╮
+│ [1m[32m#[22m[39m │ [1m[32ma[22m[39m │
+├───┼───┤
+│ [1m[32m0[22m[39m │ 1 │
+│ [1m[32m1[22m[39m │ 3 │
+╰───┴───╯[0m
+```
+
+`combinations`: Generates all combinations of a given size k from the input list, streamed lazily via `ListStream`. If k > n, returns an empty list.
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36m[[35m1[36m [35m2[36m [35m3[36m][22m[39m [1m[35m|[22m[39m [1m[36mcombinations[22m[39m [1m[35m2[22m[39m
+╭───┬───────────╮
+│ [1m[32m0[22m[39m │ ╭───┬───╮ │
+│ │ │ [1m[32m0[22m[39m │ 1 │ │
+│ │ │ [1m[32m1[22m[39m │ 2 │ │
+│ │ ╰───┴───╯ │
+│ [1m[32m1[22m[39m │ ╭───┬───╮ │
+│ │ │ [1m[32m0[22m[39m │ 1 │ │
+│ │ │ [1m[32m1[22m[39m │ 3 │ │
+│ │ ╰───┴───╯ │
+│ [1m[32m2[22m[39m │ ╭───┬───╮ │
+│ │ │ [1m[32m0[22m[39m │ 2 │ │
+│ │ │ [1m[32m1[22m[39m │ 3 │ │
+│ │ ╰───┴───╯ │
+╰───┴───────────╯[38;5;14m
+> [1m[36m[[35m1[36m [35m2[36m][22m[39m [1m[35m|[22m[39m [1m[36mcombinations[22m[39m [1m[35m3[22m[39m
+╭────────────╮
+│ [2mempty list[22m │
+╰────────────╯[0m
+```
+
+`permutations`: Generates all permutations of the input list using Heap's algorithm, streamed lazily via `ListStream`.
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36m[[35m1[36m [35m2[36m [35m3[36m][22m[39m [1m[35m|[22m[39m [1m[36mpermutations[22m[39m
+╭───┬───────────╮
+│ [1m[32m0[22m[39m │ ╭───┬───╮ │
+│ │ │ [1m[32m0[22m[39m │ 1 │ │
+│ │ │ [1m[32m1[22m[39m │ 2 │ │
+│ │ │ [1m[32m2[22m[39m │ 3 │ │
+│ │ ╰───┴───╯ │
+│ [1m[32m1[22m[39m │ ╭───┬───╮ │
+│ │ │ [1m[32m0[22m[39m │ 2 │ │
+│ │ │ [1m[32m1[22m[39m │ 1 │ │
+│ │ │ [1m[32m2[22m[39m │ 3 │ │
+│ │ ╰───┴───╯ │
+│ [1m[32m2[22m[39m │ ╭───┬───╮ │
+│ │ │ [1m[32m0[22m[39m │ 3 │ │
+│ │ │ [1m[32m1[22m[39m │ 1 │ │
+│ │ │ [1m[32m2[22m[39m │ 2 │ │
+│ │ ╰───┴───╯ │
+│ [1m[32m3[22m[39m │ ╭───┬───╮ │
+│ │ │ [1m[32m0[22m[39m │ 1 │ │
+│ │ │ [1m[32m1[22m[39m │ 3 │ │
+│ │ │ [1m[32m2[22m[39m │ 2 │ │
+│ │ ╰───┴───╯ │
+│ [1m[32m4[22m[39m │ ╭───┬───╮ │
+│ │ │ [1m[32m0[22m[39m │ 2 │ │
+│ │ │ [1m[32m1[22m[39m │ 3 │ │
+│ │ │ [1m[32m2[22m[39m │ 1 │ │
+│ │ ╰───┴───╯ │
+│ [1m[32m5[22m[39m │ ╭───┬───╮ │
+│ │ │ [1m[32m0[22m[39m │ 3 │ │
+│ │ │ [1m[32m1[22m[39m │ 2 │ │
+│ │ │ [1m[32m2[22m[39m │ 1 │ │
+│ │ ╰───┴───╯ │
+╰───┴───────────╯[38;5;14m
+> [1m[36m[[35m1[36m [35m2[36m][22m[39m [1m[35m|[22m[39m [1m[36mpermutations[22m[39m
+╭───┬───────────╮
+│ [1m[32m0[22m[39m │ ╭───┬───╮ │
+│ │ │ [1m[32m0[22m[39m │ 1 │ │
+│ │ │ [1m[32m1[22m[39m │ 2 │ │
+│ │ ╰───┴───╯ │
+│ [1m[32m1[22m[39m │ ╭───┬───╮ │
+│ │ │ [1m[32m0[22m[39m │ 2 │ │
+│ │ │ [1m[32m1[22m[39m │ 1 │ │
+│ │ ╰───┴───╯ │
+╰───┴───────────╯[0m
+```
+
+### Added semantic version parsing and commands
+
+Nushell now understands and allows you to work with Semantic Versioning. All functionality works through idiomatic Nushell patterns:
+
+```ansi :no-line-numbers title="Converting to SemVer"
+[38;5;14m> [32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m
+1.2.3[38;5;14m
+> [1m[36m{[22m[32mmajor[1m[36m: [35m1[36m, [22m[32mminor[1m[36m: [35m2[36m, [22m[32mpatch[1m[36m: [35m3[36m}[22m[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m
+1.2.3[38;5;14m
+> [1m[36m{[22m[32mmajor[1m[36m: [35m1[36m, [22m[32mminor[1m[36m: [35m2[36m, [22m[32mpatch[1m[36m: [35m3[36m}[22m[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m [1m[35m|[22m[39m [1m[36mdescribe[22m[39m
+semver[0m
+```
+
+```ansi :no-line-numbers title="Decomposing SemVer to record"
+[38;5;14m> [32m'1.2.3-alpha.1+build.2'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m [1m[35m|[22m[39m [1m[36minto record[22m[39m
+╭───────────────────┬───────────────╮
+│ [1m[32mmajor[22m[39m │ 1 │
+│ [1m[32mminor[22m[39m │ 2 │
+│ [1m[32mpatch[22m[39m │ 3 │
+│ [1m[32mpre[22m[39m │ alpha.1 │
+│ [1m[32mbuild[22m[39m │ build.2 │
+│ │ ╭───┬───────╮ │
+│ [1m[32mpre_identifiers[22m[39m │ │ [1m[32m0[22m[39m │ alpha │ │
+│ │ │ [1m[32m1[22m[39m │ 1 │ │
+│ │ ╰───┴───────╯ │
+│ │ ╭───┬───────╮ │
+│ [1m[32mbuild_identifiers[22m[39m │ │ [1m[32m0[22m[39m │ build │ │
+│ │ │ [1m[32m1[22m[39m │ 2 │ │
+│ │ ╰───┴───────╯ │
+╰───────────────────┴───────────────╯[0m
+```
+
+```ansi :no-line-numbers title="Building SemVer from record"
+[38;5;14m> [1m[36m{[22m[32mmajor[1m[36m: [35m1[36m, [22m[32mminor[1m[36m: [35m2[36m, [22m[32mpatch[1m[36m: [35m3[36m, [22m[32mpre[1m[36m: [22m[32m"alpha.1"[1m[36m}[22m[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m
+1.2.3-alpha.1[0m
+```
+
+```ansi :no-line-numbers tilte="Bumping SemVer"
+[38;5;14m> [32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m [1m[35m|[22m[39m [1m[36msemver bump[22m[39m [32mmajor[39m
+2.0.0[38;5;14m
+> [32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m [1m[35m|[22m[39m [1m[36msemver bump[22m[39m [32mminor[39m
+1.3.0[38;5;14m
+> [32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m [1m[35m|[22m[39m [1m[36msemver bump[22m[39m [32mpatch[39m
+1.2.4[38;5;14m
+> [32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m [1m[35m|[22m[39m [1m[36msemver bump[22m[39m [32malpha[39m
+1.2.3-alpha.1[38;5;14m
+> [32m'1.2.3-alpha.1'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m [1m[35m|[22m[39m [1m[36msemver bump[22m[39m [32malpha[39m
+1.2.3-alpha.2[38;5;14m
+> [32m'1.2.3-alpha'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m [1m[35m|[22m[39m [1m[36msemver bump[22m[39m [32mrelease[39m
+1.2.3[38;5;14m
+> [32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36msemver bump[22m[39m [32mmajor[39m
+2.0.0[38;5;14m
+> [32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36msemver bump[22m[39m [32mminor[39m
+1.3.0[0m
+```
+
+```ansi :no-line-numbers title="Tab completions are available"
+[38;5;14m| [32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36msemver bump[22m[7m[32m
+alpha[27m[39m [32mbeta[39m [32mmajor[39m [32mminor
+patch[39m [32mrc[39m [32mrelease[0m
+```
+
+```ansi :no-line-numbers title="Completions also work with variables"
+[38;5;14m> [1m[36mlet[22m[39m [35mv[39m = [32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[38;5;14m
+| [35m$v[39m.[7m[32m
+build[27m[39m [32mmajor[39m [32mminor[39m [32mpatch
+pre[0m
+```
+
+```ansi :no-line-numbers title="Sorting SemVer values"
+[38;5;14m> [1m[36m[[22m[32m'2.0.0'[1m[36m, [22m[32m'1.0.0'[1m[36m, [22m[32m'1.2.3'[1m[36m][22m[39m [1m[35m|[22m[39m [1m[36meach[22m[39m [1m[32m{ [36minto semver[32m }[22m[39m [1m[35m|[22m[39m [1m[36msort[22m[39m
+╭───┬───────╮
+│ [1m[32m0[22m[39m │ 1.0.0 │
+│ [1m[32m1[22m[39m │ 1.2.3 │
+│ [1m[32m2[22m[39m │ 2.0.0 │
+╰───┴───────╯[38;5;14m
+> [1m[36m[[22m[32m'2.0.0'[1m[36m, [22m[32m'1.0.0'[1m[36m, [22m[32m'1.2.3'[1m[36m][22m[39m [1m[35m|[22m[39m [1m[36meach[22m[39m [1m[32m{ [36minto semver[32m }[22m[39m [1m[35m|[22m[39m [1m[36msort[22m[39m [1m[34m--reverse[22m[39m
+╭───┬───────╮
+│ [1m[32m0[22m[39m │ 2.0.0 │
+│ [1m[32m1[22m[39m │ 1.2.3 │
+│ [1m[32m2[22m[39m │ 1.0.0 │
+╰───┴───────╯[0m
+```
+
+```ansi :no-line-numbers title="Checking Valid SemVer"
+[38;5;14m> [1m[36mtry[22m[39m [1m[34m{ [22m[32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver[34m }[22m[39m [1m[35m|[22m[39m [1m[36mis-not-empty[22m[39m
+true[38;5;14m
+> [1m[36mtry[22m[39m [1m[34m{ [22m[32m'not-valid'[39m [1m[35m|[22m[39m [1m[36minto semver[34m }[22m[39m [1m[35m|[22m[39m [1m[36mis-not-empty[22m[39m
+false[0m
+```
+
+```ansi :no-line-numbers title="Matching SemVer against requirements"
+[38;5;14m> [32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m [1m[35m|[22m[39m [35m$in[39m [33min[39m [1m[34m([22m[32m'>=1.0.0'[39m [1m[35m|[22m[39m [1m[36minto semver-range[34m)[22m[39m
+true[38;5;14m
+> [32m'1.0.0'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m [1m[35m|[22m[39m [35m$in[39m [33min[39m [1m[34m([22m[32m'>=2.0.0'[39m [1m[35m|[22m[39m [1m[36minto semver-range[34m)[22m[39m
+false[38;5;14m
+> [32m'1.3.0-alpha'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[39m [1m[35m|[22m[39m [35m$in[39m [33min[39m [1m[34m([22m[32m'>=1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver-range[34m)[22m[39m
+false[0m
+```
+
+```ansi :no-line-numbers title="Converting SemVer range"
+[38;5;14m> [32m'>=1.0.0'[39m [1m[35m|[22m[39m [1m[36minto semver-range[22m[39m
+>=1.0.0[38;5;14m
+> [32m'^1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver-range[22m[39m
+^1.2.3[38;5;14m
+> [32m'~1.2'[39m [1m[35m|[22m[39m [1m[36minto semver-range[22m[39m
+~1.2[0m
+```
+
+```ansi :no-line-numbers title="Describe"
+[38;5;14m> [1m[36mlet[22m[39m [35mv[39m = [32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver[22m[38;5;14m
+> [35m$v[39m [1m[35m|[22m[39m [1m[36mdescribe[22m[39m
+semver[38;5;14m
+> [35m$v[39m [1m[35m|[22m[39m [1m[36mdescribe[22m[39m [1m[34m-d[22m[39m
+╭───────────────┬───────────────────────────────────────────────────────────────────────╮
+│ [1m[32mtype[22m[39m │ custom │
+│ [1m[32mdetailed_type[22m[39m │ semver │
+│ [1m[32msubtype[22m[39m │ semver │
+│ [1m[32mrust_type[22m[39m │ &alloc::boxed::Box │
+│ [1m[32mvalue[22m[39m │ 1.2.3 │
+╰───────────────┴───────────────────────────────────────────────────────────────────────╯[0m
+```
+
+```ansi :no-line-numbers title="Table coloring"
+[38;5;14m> [1m[34m[
+ [[22m[32mstring[1m[34m, [22m[32msemver[1m[34m, [22m[32msemver-range[1m[34m];
+ [[22m[32m'1.2.3'[1m[34m, ([22m[32m'1.2.3'[39m [1m[35m|[22m[39m [1m[36minto semver[34m), ([22m[32m'>=1.0.0'[39m [1m[35m|[22m[39m [1m[36minto semver-range[34m)]
+][22m[39m
+╭───┬────────┬────────┬──────────────╮
+│ [1m[32m#[22m[39m │ [1m[32mstring[22m[39m │ [1m[32msemver[22m[39m │ [1m[32msemver-range[22m[39m │
+├───┼────────┼────────┼──────────────┤
+│ [1m[32m0[22m[39m │ 1.2.3 │ [1m[36m1.2.3[22m[39m │ [1m[36m>=1.0.0[22m[39m │
+╰───┴────────┴────────┴──────────────╯[0m
+```
+
+```nushell title="Color configuration"
+$env.config.color_config.semver = "cyan_bold"
+$env.config.color_config.semver-range = "cyan_bold"
+```
+
+### `from xlsx`/`from ods` gets a `--prefer-integers` flag
+
+`xlsx` and `ods` files store numbers as floats by default, even if they are not display with decimal points.
+
+`from xlsx` and `from ods` now has a `--prefer-integers` (`-i`) flag that imports whole-number floats as integers.
+
+This has no effect on non-whole floats.
+
+```ansi:no-line-numbers
+[96m> [22;1;36mopen[22;39m [22;1;34m--raw[22;39m [22;1;36mtests/fixtures/formats/sample_data.xlsx
+[35m|[22;39m [22;1;36mfrom xlsx
+[35m|[22;39m [22;1;36mget[22;39m [32mSalesOrders
+[22;1;35m|[22;39m [22;1;36mfirst[22;39m [22;1;35m5
+[22;39m╭───┬─────────────┬─────────┬─────────┬────────┬───────┬───────────┬────────╮
+│ [22;1;32m#[22;39m │ [22;1;32mOrderDate[22;39m │ [22;1;32mRegion[22;39m │ [22;1;32mRep[22;39m │ [22;1;32mItem[22;39m │ [22;1;32mUnits[22;39m │ [22;1;32mUnit Cost[22;39m │ [22;1;32mTotal[22;39m │
+├───┼─────────────┼─────────┼─────────┼────────┼───────┼───────────┼────────┤
+│ [22;1;32m0[22;39m │ [35m8 years ago[39m │ East │ Jones │ Pencil │ 95.00 │ 1.99 │ 189.05 │
+│ [22;1;32m1[22;39m │ [35m8 years ago[39m │ Central │ Kivell │ Binder │ 50.00 │ 19.99 │ 999.50 │
+│ [22;1;32m2[22;39m │ [35m8 years ago[39m │ Central │ Jardine │ Pencil │ 36.00 │ 4.99 │ 179.64 │
+│ [22;1;32m3[22;39m │ [35m8 years ago[39m │ Central │ Gill │ Pen │ 27.00 │ 19.99 │ 539.73 │
+│ [22;1;32m4[22;39m │ [35m8 years ago[39m │ West │ Sorvino │ Pencil │ 56.00 │ 2.99 │ 167.44 │
+╰───┴─────────────┴─────────┴─────────┴────────┴───────┴───────────┴────────╯
+```
+
+```ansi:no-line-numbers
+[96m> [22;1;36mopen[22;39m [22;1;34m--raw[22;39m [22;1;36mtests/fixtures/formats/sample_data.xlsx
+[35m|[22;39m [22;1;36mfrom xlsx[22;39m [22;1;34m--prefer-integers
+[35m|[22;39m [22;1;36mget[22;39m [32mSalesOrders
+[22;1;35m|[22;39m [22;1;36mfirst[22;39m [22;1;35m5
+[22;39m╭───┬─────────────┬─────────┬─────────┬────────┬───────┬───────────┬────────╮
+│ [22;1;32m#[22;39m │ [22;1;32mOrderDate[22;39m │ [22;1;32mRegion[22;39m │ [22;1;32mRep[22;39m │ [22;1;32mItem[22;39m │ [22;1;32mUnits[22;39m │ [22;1;32mUnit Cost[22;39m │ [22;1;32mTotal[22;39m │
+├───┼─────────────┼─────────┼─────────┼────────┼───────┼───────────┼────────┤
+│ [22;1;32m0[22;39m │ [35m8 years ago[39m │ East │ Jones │ Pencil │ 95 │ 1.99 │ 189.05 │
+│ [22;1;32m1[22;39m │ [35m8 years ago[39m │ Central │ Kivell │ Binder │ 50 │ 19.99 │ 999.50 │
+│ [22;1;32m2[22;39m │ [35m8 years ago[39m │ Central │ Jardine │ Pencil │ 36 │ 4.99 │ 179.64 │
+│ [22;1;32m3[22;39m │ [35m8 years ago[39m │ Central │ Gill │ Pen │ 27 │ 19.99 │ 539.73 │
+│ [22;1;32m4[22;39m │ [35m8 years ago[39m │ West │ Sorvino │ Pencil │ 56 │ 2.99 │ 167.44 │
+╰───┴─────────────┴─────────┴─────────┴────────┴───────┴───────────┴────────╯
+```
+
+### Other additions
+
+- Added `math cbrt` (cube root) function. ([#18473](https://github.com/nushell/nushell/pull/18473))
+- `append` can now take multiple values to append as rest parameters ([#18218](https://github.com/nushell/nushell/pull/18218))
+- Improve `LS_COLORS` support to `commandline complete --detailed`. ([#18325](https://github.com/nushell/nushell/pull/18325))
+- The `idx init` command uses content indexing by default. ([#18332](https://github.com/nushell/nushell/pull/18332))
+- Improved `hash md5` and `hash sha256` help examples to show hashing binary data. ([#18338](https://github.com/nushell/nushell/pull/18338))
+- Added completions to `ansi gradient`'s `--fgnamed` and `--bgnamed` flags. ([#18342](https://github.com/nushell/nushell/pull/18342))
+- `nu-highlight` now clears `content_type` metadata ([#18266](https://github.com/nushell/nushell/pull/18266))
+- Keybinding `edit` events now support reedline's verb-based edit commands (`move`, `extend`, `cut`, `copy`, `change`, `erase`) combined with a `motion` and its parameters, enabling vi-style operator/motion keybindings to be expressed directly in config. The new commands and their fields are discoverable via `keybindings list`. ([#18396](https://github.com/nushell/nushell/pull/18396))
+- The http commands now use the response body as error message when getting an error response. ([#18387](https://github.com/nushell/nushell/pull/18387))
+- If the `NU_EXPERIMENTAL_OPTIONS` environment variable is set, it will be used when running nushell with the `--login` or `--execute` flags since they also load config. ([#18392](https://github.com/nushell/nushell/pull/18392))
+- Refactor commands that use sqlite pushdown so that it's easier to add other pushdown filters. ([#18398](https://github.com/nushell/nushell/pull/18398))
+- Added common navigation shortcuts to `explore config` command: `hl` to collapse/expand, and `jk`/`ctrl+p/n` to go up and down. ([#18440](https://github.com/nushell/nushell/pull/18440))
+- For those debugging startup performance, we added a new `--log-level` called `perf` that shows performance information. ([#18468](https://github.com/nushell/nushell/pull/18468))
+
+## Deprecations
+
+### Deprecate `str upcase`/`str downcase` and add `str uppercase`/`str lowercase`
+
+Added `str uppercase` command to convert text to uppercase (replaces `str upcase`)
+Added `str lowercase` command to convert text to lowercase (replaces `str downcase`)
+Deprecated `str upcase`, using it shows a warning recommending `str uppercase`.
+Deprecated `str downcase`, using it shows a warning recommending `str lowercase`.
+
+### Other deprecations
+
+- Removed the deprecated `use std/clip` `copy` and `paste` commands, they are now called `copy52` and `paste52` for the ones that use the terminal `OSC 52`, or you can use `clip copy` and `clip paste` from the experimental option `native-clip` that access the system clipboard directly. ([#18403](https://github.com/nushell/nushell/pull/18403))
+
+## Other changes
+
+### More idiomatic YAML output with smarter string quoting
+
+::: info
+The next release will have a complete rework of the YAML implementation.
+So this is only relevant for this release.
+:::
+
+The previous emitter always quoted string values, which produced valid YAML but was more conservative than necessary and less aligned with YAML 1.2 plain-scalar rules.
+
+This change makes output:
+
+- more readable
+- closer to idiomatic YAML
+- more spec-aligned for plain scalars
+- still safe for roundtripping by quoting values that would otherwise be reinterpreted as non-strings
+
+#### Before:
+
+```yaml
+value: 'off'
+path: '/dev/stdout'
+listen: '0.0.0.0:8444,0.0.0.0:8445 ssl'
+name: 'kong'
+kind: 'Deployment'
+```
+
+#### After:
+
+```yaml
+value: 'off'
+path: /dev/stdout
+listen: 0.0.0.0:8444,0.0.0.0:8445 ssl
+name: kong
+kind: Deployment
+```
+
+Multiline strings now emit as:
+
+```yaml
+string: |-
+ Hello
+ world
+```
+
+### Width-priority columns
+
+Added support for column width-priority hints in table rendering. Values can now carry `--table-width-priority-columns` metadata so the `table` command gives selected columns more space when fitting output to the terminal width.
+
+Providing the metadata will cause the `table` command to render the output differently
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36mps[22m[39m [1m[34m-l[22m[39m [1m[35m|[22m[39m [1m[36mselect[22m[39m [32mname[39m [32mcommand[39m [32mpid[39m [1m[35m|[22m[39m [1m[36mfirst[22m[39m [1m[35m2[22m[39m [1m[35m|[22m[39m [1m[36mtable[22m[39m
+╭───┬──────────────────────────────────┬───────────────────────────────────────────────────────────────────────────┬─────╮
+│ [1m[32m#[22m[39m │ [1m[32mname[22m[39m │ [1m[32mcommand[22m[39m │ ... │
+├───┼──────────────────────────────────┼───────────────────────────────────────────────────────────────────────────┼─────┤
+│ [1m[32m0[22m[39m │ GameInputRedistService.exe │ C:\Program Files\Microsoft GameInput\x64\GameInputRedistService.exe │ ... │
+│ │ │ /session=\\.\pipe\GameInputServiceSession-002fb4627cd24645-00000001 │ │
+│ [1m[32m1[22m[39m │ nvcontainer.exe │ C:\Program Files\NVIDIA Corporation\NvContainer\nvcontainer.exe -f │ ... │
+│ │ │ C:\ProgramData\NVIDIA Corporation\NVIDIA │ │
+│ │ │ App\NvContainer\NvContainerUser%d.log -d C:\Program Files\NVIDIA │ │
+│ │ │ Corporation\NvContainer\plugins\User -r -l 3 -p 30000 -c │ │
+╰───┴──────────────────────────────────┴───────────────────────────────────────────────────────────────────────────┴─────╯[38;5;14m
+> [1m[36mps[22m[39m [1m[34m-l[22m[39m [1m[35m|[22m[39m [1m[36mselect[22m[39m [32mname[39m [32mcommand[39m [32mpid[39m [1m[35m|[22m[39m [1m[36mfirst[22m[39m [1m[35m2[22m[39m [1m[35m|[22m[39m [1m[36mmetadata set[22m[39m [1m[34m-w[22m[39m [1m[36m[[22m[32mpid[1m[36m][22m[39m [1m[35m|[22m[39m [1m[36mtable[22m[39m
+╭───┬────────────────────────────┬───────────────────────────────────────────────────────────────────────────────┬───────╮
+│ [1m[32m#[22m[39m │ [1m[32mname[22m[39m │ [1m[32mcommand[22m[39m │ [1m[32mpid[22m[39m │
+├───┼────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────┤
+│ [1m[32m0[22m[39m │ GameInputRedistService.exe │ C:\Program Files\Microsoft GameInput\x64\GameInputRedistService.exe │ 12744 │
+│ │ │ /session=\\.\pipe\GameInputServiceSession-002fb4627cd24645-00000001 │ │
+│ [1m[32m1[22m[39m │ nvcontainer.exe │ C:\Program Files\NVIDIA Corporation\NvContainer\nvcontainer.exe -f │ 12792 │
+│ │ │ C:\ProgramData\NVIDIA Corporation\NVIDIA │ │
+│ │ │ App\NvContainer\NvContainerUser%d.log -d C:\Program Files\NVIDIA │ │
+│ │ │ Corporation\NvContainer\plugins\User -r -l 3 -p 30000 -c │ │
+╰───┴────────────────────────────┴───────────────────────────────────────────────────────────────────────────────┴───────╯[0m
+```
+
+### Polars upgrade 0.54
+
+- `polar implode` now supports the flag `--maintain-order`
+- `polars is-in` now supports the flag `--maintain-order`
+- `polars pivot` not supports the flag `--always-combine-names`
+- `polars replace` requires a `--default ` parameter when used with `--strict` and `--return-dtype` if the dtype has changed from the original dtype
+
+### New experimental globbing engine
+
+
+
+This release introduces a new experimental feature named `dc-glob` (named for Devyn Cairn's glob).
+Currently nushell has two separate globbing engines with varying features and platform support.
+
+This engine is intended to replace the existing globbing engines, and standardize on something that works well on all platforms.
+In addition, this globbing engine seems to perform faster than the existing engines.
+
+### Additional changes
+
+- "Command not found" error messages will now suggest full command from a category if you type just its ending, for example `sqrt` will suggest `math sqrt`. ([#18498](https://github.com/nushell/nushell/pull/18498))
+- Fixed `plugin list --help` to show the correct output type and example for the `commands` column, which contains each plugin command's name and description. ([#18357](https://github.com/nushell/nushell/pull/18357))
+- Added some `@attr`s to the toolkit.nu commands so that they show up in category, search-terms, and examples. I also homogenized help casing and punctuation. ([#18350](https://github.com/nushell/nushell/pull/18350))
+- Added support for feature gating LSP functionality, specifically enable it via `--features lsp`. ([#18148](https://github.com/nushell/nushell/pull/18148))
+- Improved the MCP `evaluate` tool response: evaluation outputs NUON directly instead of wrapping everything as a string. Successful and error responses are also available as MCP `structuredContent` JSON for clients that support structured tool output. ([#18499](https://github.com/nushell/nushell/pull/18499))
+- `http post`/`put`/`patch`/`delete` now respects `--content-type` for JSON-variant MIME types like `application/json-patch+json`. ([#18496](https://github.com/nushell/nushell/pull/18496))
+
+## Bug fixes
+
+### `idx` dependency update and command reliability improvements
+
+Update the `idx` fff-search dependency and fix bugs.
+
+- `idx init . --wait` now properly blocks
+- `idx init` now has a `--follow-links` switch
+- `idx status` reports accurate counts after indexing
+- `idx import` fully restores snapshot for queries — The `idx import` command now properly restores snapshots to enable all query operations. Imported snapshots remain queryable even if the original project files have been deleted or moved.
+- `idx files` works on imported snapshots
+- `idx files` has a `query` parameter now for easy searching (renamed from `path` for consistency)
+- `idx dirs` works on imported snapshots
+- `idx dirs` has a `query` parameter now for easy searching
+- `idx find` (fuzzy search) works on imported snapshots
+- `idx search` (content search) works on imported snapshots
+- changed output to nushell values for commands that return tables
+- updated some help strings to be more helpful
+
+Files are ignored during indexing due to the use of the `ignore` crate. These are the rules for ignore https://docs.rs/ignore/latest/ignore/struct.WalkBuilder.html#ignore-rules. There's no way to override this in the current version.
+
+### Subcommand completions are now wrapped in quotes for `which`
+
+Tab completions for `which` and `attr complete`/`@complete` commands will now properly quote command names containing spaces.
+
+
+
+
+
+```ansi :no-line-numbers title="Before"
+[38;5;14m> [1m[36mwhich[22m[39m [32m'path par[38;5;14m
+> [1m[36mwhich[22m[39m [32mpath[39m [32mparse[39m
+╭───┬─────────┬──────┬──────────╮
+│ [1m[32m#[22m[39m │ [1m[32mcommand[22m[39m │ [1m[32mpath[22m[39m │ [1m[32mtype[22m[39m │
+├───┼─────────┼──────┼──────────┤
+│ [1m[32m0[22m[39m │ path │ │ built-in │
+│ [1m[32m1[22m[39m │ parse │ │ built-in │
+╰───┴─────────┴──────┴──────────╯[0m
+```
+
+
+
+
+```ansi :no-line-numbers title="After"
+[38;5;14m> [1m[36mwhich[22m[39m [32m'path par[38;5;14m
+> [1m[36mwhich[22m[39m [32m"path parse"[39m
+╭───┬────────────┬──────┬──────────╮
+│ [1m[32m#[22m[39m │ [1m[32mcommand[22m[39m │ [1m[32mpath[22m[39m │ [1m[32mtype[22m[39m │
+├───┼────────────┼──────┼──────────┤
+│ [1m[32m0[22m[39m │ path parse │ │ built-in │
+╰───┴────────────┴──────┴──────────╯[0m
+```
+
+
+
+
+
+### Fix nested update closure for table columns
+
+This fixes a bug where update with a nested column path and closure (for example `rss_item.pubDate`) could evaluate the closure against a projected list and write the same result back to every row.
+
+
+
+
+
+```ansi :no-line-numbers title="Before"
+[38;5;14m> [1m[36m{
+ [22m[32mrss_item[1m[36m: [34m[
+ [[22m[32mpubDate[1m[34m];
+ [[35m1773429600[34m],
+ [[35m1774325700[34m],
+ [[35m1775448000[34m]
+ ][36m
+}[22m[39m [1m[35m|[22m[39m [1m[36mupdate[22m[39m [32mrss_item[39m.[32mpubDate[39m [1m[32m{ [36minto datetime[22m[39m [1m[34m-f[22m[39m [32m"%s"[1m }[22m[39m
+╭──────────┬──────────────────────────────╮
+│ │ ╭───┬──────────────────────╮ │
+│ [1m[32mrss_item[22m[39m │ │ [1m[32m#[22m[39m │ [1m[32mpubDate[22m[39m │ │
+│ │ ├───┼──────────────────────┤ │
+│ │ │ [1m[32m0[22m[39m │ ╭───┬──────────────╮ │ │
+│ │ │ │ │ [1m[32m0[22m[39m │ [35m3 months ago[39m │ │ │
+│ │ │ │ │ [1m[32m1[22m[39m │ [35m3 months ago[39m │ │ │
+│ │ │ │ │ [1m[32m2[22m[39m │ [35m2 months ago[39m │ │ │
+│ │ │ │ ╰───┴──────────────╯ │ │
+│ │ │ [1m[32m1[22m[39m │ ╭───┬──────────────╮ │ │
+│ │ │ │ │ [1m[32m0[22m[39m │ [35m3 months ago[39m │ │ │
+│ │ │ │ │ [1m[32m1[22m[39m │ [35m3 months ago[39m │ │ │
+│ │ │ │ │ [1m[32m2[22m[39m │ [35m2 months ago[39m │ │ │
+│ │ │ │ ╰───┴──────────────╯ │ │
+│ │ │ [1m[32m2[22m[39m │ ╭───┬──────────────╮ │ │
+│ │ │ │ │ [1m[32m0[22m[39m │ [35m3 months ago[39m │ │ │
+│ │ │ │ │ [1m[32m1[22m[39m │ [35m3 months ago[39m │ │ │
+│ │ │ │ │ [1m[32m2[22m[39m │ [35m2 months ago[39m │ │ │
+│ │ │ │ ╰───┴──────────────╯ │ │
+│ │ ╰───┴──────────────────────╯ │
+╰──────────┴──────────────────────────────╯[0m
+```
+
+
+
+
+```ansi :no-line-numbers title="After"
+[38;5;14m> [1m[36m{
+ [22m[32mrss_item[1m[36m: [34m[
+ [[22m[32mpubDate[1m[34m];
+ [[35m1773429600[34m],
+ [[35m1774325700[34m],
+ [[35m1775448000[34m]
+ ][36m
+}[22m[39m [1m[35m|[22m[39m [1m[36mupdate[22m[39m [32mrss_item[39m.[32mpubDate[39m [1m[32m{ [36minto datetime[22m[39m [1m[34m-f[22m[39m [32m"%s"[1m }[22m[39m
+╭──────────┬──────────────────────╮
+│ │ ╭───┬──────────────╮ │
+│ [1m[32mrss_item[22m[39m │ │ [1m[32m#[22m[39m │ [1m[32mpubDate[22m[39m │ │
+│ │ ├───┼──────────────┤ │
+│ │ │ [1m[32m0[22m[39m │ [35m3 months ago[39m │ │
+│ │ │ [1m[32m1[22m[39m │ [35m3 months ago[39m │ │
+│ │ │ [1m[32m2[22m[39m │ [35m2 months ago[39m │ │
+│ │ ╰───┴──────────────╯ │
+╰──────────┴──────────────────────╯[0m
+```
+
+
+
+
+
+
+
+
+
+```ansi :no-line-numbers title="Before"
+[38;5;14m> [1m[36m{ [22m[32mw[1m[36m: { [22m[32mx[1m[36m: [ { [22m[32my[1m[36m: [22m[32m"1"[1m[36m } { [22m[32my[1m[36m: [22m[32m"2"[1m[36m } ] } }[35m
+|[22m[39m [1m[36mupdate[22m[39m [32mw[39m.[32mx[39m.[32my[39m [1m[32m{ [36minto float[32m }[35m
+|[22m[39m [1m[36mto yaml[22m[39m
+w:
+ x:
+ - 'y':
+ - 1.0
+ - 2.0
+ - 'y':
+ - 1.0
+ - 2.0
+[0m
+```
+
+
+
+
+```ansi :no-line-numbers title="After"
+[38;5;14m> [1m[36m{ [22m[32mw[1m[36m: { [22m[32mx[1m[36m: [ { [22m[32my[1m[36m: [22m[32m"1"[1m[36m } { [22m[32my[1m[36m: [22m[32m"2"[1m[36m } ] } }[35m
+|[22m[39m [1m[36mupdate[22m[39m [32mw[39m.[32mx[39m.[32my[39m [1m[32m{ [36minto float[32m }[35m
+|[22m[39m [1m[36mto yaml[22m[39m
+w:
+ x:
+ - 'y': 1.0
+ - 'y': 2.0
+[0m
+```
+
+
+
+
+
+
+
+
+
+```ansi :no-line-numbers title="Before"
+[38;5;14m> [1m[36m[ [34m[[[22m[32ma[1m[34m]; [[35m1[34m] [[35m2[34m]][36m ][35m
+|[22m[39m [1m[36mupdate[22m[39m [32ma[39m [1m[32m{[36minto float[32m}[35m
+|[22m[39m [1m[36mto yaml[22m[39m
+-
+ - a:
+ - 1.0
+ - 2.0
+ - a:
+ - 1.0
+ - 2.0
+[0m
+```
+
+
+
+
+```ansi :no-line-numbers title="After"
+[38;5;14m> [1m[36m[ [34m[[[22m[32ma[1m[34m]; [[35m1[34m] [[35m2[34m]][36m ][35m
+|[22m[39m [1m[36mupdate[22m[39m [32ma[39m [1m[32m{[36minto float[32m}[35m
+|[22m[39m [1m[36mto yaml[22m[39m
+-
+ - a: 1.0
+ - a: 2.0
+[0m
+```
+
+
+
+
+
+### Reduced escaping in `nu-mcp` evaluation output
+
+Reduce the amount of escaping that nu-mcp does by using raw-strings.
+
+```json :no-line-numbers title="Before"
+{
+ "jsonrpc": "2.0",
+ "id": 3,
+ "result": {
+ "content": [
+ {
+ "type": "text",
+ "text": "{cwd:/Users/fdncred/src/nushell,history_index:0,timestamp:2026-05-21T15:10:18.619935+00:00,output:\"\\\"[\n {\n \\\\\\\"name\\\\\\\": \\\\\\\"assets\\\\\\\",\n \\\\\\\"type\\\\\\\": \\\\\\\"dir\\\\\\\",\n \\\\\\\"size\\\\\\\": 160,\n \\\\\\\"modified\\\\\\\": \\\\\\\"2024-09-14T07:06:47.316979108-05:00\\\\\\\"\n },\n {\n \\\\\\\"name\\\\\\\": \\\\\\\"ast-grep\\\\\\\",\n \\\\\\\"type\\\\\\\": \\\\\\\"dir\\\\\\\",\n \\\\\\\"size\\\\\\\": 160,\n \\\\\\\"modified\\\\\\\": \\\\\\\"2026-01-07T06:22:12.488582817-06:00\\\\\\\"\n },\n {\n \\\\\\\"name\\\\\\\": \\\\\\\"benches\\\\\\\",\n \\\\\\\"type\\\\\\\": \\\\\\\"dir\\\\\\\",\n \\\\\\\"size\\\\\\\": 128,\n \\\\\\\"modified\\\\\\\": \\\\\\\"2026-05-21T08:31:29.486599444-05:00\\\\\\\"\n }\n]\\\"\"}"
+ }
+ ],
+ "isError": false
+ }
+}
+```
+
+```json :no-line-numbers title="After"
+{
+ "jsonrpc": "2.0",
+ "id": 3,
+ "result": {
+ "content": [
+ {
+ "type": "text",
+ "text": "{cwd:/Users/fdncred/src/nushell,history_index:0,timestamp:2026-05-21T15:20:18.004016+00:00,output:r#'[\n {\n \"name\": \"assets\",\n \"type\": \"dir\",\n \"size\": 160,\n \"modified\": \"2024-09-14T07:06:47.316979108-05:00\"\n },\n {\n \"name\": \"ast-grep\",\n \"type\": \"dir\",\n \"size\": 160,\n \"modified\": \"2026-01-07T06:22:12.488582817-06:00\"\n },\n {\n \"name\": \"benches\",\n \"type\": \"dir\",\n \"size\": 128,\n \"modified\": \"2026-05-21T08:31:29.486599444-05:00\"\n }\n]'#}"
+ }
+ ],
+ "isError": false
+ }
+}
+```
+
+### Improved errors for negative indices in cell paths
+
+Improved error messages when negative indices are used in cell paths.
+
+Previously, negative indices could produce misleading "Row number too large" errors (e.g., `[["foo", "bar"], ["foo", "baz"]] | get 0.-1`) or generic "NeedsPositiveValue" errors (e.g., `["foo", "bar", "baz"] | get (-1)`).
+
+Now Nushell reports clear messages such as "negative index is not supported in cell path" or "can't convert negative number to cell path".
+
+### Correctly parse `oneof` with a closure without pipe
+
+#### `oneof<..., table>`
+
+In some specific cases the parser could reject values provided to `oneof` typed parameters, such as rejecting table literal syntax for `oneof<.., table>`:
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36mdef[22m[39m [32mcmd[39m [1m[32m[--flag: oneof][22m[39m [1m[32m{}[22m[38;5;14m
+> [1m[36mcmd[22m[39m [1m[34m--flag [22m[39m[1m[41m[[foo]; 1][22m[49m
+Error: [31mnu::parser::parse_mismatch_with_full_string_msg
+[39m
+ [31m×[39m Parse mismatch during operation.
+ ╭─[[1m[4m[36mrepl_entry #17:1:12[22m[24m[39m]
+ [2m1[22m │ cmd --flag [[foo]; 1]
+ · [1m[35m ─────┬────[22m[39m
+ · [1m[35m╰── expected oneof[22m[39m
+ ╰────
+[0m
+```
+
+The parser no longer considers such code invalid.
+
+#### `oneof<..., closure>`
+
+Arguments of type `oneof<..., closure>`, could only be parsed as closures if they had a parameter list (`{|| }`).
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36mdef[22m[39m [32mcmd[39m [1m[32m[--flag: oneof][22m[39m [1m[32m{}[22m[38;5;14m
+> [1m[36mcmd[22m[39m [1m[34m--flag[22m[39m [1m[32m{|| [36mls[32m }[22m[38;5;14m
+> [1m[36mcmd[22m[39m [1m[34m--flag [22m[39m[1m[41m{ ls }[22m[49m
+Error: [31mnu::parser::parse_mismatch_with_full_string_msg
+[39m
+ [31m×[39m Parse mismatch during operation.
+ ╭─[[1m[4m[36mrepl_entry #21:1:12[22m[24m[39m]
+ [2m1[22m │ cmd --flag { ls }
+ · [1m[35m ───┬──[22m[39m
+ · [1m[35m╰── expected non-block value: oneof, closure()>[22m[39m
+ ╰────
+[0m
+```
+
+The parser now accepts calls like `cmd --flag { ls }`
+
+### Fixed table alignment with `header_on_separator`
+
+Alignment issues in `table` when `header_on_separator` is on are fixed:
+
+
+
+
+
+```:no-line-numbers title="Before"
+╭─#─┬─align──┬────val─────╮
+│ 0 │ _ │ __________ │
+│ 1 │ left │ a │
+│ 2 │ right │ 0 │
+│ 3 │ left │ a │
+│ 4 │ center │ ∅ │
+│ 5 │ left │ a │
+│ 6 │ center │ ∅ │
+│ 7 │ right │ 0 │
+╰───┴────────┴────────────╯
+```
+
+
+
+
+```:no-line-numbers title="After"
+╭─#─┬─align──┬────val─────╮
+│ 0 │ _ │ __________ │
+│ 1 │ left │ a │
+│ 2 │ right │ 0 │
+│ 3 │ left │ a │
+│ 4 │ center │ ∅ │
+│ 5 │ left │ a │
+│ 6 │ center │ ∅ │
+│ 7 │ right │ 0 │
+╰───┴────────┴────────────╯
+```
+
+
+
+
+
+### Add `--full-reparse/-f` to `run` command
+
+The `run` command now supports `--full-reparse`/`-f`, making workflows like `watch . -g *.nu | where path ends-with test.nu | each -f { run -f ./test.nu }` work as expected. Running scripts repeatedly is also fixed: starting with `nu -n`, then running `run toolkit.nu` twice now works, whereas previously a caching bug prevented the same file from being run more than once.
+
+### Improved default steps for fractional float ranges
+
+Float ranges without an explicit step now use more natural fractional steps, so `0.1..0.3` yields `0.1, 0.2, 0.3` instead of just `0.1`. This also means `0.1..0.3 | last` now correctly returns `0.3`. Float range values are now rounded to match the step's decimal precision, which removes floating-point display artifacts like `0.30000000000000004` from serialized output.
+
+
+
+
+
+```ansi :no-line-numbers title="Before"
+[38;5;14m> [1m[35m0.1[22m[33m..[1m[35m0.3[22m[39m [1m[35m|[22m[39m [1m[36mlast[22m[39m
+0.1[38;5;14m
+> [1m[35m0.1[22m[33m..[1m[35m0.3[22m[39m [1m[35m|[22m[39m [1m[36mto json[22m[39m [1m[34m-r[22m[39m
+[0.1][0m
+```
+
+
+
+
+```ansi :no-line-numbers title="After"
+[38;5;14m> [1m[35m0.1[22m[33m..[1m[35m0.3[22m[39m [1m[35m|[22m[39m [1m[36mlast[22m[39m
+0.3[38;5;14m
+> [1m[35m0.1[22m[33m..[1m[35m0.3[22m[39m [1m[35m|[22m[39m [1m[36mto json[22m[39m [1m[34m-r[22m[39m
+[0.1,0.2,0.3][38;5;14m
+> [1m[35m0.001[22m[33m..[1m[35m0.005[22m[39m [1m[35m|[22m[39m [1m[36mto json[22m[39m [1m[34m-r[22m[39m
+[0.001,0.002,0.003,0.004,0.005][38;5;14m
+> [1m[35m0.0[22m[33m..[1m[35m0.5[22m[39m [1m[35m|[22m[39m [1m[36mto json[22m[39m [1m[34m-r[22m[39m
+[0.0,0.1,0.2,0.3,0.4,0.5][0m
+```
+
+
+
+
+
+### Fixed stor open return type
+
+`stor open` returns the custom value `SQLiteDatabase`, yet it's signature had `sqlite-in-memory` as the return type. This causes problems with the `enforce-runtime-annotations` experimental option:
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36mlet[22m[39m [35mdb[39m = [1m[36mstor open[22m[39m
+Error: [31mnu::shell::cant_convert
+[39m
+ [31m×[39m Can't convert to sqlite-in-memory.
+ ╭─[[1m[4m[36mrepl_entry #2:1:10[22m[24m[39m]
+ [2m1[22m │ let db = stor open
+ · [1m[35m ────┬────[22m[39m
+ · [1m[35m╰── can't convert SQLiteDatabase to sqlite-in-memory[22m[39m
+ ╰────
+[0m
+```
+
+The return type has been corrected to `SQLiteDatabase`.
+
+### Improved module descriptions in completions and LSP hovers
+
+Descriptions of module completions for `use` were previously not formatted. Instead of what you would get from `help modules ...`, the descriptions were the modules' doc comment _as it appeared_ in the file (`#` and leading indent not removed).
+
+Before:
+
+```
+> use c
+ ╭───────╮ ╭─────────────────────────────────────────────╮
+ │clip │ │# Commands for interacting with the system │
+ ╰───────╯ │clipboard # # > These commands require your │
+ │terminal to support OSC 52 # > Terminal │
+ │multiplexers such as screen, tmux, zellij etc│
+ │may interfere with this command │
+ ╰─────────────────────────────────────────────╯
+```
+
+After:
+
+```
+> use c
+ ╭───────╮ ╭────────────────────────────────────────╮
+ │clip │ │Commands for interacting with the system│
+ ╰───────╯ │clipboard │
+ ╰────────────────────────────────────────╯
+```
+
+### Fix aliases breaking when variables used in them are shadowed
+
+Shadowing variables used in aliases could cause the alias to stop working:
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36mlet[22m[39m [35mx[39m = [1m[35m10[22m[38;5;14m
+> [1m[36malias[22m[39m [32mxx[39m [1m[36m=[22m[39m [1m[36mprint[22m[39m [35m$x[38;5;14m
+> [1m[36mxx[22m[39m
+10[38;5;14m
+> [1m[36mlet[22m[39m [35mx[39m = [1m[35m20[22m[38;5;14m
+> [1m[36mxx[22m[39m
+Error: [31mnu::shell::variable_not_found
+[39m
+ [31m×[39m Variable not found
+ ╭─[[1m[4m[36mrepl_entry #32:1:18[22m[24m[39m]
+ [2m1[22m │ alias xx = print $x
+ · [1m[35m ─┬[22m[39m
+ · [1m[35m╰── variable not found[22m[39m
+ ╰────
+[0m
+```
+
+Now aliases continue working with the original value of the variable:
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36mlet[22m[39m [35mx[39m = [1m[35m10[22m[38;5;14m
+> [1m[36malias[22m[39m [32mxx[39m [1m[36m=[22m[39m [1m[36mprint[22m[39m [35m$x[38;5;14m
+> [1m[36mxx[22m[39m
+10[38;5;14m
+> [1m[36mlet[22m[39m [35mx[39m = [1m[35m20[22m[38;5;14m
+> [1m[36mxx[22m[39m
+10[0m
+```
+
+### Fixed a bug in `--` option parsing
+
+Fixed a bug with how `--` was handled with `--wrapped` custom commands. Now you can do things like this:
+
+```ansi :no-line-numbers
+[38;5;14m> [1m[36mdef[22m[39m [1m[34m--wrapped[22m[39m [32mexample[39m [1m[32m[--my-flag: string ...rest][22m[39m [1m[32m{
+ [36mlet[22m[39m [35mrest[39m = [35m$rest[39m [1m[35m|[22m[39m [1m[36mskip[22m[39m [1m[35m1[22m[39m # skip the '--' delimiter
+ [35m$rest[39m [1m[35m|[22m[39m [1m[36meach[22m[39m [1m[34m{ [36m{[22m[32mtype[1m[36m: [34m([22m[35m$in[39m [1m[35m|[22m[39m [1m[36mdescribe[34m)[36m [22m[32mvalue[1m[36m: [22m[35m$in[1m[36m}[34m }[22m[39m [1m[35m|[22m[39m [1m[36mprint[22m[39m
+ [1m[36mprint[22m[39m [1m[36m$"[22m[32m--my-flag='[1m[34m([22m[35m$my_flag[1m[34m)[22m[32m'[1m[36m"[32m
+}[22m[38;5;14m
+> [1m[36mexample[22m[39m [1m[34m--my-flag[22m[39m=[32m"hi"[39m [1m[32m--[22m[39m [1m[32mtrue[22m[39m [1m[32mfalse[22m[39m [1m[32m001[22m[39m [1m[32m--my-flag="goodbye"[22m[39m
+╭───┬────────┬───────────────────╮
+│ [1m[32m#[22m[39m │ [1m[32mtype[22m[39m │ [1m[32mvalue[22m[39m │
+├───┼────────┼───────────────────┤
+│ [1m[32m0[22m[39m │ string │ true │
+│ [1m[32m1[22m[39m │ string │ false │
+│ [1m[32m2[22m[39m │ string │ 001 │
+│ [1m[32m3[22m[39m │ string │ --my-flag=goodbye │
+╰───┴────────┴───────────────────╯
+--my-flag='hi'[0m
+```
+
+### Improved Ctrl-C handling in `from json`
+
+Ctrl+C is more responsive in `from json`, `from kdl`, and `from xml` now respond promptly to Ctrl+C when parsing large files. Pressing Ctrl+C during parsing will interrupt the command and return to the prompt. It will also produce better parse-error messages and should now show a focused snippet of the source around the error location instead of dumping the entire file content.
+
+### Improved conflicting column names in `flatten`
+
+This pr fixes flatten renaming column behavior
+
+
+
+
+
+```ansi :no-line-numbers title="Before"
+[38;5;14m> [1m[34m[[[22m[32mb[1m[34m, [22m[32ma[1m[34m]; [[[[22m[32ma[1m[34m]; [[35m9[34m]], [35m1[34m]][35m
+|[22m[39m [1m[36mflatten[22m[39m [1m[34m-a[22m[39m [32mb[39m
+╭───┬───╮
+│ [1m[32m#[22m[39m │ [1m[32ma[22m[39m │
+├───┼───┤
+│ [1m[32m0[22m[39m │ 1 │
+╰───┴───╯[0m
+```
+
+
+
+
+```ansi :no-line-numbers title="After"
+[38;5;14m> [1m[34m[[[22m[32mb[1m[34m, [22m[32ma[1m[34m]; [[[[22m[32ma[1m[34m]; [[35m9[34m]], [35m1[34m]][35m
+|[22m[39m [1m[36mflatten[22m[39m [1m[34m-a[22m[39m [32mb[39m
+╭───┬─────┬───╮
+│ [1m[32m#[22m[39m │ [1m[32mb_a[22m[39m │ [1m[32ma[22m[39m │
+├───┼─────┼───┤
+│ [1m[32m0[22m[39m │ 9 │ 1 │
+╰───┴─────┴───╯[0m
+```
+
+
+
+
+
+### Row-conditions should parse `{}` as closure, not record
+
+Empty braces (`{}`) as row conditions are now parsed as empty closures rather than empty records.
+
+
+
+
+
+```ansi :no-line-numbers title="Before"
+[38;5;14m> [1m[35m1[22m[33m..[1m[35m3[22m[39m [1m[35m|[22m[39m [1m[36mwhere [22m[39m[1m[41m{}[22m[49m
+Error: [31mnu::parser::type_mismatch
+[39m
+ [31m×[39m Type mismatch.
+ ╭─[[1m[4m[36mrepl_entry #39:1:14[22m[24m[39m]
+ [2m1[22m │ 1..3 | where {}
+ · [1m[35m ─┬[22m[39m
+ · [1m[35m╰── expected bool, found record[22m[39m
+ ╰────
+[0m
+```
+
+
+
+
+```ansi :no-line-numbers title="After"
+[38;5;14m> [1m[35m1[22m[33m..[1m[35m3[22m[39m [1m[35m|[22m[39m [1m[36mwhere[22m[39m {}
+╭────────────╮
+│ [2mempty list[22m │
+╰────────────╯[0m
+```
+
+
+
+
+
+### Improved special-character handling in `idx search`
+
+Allow `idx search 'Lyrics['` to work by taking `[` literally instead of assuming it's a glob. Also added a couple examples explaining how `idx search` should work.
+
+```nushell title="Brackets and question marks are treated as literal text, not glob patterns."
+idx search 'arr[0]'
+```
+
+```nushell title="Glob patterns with a path separator filter which files to search."
+idx search pattern */tests/*
+```
+
+```nushell title="Brace expansion globs also filter which files to search."
+idx search pattern *.{rs,js}
+```
+
+### Fixed table mode handling from CLI arguments
+
+Respect the table mode when passed in on the cli when running script so you can do things like this.
+
+```ansi :no-line-numbers
+[38;5;14m> [32m'1..3 | each { { number: $in, comment: "hello" } }'[39m [1m[35m|[22m[39m [1m[36msave[22m[39m [36mscript.nu[38;5;14m
+> [36mnu[39m [1m[32m-m[22m[39m [1m[32m"none"[22m[39m [1m[32mscript.nu[22m[39m
+ [1m[32m#[22m[39m [1m[32mnumber[22m[39m [1m[32mcomment[22m[39m
+ [1m[32m0[22m[39m 1 hello
+ [1m[32m1[22m[39m 2 hello
+ [1m[32m2[22m[39m 3 hello[0m
+```
+
+### Improved `input list` streaming and rendering
+
+`input list` no longer waits for streamed input to be fully collected before showing the first paint. It now stays responsive while items stream in and shows a live-updating count of collected items in the footer. In table mode, header cells now expand properly along with their columns when scrolling through the list, and control characters like tabs no longer throw off UI alignment during rendering.
+
+### Fixed `nu --plugins` handling
+
+The nushell cli parsing now supports the `--plugins` parameter in these variations
+
+```nushell
+nu --plugins /path/to/nu_plugin_one --plugins /path/to/nu_plugin_two # multiple --plugins params
+nu --plugins '[/path/to/nu_plugin_one, /path/to/nu_plugin_two]' # comma separation
+nu --plugins '[/path/to/nu_plugin_one /path/to/nu_plugin_two]' # no comma separation
+nu --plugins '["/path/to plugin/nu_plugin_one", "/path/to plugin/nu_plugin_two"]' # quoted paths, with or without commas
+```
+
+### Other fixes
+
+- Fixed a regression where `commandline edit` did not update the commandline in REPL on 0.113.0. `commandline edit` now correctly updates the visible prompt buffer again. ([#18301](https://github.com/nushell/nushell/pull/18301))
+- - Fixed an issue where `math abs` would crash Nushell when given the minimum 64-bit integer or duration; it now reports an overflow error instead. ([#18275](https://github.com/nushell/nushell/pull/18275))
+- `bytes index-of` doesn't panic on empty patterns anymore ([#18254](https://github.com/nushell/nushell/pull/18254))
+- When using `explore config` if you supply `--output ` when you're editing the config i.e. not using `explore config` in json mode, it will fail fast and let you know that isn't possible instead of you finding that out later. ([#18327](https://github.com/nushell/nushell/pull/18327))
+- Fix Nix package evaluation for building from flake. ([#18330](https://github.com/nushell/nushell/pull/18330))
+- Now, when you pass an interpolated string (e. g. `$"($env.pwd)/foo"`, `~/($bar)`) to a flag or argument of type `glob` they will be converted automatically just like with regular strings instead of throwing a type error. ([#18263](https://github.com/nushell/nushell/pull/18263))
+- Fixed an issue where `lines` failed on input containing invalid UTF-8. By default, `lines` now replaces invalid UTF-8 bytes and continues processing, and `lines --strict` can be used to fail on invalid UTF-8. ([#18261](https://github.com/nushell/nushell/pull/18261))
+- Fixed `input list --fuzzy` truncating ANSI-styled options too early because formatting escape sequences were counted as visible width. ([#18340](https://github.com/nushell/nushell/pull/18340))
+- Fixed an issue where `uniq-by` silently collapsed every value into a single row when given a list whose elements are not records/tables. `uniq-by` now reports an error in that case (e.g. `[1 2 2] | uniq-by foo`), and it also reports a missing column when **any** record in the input lacks the requested column, not just the first one. ([#18309](https://github.com/nushell/nushell/pull/18309))
+- `bits shl` and `bits shr` now default to an 8-byte word size when `--number-bytes` is not provided, so shifts such as `1 | bits shl 20` no longer fail because the input was auto-sized to one byte. ([#18277](https://github.com/nushell/nushell/pull/18277))
+- Fixed a regression where lists like `[.foons]` will cause parser error. ([#18363](https://github.com/nushell/nushell/pull/18363))
+- Works better with Windows now for things like `glob c:\apps\*`. ([#18367](https://github.com/nushell/nushell/pull/18367))
+- Fixed a regression where all custom commands with `--wrapped` where numbers and strings passed to externals as `glob` now everything is passed as `string` or `glob` or creates an error. ([#18372](https://github.com/nushell/nushell/pull/18372))
+- While using experimental option `dc-glob`, `glob` expands `~` as expected now. ([#18373](https://github.com/nushell/nushell/pull/18373))
+- Fixes a bug where `glob .cargo/bin/nu*` nor `%ls .cargo/bin/nu*` wouldn't work. ([#18375](https://github.com/nushell/nushell/pull/18375))
+- Fix a breaking change that allows glob to still work in case-insensitive mode when using the `--ignore-case/-i` when using the dc-glob experimental-option. ([#18376](https://github.com/nushell/nushell/pull/18376))
+- glob with dc-glob = true now emits absolute paths when absolute patterns are used. The simple example was doing `glob ~/.cargo/bin/nu*` from within `~/Downloads` and making sure the results start with `/Users//.cargo/bin/nu`. Previously they incorrectly started with `/Users//Downloads/nu*` which was completely wrong. Thanks @Tyarel8 ! ([#18378](https://github.com/nushell/nushell/pull/18378))
+- Fix a bug with dcglob fixing a problem with rm. ([#18391](https://github.com/nushell/nushell/pull/18391))
+- All commands that can accept a polars expression can now accept a polars selector as input ([#18394](https://github.com/nushell/nushell/pull/18394))
+- Fixed a bug of AST flattening where leading pipe characters in a block may lead to wrong reedline renderings. ([#18386](https://github.com/nushell/nushell/pull/18386))
+- Small improvement in token-efficiency for the `nu --mcp` agent tool instructions. ([#18413](https://github.com/nushell/nushell/pull/18413))
+- - Fixed a panic in `str index-of --grapheme-clusters` when the search string matched inside a multi–code-point grapheme cluster (flag emoji, ZWJ sequence, skin-tone modifier, or combining mark); it now returns `-1`. ([#18418](https://github.com/nushell/nushell/pull/18418))
+- Typing `exit` in the repl will no longer use a different logic and will call the `exit` command normally. Furthermore, any invocation of `exit` (e.g. inside a keybind of custom command) will restore the terminal cursor to the state it was before rather than only in the aforementioned case. ([#18389](https://github.com/nushell/nushell/pull/18389))
+- Don't SIGABRT when closing your terminal or using nu as an MCP server. ([#18428](https://github.com/nushell/nushell/pull/18428))
+- Fixed an issue where inserting or upserting into a nested cell path of an empty list, such as `[] | insert 0.0 1`, produced a confusing error mentioning `18446744073709551615`. It now reports a clear "Row number too large (empty content)" error. ([#18463](https://github.com/nushell/nushell/pull/18463))
+- - Fixed a compiler error (`register_uninitialized`) when the right-hand side of an `and`/`or`/comparison collects `$in`, for example `... | where $in.x > 0 and not ($in.x > 5)`. ([#18465](https://github.com/nushell/nushell/pull/18465))
+- nu `--log-include` or `--log-exclude` now accept module or target name correctly. Previously it accepted log level instead. ([#18464](https://github.com/nushell/nushell/pull/18464))
+- Fixed an issue where `math avg`, `math sum`, and other math commands on tables produced a generic "Unable to give a result with this input" error instead of the real underlying error. List and table inputs now produce consistent error messages. ([#18480](https://github.com/nushell/nushell/pull/18480))
+- `help aliases` now correctly shows the alias name (not the target command name) for aliases to internal commands. ([#18483](https://github.com/nushell/nushell/pull/18483))
+
+# Hall of fame
+
+Thanks to all the contributors below for helping us solve issues, improve documentation, refactor code, and more! :pray:
+
+| author | change | link |
+| ---------------------------------------------- | --------------------------------------------------------------- | ------------------------------------------------------- |
+| [@Bahex](https://github.com/Bahex) | Consolidate version and other metadata in top level Cargo.toml | [#18286](https://github.com/nushell/nushell/pull/18286) |
+| [@hustcer](https://github.com/hustcer) | Fix nightly release workflow & upgrade Nu for workflows | [#18304](https://github.com/nushell/nushell/pull/18304) |
+| [@stormasm](https://github.com/stormasm) | Remove warning on PipelineMetadata | [#18317](https://github.com/nushell/nushell/pull/18317) |
+| [@Bahex](https://github.com/Bahex) | `get_locale_from_env_vars` in `nu-utils` | [#18313](https://github.com/nushell/nushell/pull/18313) |
+| [@Bahex](https://github.com/Bahex) | Consolidate column handling: record & table; SyntaxShape & Type | [#18308](https://github.com/nushell/nushell/pull/18308) |
+| [@sholderbach](https://github.com/sholderbach) | Omit some unnecessary allocations from the parser | [#18285](https://github.com/nushell/nushell/pull/18285) |
+| [@Mrfiregem](https://github.com/Mrfiregem) | Fix simple Clippy error | [#18331](https://github.com/nushell/nushell/pull/18331) |
+| [@blindFS](https://github.com/blindFS) | Remove fallback completion in custom completion | [#17857](https://github.com/nushell/nushell/pull/17857) |
+| [@Juhan280](https://github.com/Juhan280) | Nu-cli commands and tester | [#18267](https://github.com/nushell/nushell/pull/18267) |
+| [@zelshahawy](https://github.com/zelshahawy) | Fix typos in developer docs | [#18354](https://github.com/nushell/nushell/pull/18354) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Make `nu-test-support` compile without `os` feature | [#18361](https://github.com/nushell/nushell/pull/18361) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Expose `NuTester` internals | [#18371](https://github.com/nushell/nushell/pull/18371) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Make `Debug` for `Value` more compact by default | [#18377](https://github.com/nushell/nushell/pull/18377) |
+| [@fdncred](https://github.com/fdncred) | Refactor parser from one big file to smaller files | [#18388](https://github.com/nushell/nushell/pull/18388) |
+| [@casedami](https://github.com/casedami) | Use new highlighter api for better abbr expansion | [#18390](https://github.com/nushell/nushell/pull/18390) |
+| [@Bahex](https://github.com/Bahex) | Refactor type checking code. | [#18393](https://github.com/nushell/nushell/pull/18393) |
+| [@Bahex](https://github.com/Bahex) | Consolidate spread operator checking logic | [#18422](https://github.com/nushell/nushell/pull/18422) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Serialize `CellPath` via string representation | [#18434](https://github.com/nushell/nushell/pull/18434) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Fix CI not testing doctests | [#18441](https://github.com/nushell/nushell/pull/18441) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Serialize `Range` via string representation | [#18442](https://github.com/nushell/nushell/pull/18442) |
+| [@maximilize](https://github.com/maximilize) | - n/a (test-only; no behavior change) | [#18466](https://github.com/nushell/nushell/pull/18466) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Feature gate the `nu-heavy-utils` crate | [#18476](https://github.com/nushell/nushell/pull/18476) |
+| [@pheenty](https://github.com/pheenty) | n/a really | [#18482](https://github.com/nushell/nushell/pull/18482) |
+| [@Bahex](https://github.com/Bahex) | `toolkit run pr` runtime type checking issue | [#18489](https://github.com/nushell/nushell/pull/18489) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Ignore cargo audit errors about `quickxml` | [#18513](https://github.com/nushell/nushell/pull/18513) |
+| [@Bahex](https://github.com/Bahex) | `from xlsx/ods` datetime fixes | [#18516](https://github.com/nushell/nushell/pull/18516) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Fix locally running test suit by disabling colors | [#18517](https://github.com/nushell/nushell/pull/18517) |
+| [@stormasm](https://github.com/stormasm) | Require "nu-test-support/os" in dev dependencies | [#18518](https://github.com/nushell/nushell/pull/18518) |
+
+# Full changelog
+
+| author | title | link |
+| ---------------------------------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------- |
+| [@Alb-O](https://github.com/Alb-O) | save ~100 tokens in evaluate_tool.md instructions | [#18413](https://github.com/nushell/nushell/pull/18413) |
+| [@Alb-O](https://github.com/Alb-O) | feat(mcp): add structured evaluate output | [#18499](https://github.com/nushell/nushell/pull/18499) |
+| [@Ashif-107](https://github.com/Ashif-107) | Deprecate `str upcase`/`str downcase` and add `str uppercase`/`str lowercase` | [#18364](https://github.com/nushell/nushell/pull/18364) |
+| [@Bahex](https://github.com/Bahex) | Consolidate version and other metadata in top level Cargo.toml | [#18286](https://github.com/nushell/nushell/pull/18286) |
+| [@Bahex](https://github.com/Bahex) | Submodules are no longer implicitly imported | [#18303](https://github.com/nushell/nushell/pull/18303) |
+| [@Bahex](https://github.com/Bahex) | Consolidate column handling: record & table; SyntaxShape & Type | [#18308](https://github.com/nushell/nushell/pull/18308) |
+| [@Bahex](https://github.com/Bahex) | refactor: `get_locale_from_env_vars` in `nu-utils` | [#18313](https://github.com/nushell/nushell/pull/18313) |
+| [@Bahex](https://github.com/Bahex) | Add non UTF-8 text support for `url encode`/`url decode` | [#18314](https://github.com/nushell/nushell/pull/18314) |
+| [@Bahex](https://github.com/Bahex) | feat(ansi gradient): add completions for named gradients | [#18342](https://github.com/nushell/nushell/pull/18342) |
+| [@Bahex](https://github.com/Bahex) | fix(use): module descriptions should be properly formatted | [#18343](https://github.com/nushell/nushell/pull/18343) |
+| [@Bahex](https://github.com/Bahex) | fix(table): alignments of `expand` and `header_on_separator` | [#18344](https://github.com/nushell/nushell/pull/18344) |
+| [@Bahex](https://github.com/Bahex) | Fix/stor return type | [#18355](https://github.com/nushell/nushell/pull/18355) |
+| [@Bahex](https://github.com/Bahex) | Make experimental option `enforce-runtime-annotations` opt out | [#18359](https://github.com/nushell/nushell/pull/18359) |
+| [@Bahex](https://github.com/Bahex) | Refactor type checking code. | [#18393](https://github.com/nushell/nushell/pull/18393) |
+| [@Bahex](https://github.com/Bahex) | refactor(parser): consolidate spread operator checking logic | [#18422](https://github.com/nushell/nushell/pull/18422) |
+| [@Bahex](https://github.com/Bahex) | Type system improvements | [#18430](https://github.com/nushell/nushell/pull/18430) |
+| [@Bahex](https://github.com/Bahex) | fix!: make `from ods` and `from xlsx` consistent | [#18436](https://github.com/nushell/nushell/pull/18436) |
+| [@Bahex](https://github.com/Bahex) | Row-conditions should parse `{}` as closure, not record | [#18438](https://github.com/nushell/nushell/pull/18438) |
+| [@Bahex](https://github.com/Bahex) | Assortment of std improvements | [#18449](https://github.com/nushell/nushell/pull/18449) |
+| [@Bahex](https://github.com/Bahex) | Even more type system improvements | [#18450](https://github.com/nushell/nushell/pull/18450) |
+| [@Bahex](https://github.com/Bahex) | Error record passed to the `catch` block has more details | [#18479](https://github.com/nushell/nushell/pull/18479) |
+| [@Bahex](https://github.com/Bahex) | fix: `toolkit run pr` runtime type checking issue | [#18489](https://github.com/nushell/nushell/pull/18489) |
+| [@Bahex](https://github.com/Bahex) | feat: `from xlsx/ods` datetime fixes | [#18516](https://github.com/nushell/nushell/pull/18516) |
+| [@Dorumin](https://github.com/Dorumin) | append ...rest | [#18218](https://github.com/nushell/nushell/pull/18218) |
+| [@Dorumin](https://github.com/Dorumin) | bytes index-of panics when given empty byte slices | [#18254](https://github.com/nushell/nushell/pull/18254) |
+| [@Himanshu121865](https://github.com/Himanshu121865) | Fix showing target command name instead of alias name (#18351) | [#18483](https://github.com/nushell/nushell/pull/18483) |
+| [@Himanshu121865](https://github.com/Himanshu121865) | Fix `--content-type` flag being ignored for JSON body variants (#17640) | [#18496](https://github.com/nushell/nushell/pull/18496) |
+| [@Juhan280](https://github.com/Juhan280) | fix: remove content_type metadata in `nu-highlight` | [#18266](https://github.com/nushell/nushell/pull/18266) |
+| [@Juhan280](https://github.com/Juhan280) | refactor: nu-cli commands and tester | [#18267](https://github.com/nushell/nushell/pull/18267) |
+| [@Juhan280](https://github.com/Juhan280) | refactor: remove deprecated features of `grid` command | [#18276](https://github.com/nushell/nushell/pull/18276) |
+| [@Juhan280](https://github.com/Juhan280) | refactor(logging): simplify CLI filter parsing to allow target or module paths | [#18464](https://github.com/nushell/nushell/pull/18464) |
+| [@LeonidasZhak](https://github.com/LeonidasZhak) | docs: add binary data examples to hash md5/sha256 | [#18338](https://github.com/nushell/nushell/pull/18338) |
+| [@Mrfiregem](https://github.com/Mrfiregem) | fix(completions): Subcommand completions are now wrapped in quotes for `which` | [#18295](https://github.com/nushell/nushell/pull/18295) |
+| [@Mrfiregem](https://github.com/Mrfiregem) | Fix simple Clippy error | [#18331](https://github.com/nushell/nushell/pull/18331) |
+| [@Tyarel8](https://github.com/Tyarel8) | fix(`parser`): make interpolated strings coerced into globs | [#18263](https://github.com/nushell/nushell/pull/18263) |
+| [@Tyarel8](https://github.com/Tyarel8) | refactor exit logic | [#18389](https://github.com/nushell/nushell/pull/18389) |
+| [@Tyarel8](https://github.com/Tyarel8) | also use experimental_options env variable when loading config | [#18392](https://github.com/nushell/nushell/pull/18392) |
+| [@Tyarel8](https://github.com/Tyarel8) | delete deprecated stdlib copy and paste | [#18403](https://github.com/nushell/nushell/pull/18403) |
+| [@Tyarel8](https://github.com/Tyarel8) | add navigation shortcuts to `explore config` | [#18440](https://github.com/nushell/nushell/pull/18440) |
+| [@WindSoilder](https://github.com/WindSoilder) | fix flatten not renaming for later parent conflicting columns | [#18407](https://github.com/nushell/nushell/pull/18407) |
+| [@abdelkadouss](https://github.com/abdelkadouss) | add support for kdl format | [#18219](https://github.com/nushell/nushell/pull/18219) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump openssl from 0.10.79 to 0.10.80 | [#18256](https://github.com/nushell/nushell/pull/18256) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump crate-ci/typos from 1.46.2 to 1.46.3 | [#18294](https://github.com/nushell/nushell/pull/18294) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump crate-ci/typos from 1.46.3 to 1.47.1 | [#18336](https://github.com/nushell/nushell/pull/18336) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump crate-ci/typos from 1.47.1 to 1.47.2 | [#18379](https://github.com/nushell/nushell/pull/18379) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump sysinfo from 0.38.4 to 0.39.3 | [#18380](https://github.com/nushell/nushell/pull/18380) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump mq-markdown from 0.5.26 to 0.6.0 | [#18381](https://github.com/nushell/nushell/pull/18381) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump kdl from 6.5.0 to 6.7.1 | [#18382](https://github.com/nushell/nushell/pull/18382) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump itertools from 0.14.0 to 0.15.0 | [#18420](https://github.com/nushell/nushell/pull/18420) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump bytesize from 2.3.1 to 2.4.0 | [#18421](https://github.com/nushell/nushell/pull/18421) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump actions/checkout from 6 to 7 | [#18457](https://github.com/nushell/nushell/pull/18457) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump rmcp from 1.7.0 to 1.8.0 | [#18458](https://github.com/nushell/nushell/pull/18458) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump bytes from 1.11.1 to 1.12.0 | [#18459](https://github.com/nushell/nushell/pull/18459) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump quick-xml from 0.40.1 to 0.41.0 | [#18503](https://github.com/nushell/nushell/pull/18503) |
+| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump lsp-server from 0.7.9 to 0.8.0 | [#18505](https://github.com/nushell/nushell/pull/18505) |
+| [@ayax79](https://github.com/ayax79) | Introducing `polars map-batches` | [#18312](https://github.com/nushell/nushell/pull/18312) |
+| [@ayax79](https://github.com/ayax79) | Polars upgrade 0.54 | [#18345](https://github.com/nushell/nushell/pull/18345) |
+| [@ayax79](https://github.com/ayax79) | Fix overshadowing breaking aliases | [#18349](https://github.com/nushell/nushell/pull/18349) |
+| [@ayax79](https://github.com/ayax79) | Introducing Polars bitwise commands | [#18383](https://github.com/nushell/nushell/pull/18383) |
+| [@ayax79](https://github.com/ayax79) | Allow polars selectors as input for all commands that accept expressions as input. | [#18394](https://github.com/nushell/nushell/pull/18394) |
+| [@blindFS](https://github.com/blindFS) | fix(completion): remove fallback completion in custom completion | [#17857](https://github.com/nushell/nushell/pull/17857) |
+| [@blindFS](https://github.com/blindFS) | fix(parser): a regression of parse_unit_value where `[.foons]` not return early | [#18363](https://github.com/nushell/nushell/pull/18363) |
+| [@blindFS](https://github.com/blindFS) | fix(flatten): leading pipe character in a pipeline | [#18386](https://github.com/nushell/nushell/pull/18386) |
+| [@cacdu](https://github.com/cacdu) | fix(math): propagate errors from table columns instead of silencing them | [#18480](https://github.com/nushell/nushell/pull/18480) |
+| [@casedami](https://github.com/casedami) | fix: use new highlighter api for better abbr expansion | [#18390](https://github.com/nushell/nushell/pull/18390) |
+| [@cho-minsung](https://github.com/cho-minsung) | fix(math abs): return overflow error instead of panicking on i64::MIN | [#18275](https://github.com/nushell/nushell/pull/18275) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Bump to dev version | [#18274](https://github.com/nushell/nushell/pull/18274) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Bump to 0.113.1 | [#18307](https://github.com/nushell/nushell/pull/18307) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Fix packaging | [#18311](https://github.com/nushell/nushell/pull/18311) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Make `nu-test-support` compile without `os` feature | [#18361](https://github.com/nushell/nushell/pull/18361) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Expose `NuTester` internals | [#18371](https://github.com/nushell/nushell/pull/18371) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Make `Debug` for `Value` more compact by default | [#18377](https://github.com/nushell/nushell/pull/18377) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Serialize `CellPath` via string representation | [#18434](https://github.com/nushell/nushell/pull/18434) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Fix CI not testing doctests | [#18441](https://github.com/nushell/nushell/pull/18441) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Serialize `Range` via string representation | [#18442](https://github.com/nushell/nushell/pull/18442) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Feature gate the `nu-heavy-utils` crate | [#18476](https://github.com/nushell/nushell/pull/18476) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Ignore cargo audit errors about `quickxml` | [#18513](https://github.com/nushell/nushell/pull/18513) |
+| [@cptpiepmatz](https://github.com/cptpiepmatz) | Fix locally running test suit by disabling colors | [#18517](https://github.com/nushell/nushell/pull/18517) |
+| [@dalisyron](https://github.com/dalisyron) | Fix `uniq-by` not erroring on non-table lists (issue #14279) | [#18309](https://github.com/nushell/nushell/pull/18309) |
+| [@dmtrKovalenko](https://github.com/dmtrKovalenko) | chore: Upgrade to fff 0.9 and reenable watcher | [#18332](https://github.com/nushell/nushell/pull/18332) |
+| [@fdncred](https://github.com/fdncred) | feat(table): introduce width priority columns for enhanced table rendering | [#17850](https://github.com/nushell/nushell/pull/17850) |
+| [@fdncred](https://github.com/fdncred) | Implement experimental dc-glob backend for Nushell (Devyn's glob experiment) | [#18109](https://github.com/nushell/nushell/pull/18109) |
+| [@fdncred](https://github.com/fdncred) | Fix nested update closure for table columns | [#18205](https://github.com/nushell/nushell/pull/18205) |
+| [@fdncred](https://github.com/fdncred) | fix: prevent double escaping of string output in eval_on_state and add test | [#18260](https://github.com/nushell/nushell/pull/18260) |
+| [@fdncred](https://github.com/fdncred) | add 'run' command support and related parsing and testing functionality | [#18271](https://github.com/nushell/nushell/pull/18271) |
+| [@fdncred](https://github.com/fdncred) | update to 0.8.4, add follow-symlinks, fix `idx` family bugs | [#18284](https://github.com/nushell/nushell/pull/18284) |
+| [@fdncred](https://github.com/fdncred) | Refactor YAML handling to improve quoting logic and add support for multiline strings | [#18298](https://github.com/nushell/nushell/pull/18298) |
+| [@fdncred](https://github.com/fdncred) | Implement POSIX Guideline 10 `--` end-of-options delimiter | [#18299](https://github.com/nushell/nushell/pull/18299) |
+| [@fdncred](https://github.com/fdncred) | Update REPL loop to synchronize cursor position and buffer contents | [#18301](https://github.com/nushell/nushell/pull/18301) |
+| [@fdncred](https://github.com/fdncred) | update `ignore` to really ignore :) | [#18306](https://github.com/nushell/nushell/pull/18306) |
+| [@fdncred](https://github.com/fdncred) | bump `uu_*` deps to 0.9.0 | [#18322](https://github.com/nushell/nushell/pull/18322) |
+| [@fdncred](https://github.com/fdncred) | prevent `--output` to be used in `config_mode` in `explore config` command | [#18327](https://github.com/nushell/nushell/pull/18327) |
+| [@fdncred](https://github.com/fdncred) | chore: update Rust version to 1.94.1 in Cargo.toml and rust-toolchain.toml | [#18335](https://github.com/nushell/nushell/pull/18335) |
+| [@fdncred](https://github.com/fdncred) | Add `--full-reparse/-f` to `run` command | [#18339](https://github.com/nushell/nushell/pull/18339) |
+| [@fdncred](https://github.com/fdncred) | handle float ranges better | [#18348](https://github.com/nushell/nushell/pull/18348) |
+| [@fdncred](https://github.com/fdncred) | add category, search-terms, examples to toolkit.nu | [#18350](https://github.com/nushell/nushell/pull/18350) |
+| [@fdncred](https://github.com/fdncred) | fix input/output and example for `plugin list` | [#18357](https://github.com/nushell/nushell/pull/18357) |
+| [@fdncred](https://github.com/fdncred) | add context for the `idx search` command | [#18366](https://github.com/nushell/nushell/pull/18366) |
+| [@fdncred](https://github.com/fdncred) | patching for windows globbing was in the wrong place | [#18367](https://github.com/nushell/nushell/pull/18367) |
+| [@fdncred](https://github.com/fdncred) | allow `--context` to be one of int or range | [#18368](https://github.com/nushell/nushell/pull/18368) |
+| [@fdncred](https://github.com/fdncred) | update custom command `--wrapped` to not always convert to glob | [#18372](https://github.com/nushell/nushell/pull/18372) |
+| [@fdncred](https://github.com/fdncred) | allow dc-glob to expand tilde | [#18373](https://github.com/nushell/nushell/pull/18373) |
+| [@fdncred](https://github.com/fdncred) | fix a bug with dc-glob and `/some/path/wildcard*` | [#18375](https://github.com/nushell/nushell/pull/18375) |
+| [@fdncred](https://github.com/fdncred) | add case-insensitivity to dc-glob and glob command to avoid breaking changes | [#18376](https://github.com/nushell/nushell/pull/18376) |
+| [@fdncred](https://github.com/fdncred) | fix dc-glob issue with using relative paths vs absolute | [#18378](https://github.com/nushell/nushell/pull/18378) |
+| [@fdncred](https://github.com/fdncred) | refactor parser from one big file to smaller files | [#18388](https://github.com/nushell/nushell/pull/18388) |
+| [@fdncred](https://github.com/fdncred) | fix a problem with glob and rm | [#18391](https://github.com/nushell/nushell/pull/18391) |
+| [@fdncred](https://github.com/fdncred) | pin ratatui-widgets to 0.3.0 to prevent need for --locked | [#18395](https://github.com/nushell/nushell/pull/18395) |
+| [@fdncred](https://github.com/fdncred) | Revert "pin ratatui-widgets to 0.3.0 to prevent need for --locked" | [#18397](https://github.com/nushell/nushell/pull/18397) |
+| [@fdncred](https://github.com/fdncred) | refactor pushdown code into a query_plan to make it easier to add more pushdown filters | [#18398](https://github.com/nushell/nushell/pull/18398) |
+| [@fdncred](https://github.com/fdncred) | fixes a bug in the end-of-options functionality | [#18408](https://github.com/nushell/nushell/pull/18408) |
+| [@fdncred](https://github.com/fdncred) | add new `random pass` command | [#18410](https://github.com/nushell/nushell/pull/18410) |
+| [@fdncred](https://github.com/fdncred) | allow ctrl+c to work better on `from json` | [#18414](https://github.com/nushell/nushell/pull/18414) |
+| [@fdncred](https://github.com/fdncred) | Allow `is-terminal` to detect redirection | [#18443](https://github.com/nushell/nushell/pull/18443) |
+| [@fdncred](https://github.com/fdncred) | respect table mode passed on cli for scripts and repl | [#18446](https://github.com/nushell/nushell/pull/18446) |
+| [@fdncred](https://github.com/fdncred) | fix `idx search 'Lyrics['` bug | [#18447](https://github.com/nushell/nushell/pull/18447) |
+| [@fdncred](https://github.com/fdncred) | bump fff-search deps to 0.9.6 | [#18448](https://github.com/nushell/nushell/pull/18448) |
+| [@fdncred](https://github.com/fdncred) | bump quinn-proto | [#18453](https://github.com/nushell/nushell/pull/18453) |
+| [@fdncred](https://github.com/fdncred) | bump reedline to commit 31a91c3 | [#18455](https://github.com/nushell/nushell/pull/18455) |
+| [@fdncred](https://github.com/fdncred) | add a few new commands (union, intersect, difference, permutations, combinations) | [#18467](https://github.com/nushell/nushell/pull/18467) |
+| [@fdncred](https://github.com/fdncred) | add new log-level `perf` so we can more easily see only performance logging | [#18468](https://github.com/nushell/nushell/pull/18468) |
+| [@fdncred](https://github.com/fdncred) | bump rusqlite to 0.40.1 | [#18469](https://github.com/nushell/nushell/pull/18469) |
+| [@fdncred](https://github.com/fdncred) | add `semver` as a custom value type with support commands | [#18473](https://github.com/nushell/nushell/pull/18473) |
+| [@fdncred](https://github.com/fdncred) | bump reedline to 4d20caf | [#18474](https://github.com/nushell/nushell/pull/18474) |
+| [@fdncred](https://github.com/fdncred) | allow `idx find` and `idx search` to show hits relative to cwd | [#18477](https://github.com/nushell/nushell/pull/18477) |
+| [@fdncred](https://github.com/fdncred) | fix `nu --plugins` handling | [#18500](https://github.com/nushell/nushell/pull/18500) |
+| [@flying-sheep](https://github.com/flying-sheep) | feat: add `--right` to `split row` and `split column` | [#18444](https://github.com/nushell/nushell/pull/18444) |
+| [@guluo2016](https://github.com/guluo2016) | Inaccurate error message when using negative index in cell path | [#18282](https://github.com/nushell/nushell/pull/18282) |
+| [@hexbinoct](https://github.com/hexbinoct) | Fix usize underflow on insert/upsert into a nested path of an empty list | [#18463](https://github.com/nushell/nushell/pull/18463) |
+| [@hustcer](https://github.com/hustcer) | chore: Fix nightly release workflow & upgrade Nu for workflows | [#18304](https://github.com/nushell/nushell/pull/18304) |
+| [@i-api](https://github.com/i-api) | Add `--pretty` flag and align table columns in `to nuon` | [#18121](https://github.com/nushell/nushell/pull/18121) |
+| [@ian-h-chamberlain](https://github.com/ian-h-chamberlain) | Add `commandline complete` to invoke nushell completions | [#17941](https://github.com/nushell/nushell/pull/17941) |
+| [@ian-h-chamberlain](https://github.com/ian-h-chamberlain) | nu_style: support fixed color lookups | [#18325](https://github.com/nushell/nushell/pull/18325) |
+| [@ian-h-chamberlain](https://github.com/ian-h-chamberlain) | Fix nix flake build (rust toolchain + workspace package version) | [#18330](https://github.com/nushell/nushell/pull/18330) |
+| [@jlcrochet](https://github.com/jlcrochet) | `input list`: improve streaming stability/perf + rendering | [#18462](https://github.com/nushell/nushell/pull/18462) |
+| [@kronberger-droid](https://github.com/kronberger-droid) | Support reedline's verb-based edit commands in keybindings (Reedlines #1100) | [#18396](https://github.com/nushell/nushell/pull/18396) |
+| [@kronberger-droid](https://github.com/kronberger-droid) | Support reedline menu input/output modes and list description position | [#18404](https://github.com/nushell/nushell/pull/18404) |
+| [@kronberger-droid](https://github.com/kronberger-droid) | chore(reedline): bump reedline to 4a5ebce | [#18478](https://github.com/nushell/nushell/pull/18478) |
+| [@kyyril](https://github.com/kyyril) | fix: use lossy UTF-8 conversion in ByteStream lines iterator | [#18261](https://github.com/nushell/nushell/pull/18261) |
+| [@leeewee](https://github.com/leeewee) | Fix `str index-of --grapheme-clusters` panic on a sub-grapheme needle | [#18418](https://github.com/nushell/nushell/pull/18418) |
+| [@madjar](https://github.com/madjar) | http: use the response body for the error message | [#18387](https://github.com/nushell/nushell/pull/18387) |
+| [@maximilize](https://github.com/maximilize) | fix(compile): clone `$in` register for binary-op RHS to avoid clobbering LHS (#18323) | [#18465](https://github.com/nushell/nushell/pull/18465) |
+| [@maximilize](https://github.com/maximilize) | tests(for): regression test for non-block `for` body (#13746) | [#18466](https://github.com/nushell/nushell/pull/18466) |
+| [@mkatychev](https://github.com/mkatychev) | build(bin,lsp): add lsp feature flag to executable | [#18148](https://github.com/nushell/nushell/pull/18148) |
+| [@musicinmybrain](https://github.com/musicinmybrain) | Update roxmltree from 0.20 to 0.21 | [#18269](https://github.com/nushell/nushell/pull/18269) |
+| [@pheenty](https://github.com/pheenty) | feat(math): add math cbrt builtin | [#18481](https://github.com/nushell/nushell/pull/18481) |
+| [@pheenty](https://github.com/pheenty) | fix multiple search items help message | [#18482](https://github.com/nushell/nushell/pull/18482) |
+| [@pheenty](https://github.com/pheenty) | suggest command categories in help messages | [#18498](https://github.com/nushell/nushell/pull/18498) |
+| [@pickx](https://github.com/pickx) | fix: correctly parse `oneof` with a closure without pipe | [#17795](https://github.com/nushell/nushell/pull/17795) |
+| [@puneetdixit200](https://github.com/puneetdixit200) | Fix ANSI-aware truncation in `input list` (#18310) | [#18340](https://github.com/nushell/nushell/pull/18340) |
+| [@sholderbach](https://github.com/sholderbach) | chore: Omit some unnecessary allocations from the parser | [#18285](https://github.com/nushell/nushell/pull/18285) |
+| [@sjh9714](https://github.com/sjh9714) | Fix bit shift default byte size (#15155) | [#18277](https://github.com/nushell/nushell/pull/18277) |
+| [@stormasm](https://github.com/stormasm) | remove warning on PipelineMetadata | [#18317](https://github.com/nushell/nushell/pull/18317) |
+| [@stormasm](https://github.com/stormasm) | require "nu-test-support/os" in dev dependencies | [#18518](https://github.com/nushell/nushell/pull/18518) |
+| [@stuartcarnie](https://github.com/stuartcarnie) | fix: avoid SIGABRT from broken stdout/stderr on parent exit | [#18428](https://github.com/nushell/nushell/pull/18428) |
+| [@yertto](https://github.com/yertto) | fix(xlsx,ods): add --prefer-integers flag for whole-number float conversion | [#18497](https://github.com/nushell/nushell/pull/18497) |
+| [@zelshahawy](https://github.com/zelshahawy) | Fix typos in developer docs | [#18354](https://github.com/nushell/nushell/pull/18354) |
+| [@zhiburt](https://github.com/zhiburt) | Bump tabled to 0.21 | [#18320](https://github.com/nushell/nushell/pull/18320) |
diff --git a/typos.toml b/typos.toml
index b7fb981409f..19f50c18422 100644
--- a/typos.toml
+++ b/typos.toml
@@ -4,10 +4,12 @@ extend-exclude = ["pt-BR", "de", "ja", "es", "blog/202[0-4]*", "commands/", "fr"
[default]
extend-ignore-identifiers-re = [
"(?i)foobar", # false positive in book/sorting.md
+ '\b[0-9a-fA-F]{7}\b', # ignore 7-char git hashes
]
extend-ignore-re = [
- "\\x1b\\[[0-9;]*m.*", # ignore ansi color instructions
+ '\^\[\[[0-9;]*[A-Za-z]',
+ '\x1b\[[0-9;]*[A-Za-z]', # ignore ansi color instructions
]
[default.extend-words]