diff --git a/blog/2025-07-23-nushell_0_106_0.md b/blog/2025-07-23-nushell_0_106_0.md new file mode 100644 index 00000000000..357fe1638fb --- /dev/null +++ b/blog/2025-07-23-nushell_0_106_0.md @@ -0,0 +1,830 @@ +--- +title: Nushell 0.106.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.106.0 of Nu. This release adds... +--- + +# Nushell 0.106.0 + +Today, we're releasing version 0.106.0 of Nu. This release adds a system to test out new behavior with experimental options at run-time. This means, we don't need to break the behavior for regular users before we commit to a change. Furthermore this release ships many quality-of-life improvements to the help system, completions and many other areas. + +# Where to get it + +Nu 0.106.0 is available as [pre-built binaries](https://github.com/nushell/nushell/releases/tag/0.106.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_](#highlights-and-themes-of-this-release-toc) + - [_NEW: Experimental options_](#new-experimental-options-toc) + - [_Experimental options introduced by this release_](#experimental-options-introduced-by-this-release-toc) + - [_Improved fuzzy completion_](#improved-fuzzy-completion-toc) + - [_Arguments over possible commands_](#arguments-over-possible-commands-toc) + - [_Prefer prefix matches_](#prefer-prefix-matches-toc) + - [_Improvements to errors and warnings_](#improvements-to-errors-and-warnings-toc) +- [_Changes_](#changes-toc) + - [_Breaking changes_](#breaking-changes-toc) + - [_Regression: bare word interpolation on both sides does not work_](#regression-bare-word-interpolation-on-both-sides-does-not-work-toc) + - [_`path` and `directory` command arguments are no longer expanded_](#path-and-directory-command-arguments-are-no-longer-expanded-toc) + - [_Stricter compound assignment operator type checking_](#stricter-compound-assignment-operator-type-checking-toc) + - [_`parse`: unmatched optional capture groups are now `null`_](#parse-unmatched-optional-capture-groups-are-now-null-toc) + - [_Additions_](#additions-toc) + - [_Experimental options_](#experimental-options-toc) + - [_`clip` graduates from `std-rfc`_](#clip-graduates-from-std-rfc-toc) + - [_Improved documentation, errors, and warnings_](#improved-documentation-errors-and-warnings-toc) + - [_Commands_](#commands-toc) + - [_Deprecations_](#deprecations-toc) + - [_`--ignore-errors (-i)` renamed to `--optional (-o)`_](#ignore-errors-i-renamed-to-optional-o-toc) + - [_Bug fixes and other changes_](#bug-fixes-and-other-changes-toc) + - [_`table`_](#table-toc) + - [_Interrupting endless loops_](#interrupting-endless-loops-toc) + - [_Dynamic config with hooks and overlays_](#dynamic-config-with-hooks-and-overlays-toc) + - [_Preserve type of float values in conversions to various formats_](#preserve-type-of-float-values-in-conversions-to-various-formats-toc) + - [_Keybind action: `KillLine`_](#keybind-action-killline-toc) + - [_Polars_](#polars-toc) + - [_Additional bug fixes_](#additional-bug-fixes-toc) +- [_Hall of fame_](#hall-of-fame-toc) +- [_Full changelog_](#full-changelog-toc) + +# Highlights and themes of this release [[toc](#table-of-contents)] + +## NEW: Experimental options [[toc](#table-of-contents)] + +This release adds a new "experimental options" system that will help us test out changes to Nushell. This will help us find any possible breakages and gather feedback on ideas before we roll out new changes to everyone. + +**See the [full section](#experimental-options-toc) below for more information!** + +### Experimental options introduced by this release [[toc](#table-of-contents)] + +- [`reorder-cell-paths`](#Our-first-experimental-option-reorder-cell-paths) + +## Improved fuzzy completion [[toc](#table-of-contents)] + +### Arguments over possible commands [[toc](#table-of-contents)] + +Thanks to [@blindFS], with [#16112] fuzzy completion now prioritizes argument completions over possible command names in, which would push argument completions too far down to be useful. + +### Prefer prefix matches [[toc](#table-of-contents)] + +By enabling `nucleo`'s `prefer_prefix` option in [#16183], [@Bahex] made suggestions with matches closer to the start rank higher than suggestions that have matches further from the start. + +## Improvements to errors and warnings [[toc](#table-of-contents)] + +This release adds some polish to errors and warnings. It also comes along with some internal changes that will help us add more warnings and minimize breaking changes in the future. + +**To see some of the new additions (along with some screenshots), check out the [full section](#improved-documentation-errors-and-warnings-toc).** + +# Changes [[toc](#table-of-contents)] + +## Breaking changes [[toc](#table-of-contents)] + +### Regression: bare word interpolation on both sides does not work [[toc](#table-of-contents)] + +Unfortunately, we caught a regression shortly after release. Bare word interpolations (introduced in 0.105.0) which have expressions before and after a string component cause an error in 0.106.0. This was caused by the fix introduced in [#16204]. Here's an example which worked in 0.105.0, but not 0.106.0: + +```nushell +let x = 123 +($x)/foo/($x) +``` + +Note that these forms do still work in 0.106.0: + +```nushell +let x = 123 +($x)/foo +foo/($x) +``` + +We plan to address this with a 0.106.1 patch release in the coming days. We are hoping to resolve the regression, while still keeping the bug fix from [#16204]. + +### `path` and `directory` command arguments are no longer expanded [[toc](#table-of-contents)] + +As of [#15878], unquote file/directory paths as command arguments will no longer be expanded into absolute paths. This may break scripts which rely on the old absolute expansion. These paths should now be manually expanded. + +Paths with path components such as `..` and `~` are still expanded, but paths will not automatically be expanded into their absolute form. + +Here's an example with a simple custom command with a `path` parameter. Let's say we are in the directory `/home/user`, and we call it with the argument `test/../bar`: + +```nushell +def foo [my_path: path] { $my_path } + +foo test/../bar +``` + +| Before | After | +| :--------------: | :---: | +| `/home/user/bar` | `bar` | + +The `..` component is still expanded, but the path remains relative. + +### Stricter compound assignment operator type checking [[toc](#table-of-contents)] + +Compound assignment operators (`+=`, `/=`, etc.) now verify that the operation is compatible between the types. Anything that was disallowed with the "plain" operator (`+`, `/`, etc.) should now also be disallowed with the compound assignment operators. + +This mostly affects edge cases, but the mostly likely one to cause an issue is `/=`: + +```nushell +mut x = 1 + +# This was already an error +$x = $x / 2 + +# This is now an error +$x /= 2 +``` + +### `parse`: unmatched optional capture groups are now `null` [[toc](#table-of-contents)] + +As of [#16094], `parse` returns `null` for unmatched optional capture groups, rather than an empty string. This makes it possible distinguish unmatched groups from groups matching empty strings. + +```nushell +let example = r#' +user=0 action="bar" +user=0 action="" +user=0 +'# + +$example +| parse --regex '(?m)^user=(?[0-9]+)(?: action="(?[^"]*)")?$' +| to nuon +# => [[user, action]; ["0", bar], ["0", ""], ["0", ""]] +``` + +`user=0 action=""` and `user=0` are different, yet indistinguishable in `parse`'s output before this change. +Now it's clear: + +```nushell +[[user, action]; ["0", bar], ["0", ""], ["0", null]] +``` + +## Additions [[toc](#table-of-contents)] + +### Experimental options [[toc](#table-of-contents)] + +In [#16028], [#16093], [#16095], [#16096], [#16121] and [#15682], [@cptpiepmatz] set up the infrastructure for "experimental options". + +This allows us try out, as the name suggests, experimental changes from drastic refactors to unstable features without breaking daily usage. +If you want to opt in and try them out yourself, you can enable them in the following ways: + +- By setting the `NU_EXPERIMENTAL_OPTIONS` variable to a comma separated list of option names **before** running `nu`. + + ```sh + NU_EXPERIMENTAL_OPTIONS="reorder-cell-paths,.." nu + ``` + + This environment variable is **not** respected when running scripts to avoid breaking independent executable scripts. + +- By starting `nu` with the `--experimental-options` flag, passing in a list of option names. + ```nushell + nu --experimental-options=[reorder-cell-paths,..] + ``` + +::: tip Live on the edge +If you want to have all available experimental options on, rather than specifying them one by one, you can just use `all`! +::: + +::: note Enabling experimental options +If you use Nushell as your default shell in your terminal emulator, simply add whatever experimental options you'd like in your terminal config. + +On the other hand, if you use Nushell as your login shell, a quick (if not the most elegant) way to set this up is to put this snippet into your config (this example uses `all`): + +```nushell +if $nu.is-login and $env.NU_EXPERIMENTAL_OPTIONS? != "all" { + $env.NU_EXPERIMENTAL_OPTIONS = "all" + exec $nu.current-exe +} +``` + +The first time your login shell runs, this snippet will relaunch it with the `NU_EXPERIMENTAL_OPTIONS` environment variable set. This will ensure that any child processes of your login shell will also have the experimental options set. +::: + +#### Our first experimental option: `reorder-cell-paths` + +In [#15682], [@Bahex] changed the way cell-path access (when you access rows/columns of a value: `$table.foo.2`) works. + +Previously (or rather normally until this option becomes the default) cell-path access happened in the exact order the cell-path itself was specified. + +```nushell +let val = [[bar]; [{foo: [A, B]}], [{foo: [C, D]}]] + +$val.bar +# => [[foo]; [[A, B]], [[C, D]]] + +$val.bar.foo +# => [[A, B], [C, D]] + +$val.bar.foo.0 +# => [A, B] + +$val.bar.foo.0.0 +# => A +``` + +Even when you specified the exact cell (as with the last example), each step would happen in order. +So there were a lot of intermediate values that would be thrown away. + +While this is not much of a problem with small and relatively flat values, accessing a cell in large table had a noticeable performance impact in addition to using more memory. + +This could be worked around by reordering the cell-path to prioritize row accesses over column accesses: + +```nushell +$val.0.bar.foo.0 +# => A +``` + +With this change, this reordering is done automatically whenever possible. This also has the secondary effect of errors one may encounter: + +```nushell +let val = [{foo: A}, {baz: B}] +$val +# => ╭───┬─────┬─────╮ +# => │ # │ foo │ baz │ +# => ├───┼─────┼─────┤ +# => │ 0 │ A │ ❎ │ +# => │ 1 │ ❎ │ B │ +# => ╰───┴─────┴─────╯ + +$val.foo +# => Error: nu::shell::column_not_found +# => +# => × Cannot find column 'foo' +# => ╭─[entry #2:1:22] +# => 1 │ let val = [{foo: A}, {baz: B}] +# => · ────┬─── +# => · ╰── value originates here +# => ╰──── +# => ╭─[entry #4:1:6] +# => 1 │ $val.foo +# => · ─┬─ +# => · ╰── cannot find column 'foo' +# => ╰──── + +$val.foo.0 +# => A +``` + +### `clip` graduates from `std-rfc` [[toc](#table-of-contents)] + +After spending some time in `std-rfc`, with [#15877] `clip` module graduates to `std`, the first module from `std-rfc` to do so! + +Using `std-rfc/clip` will give a deprecation warning, instructing you to switch to the `std` version. + +### Improved documentation, errors, and warnings [[toc](#table-of-contents)] + +- With [#15892], text written in backticks inside help text will now be highlighted as code. If it's valid Nushell code, it will be highlighted as such. Otherwise, it will use a "dimmed" style. You can make use of this yourself in custom command documentation as well! Here's what this looks like with some examples on the `select` command documentation (notice `name` and `first 4` being highlighted): + + ![The select help documentation, with specific examples highlighted as nushell code](https://github.com/user-attachments/assets/a0efa0d7-fc11-4702-973b-a0b448c383e0) + +- Warnings should now be a bit more distinct: they will now show up with a orange caution symbol, rather than the same red X used for errors ([#16146]) + + ![Screenshot of a warning with an orange caution symbol](https://github.com/user-attachments/assets/3ff0d3cf-ab1e-47f2-aff7-586ecea5a32a) + +- As of [#16166], "generic" errors and warnings will now show up with a default error code (ex. `nu::shell::error`) indicating which part of Nushell it originates from. This should make errors appear more consistent. (This also applies to errors created with `error make`!) + + | Before | After | + | :----------------------------: | :----------------------------------: | + | ![Error without an error code] | ![Error with a nu parser error code] | + +- The history isolation feature only works when using the SQLite history. However, previously there was no indication of this. [#16151] adds a warning if you attempt to use history isolation in combination with the text format history. + + ![A warning indicating that history isolation is only compatible with the SQLite history format](https://github.com/user-attachments/assets/1828b960-082e-40ff-b0dd-738348c5678e) + +### Commands [[toc](#table-of-contents)] + +- This release adds `only` to `std-rfc`, inside the `iter` module ([#16015]). This behaves similar to `first` in that it errors if the input is empty, but it also ensures that the input has no additional elements. This can be useful when chained with `where` for example, when you expect only one element should match a condition: + ```nushell + ls | where name == "foo.txt" | only modified + ``` + This example is similar to `get 0.modified`, while also ensuring there's only one matching row. +- Thanks to [@JohnSwiftC], the `parse` command now allows you to specify a backtrack limit for the regex engine in [#16000]. This can help out for complicated regexes, where the default backtricking limit isn't large enough. +- Thanks to [@kumarUjjawal], the `drop nth` command now supports spreading its arguments. This allows you to spread a list of indices directly into `drop nth` ([#15897]). Here's a (contrived) example: + ```nushell + ls | drop nth ...[1 2 3] + ``` +- There are some improvements to the `find` command, thanks to [@new-years-eve]: + - Text in nested structures will now be properly highlighted. ([#15850]) + - The `help` command now re-uses the internals of the `find` command, rather than reimplementing it ([#15982]) +- The `http` command can now be used without manually specifying `get` or `post`, thanks to [@noahfraiture]. If just `http` is used, the request type will automatically be chosen to be `GET` if there is no payload. If there is a payload, the request type will be `POST` ([#15862]). +- Thanks to [@weirdan], `query xml` allows using namespace prefixes in the XPath query by specifying the namespace with the `--namespaces` flag ([#16008]). +- It's now possible to get the span of a pipeline using the `metadata` and `metadata access` commands with [#16014]. This makes it possible to have nicer errors which point at the source of a value. Here's an example, using the span from `metadata access` to point at `ls`: + ```nushell + ls | metadata access {|meta| + error make {msg: "error", label: {text: "here", span: $meta.span}} + } + # => Error: nu::shell::error + # => + # => × error + # => ╭─[entry #1:1:1] + # => 1 │ ls | metadata access {|meta| + # => · ─┬ + # => · ╰── here + # => 2 │ error make {msg: "error", label: {text: "here", span: $meta.span}} + # => ╰──── + ``` +- Thanks to [@echasnovski], the `gstat` plugin now has a `state` entry indicating the current state of the git repo. For example, it can indicate whether the repo state is `clean`, or in the middle of a `merge` or `rebase`. ([#15965]) +- There is a new table theme called `double`, thanks to [@echasnovski] in [#16013]. This is similar to the `single` theme, but, well, double! Here's an example: + ``` + ╔═══╦═══╦════╗ + ║ # ║ a ║ b ║ + ╠═══╬═══╬════╣ + ║ 0 ║ 1 ║ 11 ║ + ║ 1 ║ 2 ║ 12 ║ + ╚═══╩═══╩════╝ + ``` +- In [#16099], [@yertto] style reset codes to `ansi` + +## Deprecations [[toc](#table-of-contents)] + +### `--ignore-errors (-i)` renamed to `--optional (-o)` [[toc](#table-of-contents)] + +Affected commands: + +- `get --ignore-errors` +- `select --ignore-errors` +- `reject --ignore-errors` + +`--ignore-errors (-i)` flag is renamed to `--optional (-o)` to better reflect it's behavior and use terminology consistent with cell-paths. + +This is also intended to free the `-i` short flag to stand for `--ignore-case` (not yet implemented) which will treat all parts of the cell-path arguments as case insensitive. + +There will of course be long deprecation period to avoid breaking existing code. + +Implemented by [@Bahex] in [#16007]. + +::: tip +Nushell currently doesn't have a great way to disable deprecation warnings for code that might not be yours. If you have issues with integrations which are not updated with this and don't want to see the deprecation warnings, you can add a small wrapper around `get` to squelch the warnings as a workaround. + +**Please note that this will also disable the warnings for your own scripts!** Use this with caution. + +Here's a small example demonstrating the concept: + +```nushell +alias get-builtin = get +def get [--optional (-o), --ignore-errors (-i), --sensitive (-s), cell_path: cell-path, ...rest: cell-path] { + get-builtin --optional=($optional or $ignore_errors) $cell_path ...$rest + +``` + +**To actually use this**, here is a more fully featured version with documentation and examples. You can put this in your `env.nu` to silence the warnings: + +
+Click here to expand code + +```nushell +alias get-builtin = get + +# Extract data using a cell path. +# +# This is equivalent to using the cell path access syntax: `$env.OS` is the same as `$env | get OS`. +# +# If multiple cell paths are given, this will produce a list of values. +@example "Get an item from a list" { [0 1 2] | get 1 } --result 1 +@example "Get a column from a table" { [{A: A0}] | get A } --result [A0] +@example "Get a cell from a table" { [{A: A0}] | get 0.A } --result A0 +@example "Extract the name of the 3rd record in a list (same as `ls | $in.name.2`)" { ls | get name.2 } +@example "Extract the name of the 3rd record in a list" { ls | get 2.name } +@example "Getting Path/PATH in a case insensitive way" { $env | get paTH! } +@example "Getting Path in a case sensitive way, won't work for `PATH`" { $env | get Path } +def get [ + --optional (-o) # make all cell path members optional (returns null for missing values), + --ignore-errors (-i) # ignore missing data (make all cell path members optional) (deprecated), + --sensitive (-s) # get path in a case sensitive manner (deprecated), + cell_path: cell-path # The cell path to the data. + ...rest: cell-path # Additional cell paths. +]: [ + list -> any, + table -> any, + record -> any, + nothing -> nothing +] { + get-builtin --optional=($optional or $ignore_errors) --sensitive=$sensitive $cell_path ...$rest +} +``` + +
+ +_This workaround was inspired by [@JoaquinTrinanes]'s [similar workaround](https://github.com/nix-community/home-manager/pull/7490). Thanks for the inspiration!_ +::: + + + +## Bug fixes and other changes [[toc](#table-of-contents)] + +### `table` [[toc](#table-of-contents)] + +Previously, `table --expand` could panic under some circumstances while attempting to wrap content in cells. Thanks to [@zhiburt], this is no longer the case and `table -e` works as expected. +[@zhiburt] also optimized the `table` command in [#15900], [#15901], [#15902]. + +### Interrupting endless loops [[toc](#table-of-contents)] + +By making the IR evaluator check for interrupts before certain instructions, [@132ikl] made it possible to break out of endless loops in [#16134]. + +### Dynamic config with hooks and overlays [[toc](#table-of-contents)] + +Thanks to [@Bahex], with [#16021] hooks (`$env.config.hooks`) can update `$env.config` and have the config change take effect as expected, where previously the change wouldn't take effect until `$env.config` was manually updated in some way. + +With [#16154], changes to `$env.config` caused by `overlay use` and `overlay hide` take effect as expected. + +### Preserve type of float values in conversions to various formats [[toc](#table-of-contents)] + +Previously, nushell omitted the decimal part of round float numbers. This affected: + +- conversions to delimited formats: `csv`, `tsv` +- textual formats: `html`, `md`, `text` +- pretty printed `json` (`--raw` was unaffected) +- float values are displayed in the REPL + +With [#16016], float numbers are always represented with at least on decimal place which means: + +- round trips through `csv`, `tsv`, and `json` preserve the type of round floats +- It's always clear whether a number is an integer or a float in the REPL + ```nushell + 4 / 2 + # => 2.0 + ``` + +### Keybind action: `KillLine` [[toc](#table-of-contents)] + +In [#16221], [@sholderbach] Added `{edit: KillLine}`, which mimics emacs' `Ctrl-K` behavior. + +### Polars [[toc](#table-of-contents)] + +[@ayax79] made several PRs improving the polars plugin: + +- [#15963]: Make polars last consistent with polars first +- [#15964]: Allow `polars schema --datatype-list` to be used without pipeline input +- [#16132]: Added flag limit for `polars arg-sort` +- [#15953]: Add groupby support for `polars last` + +### Additional bug fixes [[toc](#table-of-contents)] + +- In [#15980], [@Bahex] fixed the `std/log` module to work when the logging related environment variables aren't set. +- In [#16155], [@Bahex] made the `get` command work similar to normal cell-path accesses on `null` values. +- In [#16184], [@Bahex] fixed an issue where errors inside of `export-env` blocks would not be properly reported when using `overlay use`. +- In [#16192], [@Bahex] fixed an (annoying) issue where duplicated text would appear on the command line when typing a `where` command. +- In [#16204], [@Bahex] fixed an issue where repeated parenthesis caused memory leak. +- In [#16219], [@Bahex] fixed `group-by --to-table` to return an empty list on empty input. +- In [#15919], [@JoaquinTrinanes], changed argument parsing to use the latest specified flag value when repeated. This makes having flags in aliases more convenient. +- In [#16018], [@Mrfiregem] allowed `update cells` to work on single records. +- In [#15955], [@Mrfiregem] made it possible to use `default` with a closure that produces a stream. +- In [#15904], [@WindSoilder] fixed an issue where `hide-env` would incorrectly hide environment variables outside of an overlay. +- In [#16171], [@WindSoilder] fixed an issue where piping to an external command into a value would cause the command to continue running. It now sends a SIGPIPE to the process, similarly to how piping a long running command into a command which immediately exits will send a SIGPIPE to the long running command. +- In [#16033], [@adithyaov] update the behavior of `start` to expand paths before passing them to external programs, making it work reliably. +- In [#15780], [@blindFS] refactored how columns are checked for in records, increasing performance. +- In [#15998], [@blindFS] fixed an issue where tab completion for a path argument would sometimes incorrectly expand paths with prefixes such as tildes. +- In [#16001], [@kumarUjjawal] fixed a panic for the `random dice` command when using `--sides 0`. +- In [#16049], [@kumarUjjawal] added an error when both --datasource-filepath and -datasource-ls are used together, as they are incompatibe with each other. +- In [#15950], [@liquid-dragons] improved the precision of parsing filesize values. Previously, there were some rounding errors for large filesize units. +- In [#16194], [@marienz] fixed type checking for optional arguments to a closure. Before, only positional arguments would be type checked. +- In [#16152], [@ryanxcharles] fixed typo on the pipeline redirection operatros documentation (`help pipe-and-redirect`). +- In [#16176], [@sgvictorino] fixed spans pointing to rest parameters. Using `metadata` on a `...rest` argument should now give the span for all of the arguments, not just the first one. +- In [#15985], [@sholderbach] restricted `$env.config.show_banner` to valid options. Assigning an invalid option now throws an error. +- In [#15838], [@fdncred] fixed `stor` insert/delete collision +- In [#16133], [@dead10ck] fixed polars' datetime type conversion + +# Hall of fame [[toc](#table-of-contents)] + +Thanks to all the contributors below for helping us solve issues, improve documentation, refactor code, and more! :pray: + +| author | title | link | +| ----------------- | ------------------------------------------------------------------------------- | -------- | +| [@132ikl] | Update default (scaffold) config blurb | [#16165] | +| [@Axlefublr] | default config: add note for figuring out datetime escape sequences | [#16051] | +| [@weirdan] | Clearer help section for command attributes | [#15999] | +| [@sholderbach] | Add automatic reminder for `doc_config.nu` | [#15984] | +| [@liquid-dragons] | If `save`-ing with non-existing parent dir, return directory_not_found | [#15961] | +| [@liquid-dragons] | Fix docs typo referring to non-existent `Value::CustomValue` | [#15954] | +| [@jasha-hrp] | Use correct column name in `history import -h` example | [#16190] | +| [@hustcer] | Add loongarch64-unknown-linux-musl build target | [#16020] | +| [@fdncred] | fix `ansi --list` missing new items | [#16113] | +| [@fdncred] | fix LS_COLORS fi=0 coloring | [#16012] | +| [@fdncred] | respect color_config.header color for record key | [#16006] | +| [@fdncred] | add `like`, `not-like` to `help operators` | [#15959] | +| [@dilr] | 'find --columns .. --regex ..' works. Change help message to match. | [#16103] | +| [@cptpiepmatz] | fix: unwrap `ShellErrorBridge` in `ByteStream::into_bytes` | [#16161] | +| [@cptpiepmatz] | Panic when converting `other` I/O errors into our I/O errors | [#16160] | +| [@cptpiepmatz] | Fix: missing `installed_plugins` in `version` | [#16004] | +| [@cptpiepmatz] | Revert "update nushell to use coreutils v0.1.0 crates (#15896)" | [#15932] | +| [@cptpiepmatz] | Use `CARGO_CFG_FEATURE` to get feature list in `version` | [#15972] | +| [@cptpiepmatz] | Generalize `nu_protocol::format_shell_error` | [#15996] | +| [@cptpiepmatz] | Move `nu_command::platform::ansi` to `nu_command::strings::ansi` | [#15995] | +| [@cptpiepmatz] | Update `config nu --doc` to represent OSC 7 and 9;9 better | [#15979] | +| [@cptpiepmatz] | Add `full` feature as an alternative to `--all-features` | [#15971] | +| [@blindFS] | fix: panic of if command as a constant expr by bringing back `Type::Block` | [#16122] | +| [@Tyarel8] | fix(std/help): add `debug -v` to string default parameters | [#16063] | +| [@Tyarel8] | feat(std/help): add `is_const` information | [#16032] | +| [@Tyarel8] | feat(std/help): Add `--help` for external-commands | [#15962] | +| [@132ikl] | Print errors during stdlib testing | [#16128] | +| [@x8x] | Fix typo in glob example description ("files for folders" → "files or folders") | [#16206] | +| [@marienz] | Better error on spawn failure caused by null bytes | [#15911] | +| [@Tyarel8] | fix(std/help): `collect` windows `--help` output for gui programs | [#16019] | +| [@Tyarel8] | feat(format number): add `--no-prefix` flag | [#15960] | +| [@Tyarel8] | feat(ansi): use `_` in short name and rst -> reset | [#15907] | +| [@Klapptnot] | fix quotation rules | [#16089] | + +# Full changelog [[toc](#table-of-contents)] + +| author | title | link | +| ------------------ | ------------------------------------------------------------------------------------------------- | -------- | +| [@Bahex] | fix: highlighting a where command with invalid arguments can duplicate text | [#16192] | +| [@sholderbach] | Add `KillLine` to the `EditCommand` parser | [#16221] | +| [@sholderbach] | Fix the `nu-path` fuzz-target | [#16188] | +| [@Bahex] | group by to table empty | [#16219] | +| [@sholderbach] | Bump reedline to 0.41.0 | [#16220] | +| [@Bahex] | fix(parser): repeated `(` / parenthesis / opened sub-expressions causes memory leak | [#16204] | +| [@x8x] | Fix typo in glob example description ("files for folders" → "files or folders") | [#16206] | +| [@Bahex] | feat(completion): enable nucleo's `prefer_prefix` option | [#16183] | +| [@xentec] | deps: bump sysinfo to v0.36 to improve `sys temp` command | [#16195] | +| [@132ikl] | Check for interrupt before each IR instruction | [#16134] | +| [@marienz] | Also type-check optional arguments | [#16194] | +| [@Klapptnot] | fix quotation rules | [#16089] | +| [@jasha-hrp] | Use correct column name in `history import -h` example | [#16190] | +| [@sgvictorino] | fix rest parameter spans | [#16176] | +| [@Bahex] | fix(overlay use): report errors in export-env | [#16184] | +| [@cptpiepmatz] | Panic when converting `other` I/O errors into our I/O errors | [#16160] | +| [@Bahex] | Revert "Add `extern` for `nu` command" | [#16180] | +| [@132ikl] | Add warning when using history isolation with non-SQLite history format | [#16151] | +| [@132ikl] | Add `ShellWarning` | [#16147] | +| [@132ikl] | Print errors during stdlib testing | [#16128] | +| [@132ikl] | Add default error codes | [#16166] | +| [@Bahex] | refactor(get,select,reject)!: deprecate --ignore-errors in favor of --optional | [#16007] | +| [@blindFS] | fix(completion): put argument completion results before commands | [#16112] | +| [@132ikl] | Add `extern` for `nu` command | [#16119] | +| [@ayax79] | Polars limit housekeeping | [#16173] | +| [@WindSoilder] | print to a value should be a SIGPIPE | [#16171] | +| [@132ikl] | Update default (scaffold) config blurb | [#16165] | +| [@cptpiepmatz] | fix: unwrap `ShellErrorBridge` in `ByteStream::into_bytes` | [#16161] | +| [@Bahex] | fix(overlay): `overlay use` and `overlay hide` now update config state | [#16154] | +| [@mgrachev] | Bump `update-informer` to `v1.3.0` | [#16157] | +| [@Bahex] | fix(get): to be consistent with regular cell-path access on `null` values | [#16155] | +| [@fdncred] | update to latest reedline | [#16156] | +| [@echasnovski] | fix(gstat): make `state` entry lowercase | [#16153] | +| [@app/dependabot] | build(deps): bump indicatif from 0.17.9 to 0.17.11 | [#16136] | +| [@132ikl] | Use Severity::Warning for miette warnings | [#16146] | +| [@ryanxcharles] | fix typo on documentation about pipes | [#16152] | +| [@dead10ck] | polars: fix datetime type conversion | [#16133] | +| [@ayax79] | Added flag limit for `polars arg-sort` | [#16132] | +| [@blindFS] | fix: panic of if command as a constant expr by bringing back `Type::Block` | [#16122] | +| [@hustcer] | Update winget default INSTALLDIR for per-machine install path | [#16026] | +| [@zhiburt] | nu-table: optimize table creation and width functions | [#15900] | +| [@cptpiepmatz] | Add `all` to enable all active experimental options | [#16121] | +| [@fdncred] | fix `ansi --list` missing new items | [#16113] | +| [@132ikl] | Fix type checking for assignment operators | [#16107] | +| [@dilr] | 'find --columns .. --regex ..' works. Change help message to match. | [#16103] | +| [@yertto] | feat: add ansi style reset codes | [#16099] | +| [@kumarUjjawal] | fix(metadata set): return error when both --datasource-filepath and -datasource-ls are used | [#16049] | +| [@Bahex] | refactor(nu-command/parse)!: Return `null` for unmatched capture groups, rather than empty string | [#16094] | +| [@cptpiepmatz] | Allow enabling deprecated experimental options | [#16096] | +| [@cptpiepmatz] | Forward experimental options in `toolkit run` | [#16095] | +| [@Bahex] | perf: reorder cell-path member accesses to avoid clones | [#15682] | +| [@cptpiepmatz] | Allow dashes in experimental option identifiers | [#16093] | +| [@app/dependabot] | build(deps): bump indexmap from 2.9.0 to 2.10.0 | [#16087] | +| [@app/dependabot] | build(deps): bump quick-xml from 0.37.1 to 0.37.5 | [#16086] | +| [@app/dependabot] | build(deps): bump crate-ci/typos from 1.33.1 to 1.34.0 | [#16088] | +| [@cptpiepmatz] | Add infrastructure for experimental options | [#16028] | +| [@132ikl] | Add pipeline span to `metadata` | [#16014] | +| [@fdncred] | update rust version 1.86.0 | [#16077] | +| [@sholderbach] | Fix easy clippy lints from latest stable | [#16053] | +| [@Tyarel8] | fix(std/help): add `debug -v` to string default parameters | [#16063] | +| [@liquid-dragons] | If `save`-ing with non-existing parent dir, return directory_not_found | [#15961] | +| [@sholderbach] | Bump `strip-ansi-escapes` to deduplicate `vte` | [#16054] | +| [@Bahex] | `to `: preserve round float numbers' type | [#16016] | +| [@sholderbach] | Add `tango` folder to .gitignore | [#16052] | +| [@Axlefublr] | default config: add note for figuring out datetime escape sequences | [#16051] | +| [@musicinmybrain] | Update which from 7.0.3 to 8.0.0 | [#16045] | +| [@fdncred] | update nushell to latest reedline e4221b9 | [#16044] | +| [@Bahex] | fix(hooks): updating `$env.config` now correctly updates config state. | [#16021] | +| [@132ikl] | Add backtick code formatting to `help` | [#15892] | +| [@Mrfiregem] | Stream lazy `default` output | [#15955] | +| [@adithyaov] | Update the behaviour how paths are interpreted in `start` | [#16033] | +| [@132ikl] | Add `only` command to `std-rfc/iter` | [#16015] | +| [@ayax79] | polars 0.49 upgrade | [#16031] | +| [@Tyarel8] | feat(std/help): add `is_const` information | [#16032] | +| [@kumarUjjawal] | fix(random dice): gracefully handle --sides 0 using NonZeroUsize | [#16001] | +| [@hustcer] | Add loongarch64-unknown-linux-musl build target | [#16020] | +| [@Tyarel8] | fix(std/help): `collect` windows `--help` output for gui programs | [#16019] | +| [@Mrfiregem] | allow `update cells` to work on single records | [#16018] | +| [@kumarUjjawal] | drop nth command supports spreadable arguments | [#15897] | +| [@blindFS] | fix(completion): invalid prefix for external path argument with spaces | [#15998] | +| [@echasnovski] | feat(table): add 'double' table mode | [#16013] | +| [@fdncred] | fix LS_COLORS fi=0 coloring | [#16012] | +| [@blindFS] | perf: better scalability of get_columns | [#15780] | +| [@Tyarel8] | feat(std/help): Add `--help` for external-commands | [#15962] | +| [@weirdan] | Support namespaces in `query xml` | [#16008] | +| [@fdncred] | respect color_config.header color for record key | [#16006] | +| [@cptpiepmatz] | Fix: missing `installed_plugins` in `version` | [#16004] | +| [@JohnSwiftC] | Add backtrack named flag to parse (issue #15997) | [#16000] | +| [@cptpiepmatz] | Bump `calamine` to 0.28 | [#16003] | +| [@cptpiepmatz] | Use `CARGO_CFG_FEATURE` to get feature list in `version` | [#15972] | +| [@weirdan] | Clearer help section for command attributes | [#15999] | +| [@cptpiepmatz] | Generalize `nu_protocol::format_shell_error` | [#15996] | +| [@cptpiepmatz] | Move `nu_command::platform::ansi` to `nu_command::strings::ansi` | [#15995] | +| [@sholderbach] | Restrict `config.show_banner` to valid options | [#15985] | +| [@sholderbach] | Disallow `clippy::used_underscore_binding` lint | [#15988] | +| [@app/dependabot] | build(deps): bump shadow-rs from 1.1.1 to 1.2.0 | [#15989] | +| [@sholderbach] | Add automatic reminder for `doc_config.nu` | [#15984] | +| [@new-years-eve] | Search nested structures recursively in `find` command | [#15850] | +| [@cptpiepmatz] | Update `config nu --doc` to represent OSC 7 and 9;9 better | [#15979] | +| [@132ikl] | Adjust std-rfc/clip deprecation window | [#15981] | +| [@new-years-eve] | Use internal find.rs code for `help --find` | [#15982] | +| [@Bahex] | fix(std/log): Don't assume env variables are set | [#15980] | +| [@hustcer] | Update Nu for release and nightly workflow | [#15969] | +| [@cptpiepmatz] | Add `full` feature as an alternative to `--all-features` | [#15971] | +| [@zhiburt] | Fix table --expand case with wrapping of emojie | [#15948] | +| [@echasnovski] | feat(gstat): add `state` entry (like "Clean", "Merge", "Rebase", etc.) | [#15965] | +| [@noahfraiture] | feat: use get request by default, post if payload | [#15862] | +| [@fdncred] | fix `stor` insert/delete collision | [#15838] | +| [@Tyarel8] | feat(ansi): use `_` in short name and rst -> reset | [#15907] | +| [@Tyarel8] | feat(format number): add `--no-prefix` flag | [#15960] | +| [@ayax79] | Allow `polars schema --datatype-list` to be used without pipeline input | [#15964] | +| [@ayax79] | Make polars last consistent with polars first | [#15963] | +| [@ayax79] | Add groupby support for `polars last` | [#15953] | +| [@fdncred] | add `like`, `not-like` to `help operators` | [#15959] | +| [@132ikl] | Promote clip from `std-rfc` to `std` | [#15877] | +| [@ysthakur] | Don't make unquoted file/dir paths absolute | [#15878] | +| [@JoaquinTrinanes] | cli: Use latest specified flag value when repeated | [#15919] | +| [@marienz] | Better error on spawn failure caused by null bytes | [#15911] | +| [@WindSoilder] | Try to make hide-env respects overlays | [#15904] | +| [@zhiburt] | nu-table: (table -e) Reuse NuRecordsValue::width in some cases | [#15902] | +| [@zhiburt] | nu-table: Remove safety-net width check | [#15901] | +| [@app/dependabot] | build(deps): bump which from 7.0.0 to 7.0.3 | [#15937] | +| [@app/dependabot] | build(deps): bump titlecase from 3.5.0 to 3.6.0 | [#15936] | +| [@app/dependabot] | build(deps): bump ansi-str from 0.8.0 to 0.9.0 | [#15935] | +| [@liquid-dragons] | Fix docs typo referring to non-existent `Value::CustomValue` | [#15954] | +| [@liquid-dragons] | Improve precision in parsing of filesize values | [#15950] | +| [@fdncred] | bump to dev version 0.105.2 | [#15952] | +| [@hustcer] | Use NUSHELL_PAT for winget publish | [#15934] | +| [@hustcer] | Try to fix winget publish error | [#15933] | +| [@cptpiepmatz] | Revert "update nushell to use coreutils v0.1.0 crates (#15896)" | [#15932] | + +[@132ikl]: https://github.com/132ikl +[@Axlefublr]: https://github.com/Axlefublr +[@Bahex]: https://github.com/Bahex +[@JoaquinTrinanes]: https://github.com/JoaquinTrinanes +[@JohnSwiftC]: https://github.com/JohnSwiftC +[@Klapptnot]: https://github.com/Klapptnot +[@Mrfiregem]: https://github.com/Mrfiregem +[@Tyarel8]: https://github.com/Tyarel8 +[@WindSoilder]: https://github.com/WindSoilder +[@adithyaov]: https://github.com/adithyaov +[@app/dependabot]: https://github.com/app/dependabot +[@ayax79]: https://github.com/ayax79 +[@blindFS]: https://github.com/blindFS +[@cptpiepmatz]: https://github.com/cptpiepmatz +[@dead10ck]: https://github.com/dead10ck +[@dilr]: https://github.com/dilr +[@echasnovski]: https://github.com/echasnovski +[@fdncred]: https://github.com/fdncred +[@hustcer]: https://github.com/hustcer +[@jasha-hrp]: https://github.com/jasha-hrp +[@kumarUjjawal]: https://github.com/kumarUjjawal +[@liquid-dragons]: https://github.com/liquid-dragons +[@marienz]: https://github.com/marienz +[@mgrachev]: https://github.com/mgrachev +[@musicinmybrain]: https://github.com/musicinmybrain +[@new-years-eve]: https://github.com/new-years-eve +[@noahfraiture]: https://github.com/noahfraiture +[@ryanxcharles]: https://github.com/ryanxcharles +[@sgvictorino]: https://github.com/sgvictorino +[@sholderbach]: https://github.com/sholderbach +[@weirdan]: https://github.com/weirdan +[@x8x]: https://github.com/x8x +[@xentec]: https://github.com/xentec +[@yertto]: https://github.com/yertto +[@ysthakur]: https://github.com/ysthakur +[@zhiburt]: https://github.com/zhiburt +[#15682]: https://github.com/nushell/nushell/pull/15682 +[#15780]: https://github.com/nushell/nushell/pull/15780 +[#15838]: https://github.com/nushell/nushell/pull/15838 +[#15850]: https://github.com/nushell/nushell/pull/15850 +[#15862]: https://github.com/nushell/nushell/pull/15862 +[#15877]: https://github.com/nushell/nushell/pull/15877 +[#15878]: https://github.com/nushell/nushell/pull/15878 +[#15892]: https://github.com/nushell/nushell/pull/15892 +[#15897]: https://github.com/nushell/nushell/pull/15897 +[#15900]: https://github.com/nushell/nushell/pull/15900 +[#15901]: https://github.com/nushell/nushell/pull/15901 +[#15902]: https://github.com/nushell/nushell/pull/15902 +[#15904]: https://github.com/nushell/nushell/pull/15904 +[#15907]: https://github.com/nushell/nushell/pull/15907 +[#15911]: https://github.com/nushell/nushell/pull/15911 +[#15919]: https://github.com/nushell/nushell/pull/15919 +[#15932]: https://github.com/nushell/nushell/pull/15932 +[#15933]: https://github.com/nushell/nushell/pull/15933 +[#15934]: https://github.com/nushell/nushell/pull/15934 +[#15935]: https://github.com/nushell/nushell/pull/15935 +[#15936]: https://github.com/nushell/nushell/pull/15936 +[#15937]: https://github.com/nushell/nushell/pull/15937 +[#15948]: https://github.com/nushell/nushell/pull/15948 +[#15950]: https://github.com/nushell/nushell/pull/15950 +[#15952]: https://github.com/nushell/nushell/pull/15952 +[#15953]: https://github.com/nushell/nushell/pull/15953 +[#15954]: https://github.com/nushell/nushell/pull/15954 +[#15955]: https://github.com/nushell/nushell/pull/15955 +[#15959]: https://github.com/nushell/nushell/pull/15959 +[#15960]: https://github.com/nushell/nushell/pull/15960 +[#15961]: https://github.com/nushell/nushell/pull/15961 +[#15962]: https://github.com/nushell/nushell/pull/15962 +[#15963]: https://github.com/nushell/nushell/pull/15963 +[#15964]: https://github.com/nushell/nushell/pull/15964 +[#15965]: https://github.com/nushell/nushell/pull/15965 +[#15969]: https://github.com/nushell/nushell/pull/15969 +[#15971]: https://github.com/nushell/nushell/pull/15971 +[#15972]: https://github.com/nushell/nushell/pull/15972 +[#15979]: https://github.com/nushell/nushell/pull/15979 +[#15980]: https://github.com/nushell/nushell/pull/15980 +[#15981]: https://github.com/nushell/nushell/pull/15981 +[#15982]: https://github.com/nushell/nushell/pull/15982 +[#15984]: https://github.com/nushell/nushell/pull/15984 +[#15985]: https://github.com/nushell/nushell/pull/15985 +[#15988]: https://github.com/nushell/nushell/pull/15988 +[#15989]: https://github.com/nushell/nushell/pull/15989 +[#15995]: https://github.com/nushell/nushell/pull/15995 +[#15996]: https://github.com/nushell/nushell/pull/15996 +[#15998]: https://github.com/nushell/nushell/pull/15998 +[#15999]: https://github.com/nushell/nushell/pull/15999 +[#16000]: https://github.com/nushell/nushell/pull/16000 +[#16001]: https://github.com/nushell/nushell/pull/16001 +[#16003]: https://github.com/nushell/nushell/pull/16003 +[#16004]: https://github.com/nushell/nushell/pull/16004 +[#16006]: https://github.com/nushell/nushell/pull/16006 +[#16007]: https://github.com/nushell/nushell/pull/16007 +[#16008]: https://github.com/nushell/nushell/pull/16008 +[#16012]: https://github.com/nushell/nushell/pull/16012 +[#16013]: https://github.com/nushell/nushell/pull/16013 +[#16014]: https://github.com/nushell/nushell/pull/16014 +[#16015]: https://github.com/nushell/nushell/pull/16015 +[#16016]: https://github.com/nushell/nushell/pull/16016 +[#16018]: https://github.com/nushell/nushell/pull/16018 +[#16019]: https://github.com/nushell/nushell/pull/16019 +[#16020]: https://github.com/nushell/nushell/pull/16020 +[#16021]: https://github.com/nushell/nushell/pull/16021 +[#16026]: https://github.com/nushell/nushell/pull/16026 +[#16028]: https://github.com/nushell/nushell/pull/16028 +[#16031]: https://github.com/nushell/nushell/pull/16031 +[#16032]: https://github.com/nushell/nushell/pull/16032 +[#16033]: https://github.com/nushell/nushell/pull/16033 +[#16044]: https://github.com/nushell/nushell/pull/16044 +[#16045]: https://github.com/nushell/nushell/pull/16045 +[#16049]: https://github.com/nushell/nushell/pull/16049 +[#16051]: https://github.com/nushell/nushell/pull/16051 +[#16052]: https://github.com/nushell/nushell/pull/16052 +[#16053]: https://github.com/nushell/nushell/pull/16053 +[#16054]: https://github.com/nushell/nushell/pull/16054 +[#16063]: https://github.com/nushell/nushell/pull/16063 +[#16077]: https://github.com/nushell/nushell/pull/16077 +[#16086]: https://github.com/nushell/nushell/pull/16086 +[#16087]: https://github.com/nushell/nushell/pull/16087 +[#16088]: https://github.com/nushell/nushell/pull/16088 +[#16089]: https://github.com/nushell/nushell/pull/16089 +[#16093]: https://github.com/nushell/nushell/pull/16093 +[#16094]: https://github.com/nushell/nushell/pull/16094 +[#16095]: https://github.com/nushell/nushell/pull/16095 +[#16096]: https://github.com/nushell/nushell/pull/16096 +[#16099]: https://github.com/nushell/nushell/pull/16099 +[#16103]: https://github.com/nushell/nushell/pull/16103 +[#16107]: https://github.com/nushell/nushell/pull/16107 +[#16112]: https://github.com/nushell/nushell/pull/16112 +[#16113]: https://github.com/nushell/nushell/pull/16113 +[#16119]: https://github.com/nushell/nushell/pull/16119 +[#16121]: https://github.com/nushell/nushell/pull/16121 +[#16122]: https://github.com/nushell/nushell/pull/16122 +[#16128]: https://github.com/nushell/nushell/pull/16128 +[#16132]: https://github.com/nushell/nushell/pull/16132 +[#16133]: https://github.com/nushell/nushell/pull/16133 +[#16134]: https://github.com/nushell/nushell/pull/16134 +[#16136]: https://github.com/nushell/nushell/pull/16136 +[#16146]: https://github.com/nushell/nushell/pull/16146 +[#16147]: https://github.com/nushell/nushell/pull/16147 +[#16151]: https://github.com/nushell/nushell/pull/16151 +[#16152]: https://github.com/nushell/nushell/pull/16152 +[#16153]: https://github.com/nushell/nushell/pull/16153 +[#16154]: https://github.com/nushell/nushell/pull/16154 +[#16155]: https://github.com/nushell/nushell/pull/16155 +[#16156]: https://github.com/nushell/nushell/pull/16156 +[#16157]: https://github.com/nushell/nushell/pull/16157 +[#16160]: https://github.com/nushell/nushell/pull/16160 +[#16161]: https://github.com/nushell/nushell/pull/16161 +[#16165]: https://github.com/nushell/nushell/pull/16165 +[#16166]: https://github.com/nushell/nushell/pull/16166 +[#16171]: https://github.com/nushell/nushell/pull/16171 +[#16173]: https://github.com/nushell/nushell/pull/16173 +[#16176]: https://github.com/nushell/nushell/pull/16176 +[#16180]: https://github.com/nushell/nushell/pull/16180 +[#16183]: https://github.com/nushell/nushell/pull/16183 +[#16184]: https://github.com/nushell/nushell/pull/16184 +[#16188]: https://github.com/nushell/nushell/pull/16188 +[#16190]: https://github.com/nushell/nushell/pull/16190 +[#16192]: https://github.com/nushell/nushell/pull/16192 +[#16194]: https://github.com/nushell/nushell/pull/16194 +[#16195]: https://github.com/nushell/nushell/pull/16195 +[#16204]: https://github.com/nushell/nushell/pull/16204 +[#16206]: https://github.com/nushell/nushell/pull/16206 +[#16219]: https://github.com/nushell/nushell/pull/16219 +[#16220]: https://github.com/nushell/nushell/pull/16220 +[#16221]: https://github.com/nushell/nushell/pull/16221 +[Error without an error code]: https://github.com/user-attachments/assets/1b21fee0-36e9-47a5-be05-07b923704430 +[Error with a nu parser error code]: https://github.com/user-attachments/assets/c06aebc3-650d-49ad-84a7-53e05a4a96ad