diff --git a/.vuepress/config.js b/.vuepress/config.js index 994162498b5..6b228a8dae5 100755 --- a/.vuepress/config.js +++ b/.vuepress/config.js @@ -90,7 +90,16 @@ export default defineUserConfig({ }, }, head: [ - ["link", { rel: "preload", href: "/fonts/FiraCode-Regular.woff2", as: "font", type: "font/woff2", crossorigin: "anonymous" }], + [ + 'link', + { + rel: 'preload', + href: '/fonts/FiraCode-Regular.woff2', + as: 'font', + type: 'font/woff2', + crossorigin: 'anonymous', + }, + ], ['meta', { name: 'theme-color', content: '#3eaf7c' }], ['meta', { name: 'apple-mobile-web-app-capable', content: 'yes' }], [ @@ -199,6 +208,7 @@ export default defineUserConfig({ onedarkpro: 'one-dark-pro', // pre-load one-dark-pro for ansi code blocks }, lineNumbers: 10, + collapsedLines: false, transformers: [ // use one-dark-pro theme for ansi code blocks { diff --git a/blog/2025-09-02-nushell_0_107_0.md b/blog/2025-09-02-nushell_0_107_0.md new file mode 100644 index 00000000000..dcc7d5534f8 --- /dev/null +++ b/blog/2025-09-02-nushell_0_107_0.md @@ -0,0 +1,1098 @@ +--- +title: Nushell 0.107.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.107.0 of Nu. This release has a pretty big variety of improvements to various parts of Nushell. There are some new features for `watch`, `find`, and `query xml`, and changes to over 50 commands! +--- + +# Nushell 0.107.0 + +Today, we're releasing version 0.107.0 of Nu. This release has a pretty big variety of improvements to various parts of Nushell. There are some new features for `watch`, `find`, and `query xml`, and changes to over 50 commands! + +# Where to get it + +Nu 0.107.0 is available as [pre-built binaries](https://github.com/nushell/nushell/releases/tag/0.107.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) + - [_Watch out for new `watch` features!_](#watch-out-for-new-watch-features-toc) + - [_Making `find` more cohesive_](#making-find-more-cohesive-toc) + - [_`query xml` improvements_](#query-xml-improvements-toc) +- [_Changes_](#changes-toc) + - [_Breaking changes_](#breaking-changes-toc) + - [_`find` is now case-sensitive by default_](#find-is-now-case-sensitive-by-default-16323-toc) + - [_New behavior for `find --multiline`_](#new-behavior-for-find-multiline-16323-toc) + - [_`each` now passes through `null` input_](#each-now-passes-through-null-input-16396-toc) + - [_Change the output of `format bits` to big endian instead of native endian_](#change-the-output-of-format-bits-to-big-endian-instead-of-native-endian-16435-toc) + - [_Execution Order of Hooks Changed: `env_change` _before_ `pre_prompt`_](#execution-order-of-hooks-changed-env-change-before-pre-prompt-16356-toc) + - [_`query xml` returns scalar results when possible_](#query-xml-returns-scalar-results-when-possible-16459-toc) + - [_Use fixed column name for `query xml` output_](#use-fixed-column-name-for-query-xml-output-16461-toc) + - [_Add active column to `overlay list`_](#add-active-column-to-overlay-list-16125-toc) + - [_Additions_](#additions-toc) + - [_`watch` streams events_](#watch-streams-events-16428-toc) + - [_New `watch --debounce` option_](#new-watch-debounce-option-16187-toc) + - [_`get`, `select`, `reject` can `--ignore-case` of cell-path_](#get-select-reject-can-ignore-case-of-cell-path-16401-toc) + - [_`--endian` flag for `into binary`_](#endian-flag-for-into-binary-16466-toc) + - [_Spread `null` into collections or arguments_](#spread-null-into-collections-or-arguments-16399-toc) + - [_`http` subcommands now keep track of redirects_](#http-subcommands-now-keep-track-of-redirects-16078-toc) + - [_New `random choice` command in `std-rfc`_](#new-random-choice-command-in-std-rfc-16270-toc) + - [_Add `str align` to `std-rfc/str`_](#add-str-align-to-std-rfc-str-16062-toc) + - [_JSON column support for `stor` and `query db`_](#json-column-support-for-stor-and-query-db-16258-toc) + - [_Extend nodeset output formats for `query xml`_](#extend-nodeset-output-formats-for-query-xml-16465-toc) + - [_New keybinding: `vichangemode`_](#new-keybinding-vichangemode-16327-toc) + - [_Add `-h/--help` flag to testbin_](#add-h-help-flag-to-testbin-16196-toc) + - [_Other additions_](#other-additions-toc) + - [_Deprecations_](#deprecations-toc) + - [_Built-in `random dice` deprecated_](#built-in-random-dice-deprecated-toc) + - [_Deprecate `watch --debounce-ms`_](#deprecate-watch-debounce-ms-16187-toc) + - [_Other changes_](#other-changes-toc) + - [_`random dice` moved to `std`_](#random-dice-moved-to-std-16420-toc) + - [_`http` commands will now fail on invalid headers_](#http-commands-will-now-fail-on-invalid-headers-16078-toc) + - [_`http post` now sends body serialized as pretty json_](#http-post-now-sends-body-serialized-as-pretty-json-16078-toc) + - [_Improved error messages for misspelled flags_](#improved-error-messages-for-misspelled-flags-16427-toc) + - [_Improved default color theme_](#improved-default-color-theme-16509-toc) + - [_Reset content type for commands returning partial input_](#reset-content-type-for-commands-returning-partial-input-16500-toc) + - [_Additional changes_](#additional-changes-toc) + - [_Bug fixes_](#bug-fixes-toc) + - [_Fix highlighting of aliases to external commands_](#fix-highlighting-of-aliases-to-external-commands-15408-toc) + - [_`input list` Plays Nicely With Styled Input_](#input-list-plays-nicely-with-styled-input-16276-toc) + - [_Fixed spacing of `help` examples_](#fixed-spacing-of-help-examples-16353-toc) + - [_Prevent `detect columns` from creating invalid records with duplicate keys_](#prevent-detect-columns-from-creating-invalid-records-with-duplicate-keys-16527-toc) + - [_Improvements to errors_](#improvements-to-errors-toc) + - [_Other fixes_](#other-fixes-toc) +- [_Hall of fame_](#hall-of-fame-toc) +- [_Full changelog_](#full-changelog-toc) + +# Highlights and themes of this release [[toc](#table-of-contents)] + +## Watch out for new `watch` features! [[toc](#table-of-contents)] + +This release features a couple additions to the `watch` command. The `watch` command can now *stream* events as a table output, which unlocks all new sorts of possibilities for how you can use it. Thank you to [@Bahex] for this amazing feature! + +The `watch` command also has a "new" flag: `--debounce`. Fans of the `watch` command might be scratching their heads, since a very similar option already exists: `--debounce-ms`. This flag prevents events in rapid succession from being detected. The `--debounce` (no `-ms`) flag does the same thing, but with a proper duration value rather than an integer. Thanks to [@lucascherzer] for this addition! + +Read [**more about `watch` event streaming**](#watch-streams-events-16428-toc), or read [**more about the `--debounce` flag**](#new-watch-debounce-option-16187-toc) and the [**corresponding deprecation of `--debounce-ms`**](#deprecate-watch-debounce-ms-16187-toc). + +## Making `find` more cohesive [[toc](#table-of-contents)] + +Following [last release's improvements to the `find` command](/blog/2025-07-23-nushell_0_106_0.html#commands-toc), this release has some more changes aimed at making `find` more cohesive. These include `find` being case-sensitive by default, and a more useful behavior for the `--multiline` flag. Thank you to [@new-years-eve] for your work both this release and last release in making `find` more useful! + +Read [**more about `find` being case-sensitive**](#find-is-now-case-sensitive-by-default-16323-toc), and [**more about the new --multiline behavior**](#new-behavior-for-find-multiline-16323-toc). + +## `query xml` improvements [[toc](#table-of-contents)] + +The `nu_plugin_query` plugin ships with Nushell, and has a number of different commands that can help manipulate data formats that might otherwise be unwieldy. Thank you to [@weirdan] for spending some time to polish the `query xml` command. These changes should make it much nicer to use! + +**Read more about these improvements**: + +* [Returning scalar results, rather than putting all output into tables](#query-xml-returns-scalar-results-when-possible-16459-toc) +* [Using a fixed column name, instead of a name based on the input expression](#use-fixed-column-name-for-query-xml-output-16461-toc) +* [Additional information with nodeset outputs](#extend-nodeset-output-formats-for-query-xml-16465-toc) + +::: warning +These improvements also mean a number of a breaking changes, so if you use `query xml` make sure to take a look at the breaking changes! +::: + +# Changes [[toc](#table-of-contents)] + +## Breaking changes [[toc](#table-of-contents)] + +### `find` is now case-sensitive by default ([#16323]) [[toc](#table-of-contents)] + +The `find` command is now case-sensitive by default in all modes. Previously, you could use the `--ignore-case` flag to make `find` case-insensitive in the `--regex` mode, but the default "search term mode" would always be case-insensitive. Now, both modes are case-sensitive by default, and you can use the `--ignore-case` flag to make them case-insensitive. + +This change makes the different modes of `find` more consistent. It also makes `find` more consistent with other parts of Nushell, such as `where`'s `=~` operator and the recent [case-sensitive cell-paths change](https://www.nushell.sh/blog/2025-06-10-nushell_0_105_0.html#case-sensitive-cell-paths-or-not-toc). + +::: tip +If you want `find` to still be case-insensitive after this release, which might be desirable for interactive usage, you can add an alias to your config: + +```nu +alias find = find -i +``` + +::: + +### New behavior for `find --multiline` ([#16323]) [[toc](#table-of-contents)] + +Previously, `find` would always split multi-line input strings, making it impossible to perform proper multi-line regex matches unless a string was within list, table, or record. Now, the `--multiline` flag can be used to prevent this splitting, replacing its previous behavior of prepending `(?m)` to the regex. + +```ansi:title="Before" +> "hello\nworld" | find -mr 'lo\swo' +╭────────────╮ +│ empty list │ +╰────────────╯ +``` + +```ansi:title="After" +> "hello\nworld" | find -mr 'lo\swo' +hello +worl +``` + +### `each` now passes through `null` input ([#16396]) [[toc](#table-of-contents)] + +When `null` is passed to the `each` command, it now returns `null` instead of passing `null` to the closure. +For example, before this change: + +```ansi +> null | each { "something" } | describe +string +> null | each { "something" } +something +> +``` + +But after this change: + +```ansi +> null | each { "something" } | describe +nothing +> null | each { "something" } +> +``` + +### Change the output of `format bits` to big endian instead of native endian ([#16435]) [[toc](#table-of-contents)] + +While the most popular architectures use little endian, many people are used to reading binary numbers as big endian. However, until now, if you were in a little endian system, you would get: + +```ansi +> 258 | format bits +00000010 00000001 +``` + +If you copied and pasted that as a number, you would get a surprising result: + +```ansi +> 0b00000010_00000001 +513 +``` + +Now, `format bits` always formats in big endian: + +```ansi +> 258 | format bits +00000001 00000010 +``` + +### Execution Order of Hooks Changed: `env_change` _before_ `pre_prompt` ([#16356]) [[toc](#table-of-contents)] + +Before this release `env_change` hooks would execute _after_ `pre_prompt` hooks, and the prompt would be rendered after `env_change` hooks. + +This meant `env_change` hooks got _in between_ `pre_prompt` hooks and `PROMPT_COMMAND`. + +Now, order of execution is as follows: + +- `env_change` hooks +- `pre_prompt` hooks +- Rendering the prompt with `PROMPT_COMMAND` + +### `query xml` returns scalar results when possible ([#16459]) [[toc](#table-of-contents)] + +Previously, `query xml` always returned a table, even for scalar results. Now scalar results will be returned as scalars. + +Here's an example of where this would apply: + +```nushell +open -r tests/fixtures/formats/jt.xml +| query xml 'false()' +``` + +Before this change, this would return: + +```ansi +╭───┬─────────╮ +│ # │ false() │ +├───┼─────────┤ +│ 0 │ false │ +╰───┴─────────╯ +``` + +Now, this will just return `false`. + +### Use fixed column name for `query xml` output ([#16461]) [[toc](#table-of-contents)] + +Previously, the `query xml` command outputs nodeset results in a table with a column name corresponding to the input expression. Now, the column name is fixed. This should make it easier to extract values from the output of `query xml`. + +Before: + +```nushell +open -r tests/fixtures/formats/jt.xml +| query xml '//channel/title|//item/title' +# => ╭───┬───────────────────────────────────────────╮ +# => │ # │ //channel/title|/... │ +# => ├───┼───────────────────────────────────────────┤ +# => │ 0 │ JT │ +# => │ 1 │ Creating crossplatform Rust terminal apps │ +# => ╰───┴───────────────────────────────────────────╯ +``` + +Now: + +```nushell +open -r tests/fixtures/formats/jt.xml +| query xml '//channel/title|//item/title' +# => ╭───┬───────────────────────────────────────────╮ +# => │ # │ string_value │ +# => ├───┼───────────────────────────────────────────┤ +# => │ 0 │ JT │ +# => │ 1 │ Creating crossplatform Rust terminal apps │ +# => ╰───┴───────────────────────────────────────────╯ +``` + +### Add active column to `overlay list` ([#16125]) [[toc](#table-of-contents)] + +`overlay list` now returns table instead of list of overlays. Before, only active overlays were included in `overlay list`. Now, hidden overlays will be included as well, and there is a column indicating whether a given overlay is hidden or not. + +::: tip +The ordering of `overlay list` is still preserved. If you run `overlay list | last`, you will still get the most recently activated overlay. +For migrating to the new behavior, you can update any usages of `overlay list | last` to `overlay list | last | get name`. +::: + +## Additions [[toc](#table-of-contents)] + +### `watch` streams events ([#16428]) [[toc](#table-of-contents)] + +`watch` command can now be used to _return a stream_ of detected events instead of calling a closure with it's information, though using a closure is still possible and existing uses won't break. + +In addition to this: + +```nushell +watch . {|operation, path, new_path| + if $operation == "Write" and $path like "*.md" { + md-lint $path + } +} +``` + +Now this is also possible: + +```nushell +watch . +| where operation == Write and path like "*.md" +| each { md-lint $in.path } +``` + +### New `watch --debounce` option ([#16187]) [[toc](#table-of-contents)] + +The `watch` command now has `--debounce` flag, which takes a duration value. This will replace the `--debounce-ms` flag which takes an int rather than a duration, and will eventually take over its `-d` short flag. + + +### `get`, `select`, `reject` can `--ignore-case` of cell-path ([#16401]) [[toc](#table-of-contents)] + +`get`, `select`, `reject` commands now have a `--ignore-case` flag, which makes the commands interpret all cell-path arguments as completely case insensitive. + +### `--endian` flag for `into binary` ([#16466]) [[toc](#table-of-contents)] + +Previously, converting values to `binary` with `into binary` could only do so in the native endianness of your platform. Using native endianness is still the default, but with the `--endian` flag, you get to choose: + +```ansi +> 258 | into binary --endian little +Length: 8 (0x8) bytes | printable whitespace ascii_other non_ascii +00000000: 02 01 00 00 00 00 00 00 ••000000 +> 258 | into binary --endian big +Length: 8 (0x8) bytes | printable whitespace ascii_other non_ascii +00000000: 00 00 00 00 00 00 01 02 000000•• +``` + +Note that this only affects `int`, `float`, `filesize`, `bool` and `duration` (i.e. it does not affect `string`s, `date`s and `binary`). Likewise, only the individual elements in `table`s and `record`s are affected (not the `table` or `record` itself) + +### Spread `null` into collections or arguments ([#16399]) [[toc](#table-of-contents)] + +`null` values can be used with the spread operator (`...`), behaving as if they were empty lists or records (whichever is appropriate for its place) + +```ansi +> [ 1 2 ...(null) ] == [ 1 2 ] +true +> { a:1 b:2 ...(null) } == { a:1 b:2 } +true +``` + +### `http` subcommands now keep track of redirects ([#16078]) [[toc](#table-of-contents)] + +The `http` subcommands can now maintain a list of redirects when using the `--full` flag. This will be stored in a new `urls` column: + +```ansi +> http get --full http://nushell.sh | get urls +╭───┬────────────────────────╮ +│ 0 │ http://nushell.sh/ │ +│ 1 │ http://www.nushell.sh/ │ +╰───┴────────────────────────╯ +``` + +::: note +This may break edge cases which relied on a lack of a `urls` column, for example: + +```nushell +{urls: important} | merge (http get --full <...>) +``` + +::: + +### New `random choice` command in `std-rfc` ([#16270]) [[toc](#table-of-contents)] + +The `random choice` command has been added as a new candidate for our standard library. This command can randomly sample a number of elements from a list: + +```ansi +> use std-rfc/random +> [1 2 3 4 5] | random choice 2 +╭───┬───╮ +│ 0 │ 1 │ +│ 1 │ 3 │ +╰───┴───╯ +``` + +### Add `str align` to `std-rfc/str` ([#16062]) [[toc](#table-of-contents)] + +The `std-rfc/str` module has new command in this release, `str align`. This command will look for a substring (such as a delimiter), and add padding so that it is in the same column in all lines. It can also take a range to only align any number of lines. + +```ansi +> use std-rfc/str +> [ "one = 1", "two = 2", "three = 3", "four = 4", "five = 5" ] | str align '=' +one = 1 +two = 2 +three = 3 +four = 4 +five = 5 +``` + +### JSON column support for `stor` and `query db` ([#16258]) [[toc](#table-of-contents)] + +The `stor create/insert/open` and `query db` commands now support JSON and JSONB columns. This lets you store more kinds of structured data directly inside of an SQLite database without an explicit `to`/`from` step. + +Here's an example of storing a simple table inside a `stor` database, and retrieving it as structured data with `query db`: + +```ansi:no-line-numbers +# create a table named my_table with a JSON column named data +> stor create -t my_table -c {data: json} +╭──────────┬────────────────╮ +│ my_table │ [list 0 items] │ +╰──────────┴────────────────╯ + +# inset a row into the data column containing a table +> {data: [1 2 3]} | stor insert -t my_table +╭──────────┬───────────────────╮ +│ │ ╭───┬───────────╮ │ +│ my_table │ │ # │ data │ │ +│ │ ├───┼───────────┤ │ +│ │ │ 0 │ ╭───┬───╮ │ │ +│ │ │ │ │ 0 │ 1 │ │ │ +│ │ │ │ │ 1 │ 2 │ │ │ +│ │ │ │ │ 2 │ 3 │ │ │ +│ │ │ │ ╰───┴───╯ │ │ +│ │ ╰───┴───────────╯ │ +╰──────────┴───────────────────╯ + +# retrieve the data column from the table as structured data +> stor open | query db "select data from my_table" +╭───┬───────────╮ +│ # │ data │ +├───┼───────────┤ +│ 0 │ ╭───┬───╮ │ +│ │ │ 0 │ 1 │ │ +│ │ │ 1 │ 2 │ │ +│ │ │ 2 │ 3 │ │ +│ │ ╰───┴───╯ │ +╰───┴───────────╯ +``` + +### Extend nodeset output formats for `query xml` ([#16465]) [[toc](#table-of-contents)] + +`query xml` now can output additional information when it returns Nodesets: + +- `--output-type` enables `type` column. It includes the node type found, e.g. `element` or `comment` +- `--output-names` adds `local_name`, `prefixed_name` and `namespace` columns +- `--output-string-value` (re)adds `string_value` column + +If you're using any of the `--output-*` switches, and want `string_value` column to show up, pass `--output-string-value` explicitly. In the absence of any `--output-*` attributes, `--output-string-value` is assumed to be on. + +### New keybinding: `vichangemode` ([#16327]) [[toc](#table-of-contents)] + +You can now set bindings which change the Vi mode. +To do so send a `vichangemode` event with the `mode` field to set `normal`, `insert`, or `visual` + +```nushell +$env.config.keybindings ++= + [{ + name: modechangetest + modifier: control + keycode: "char_[" + mode: [vi_normal, vi_insert] + event: {send: vichangemode, mode: normal} + }] +``` + +The available modifiers and keycodes, remain limited to single character bindings with modifiers. We don't yet provide access to the key-chord parsing of the vi mode. + +### Add `-h/--help` flag to testbin ([#16196]) [[toc](#table-of-contents)] + +`nu --testbin` has a new flag `-h` to show available \ + +```ansi:collapsed-lines=4 +> nu --testbin -h +Usage: nu --testbin +: +chop -> With no parameters, will chop a character off the end of each line +cococo -> Cross platform echo using println!()(e.g: nu --testbin cococo a b c) +echo_env -> Echo's value of env keys from args(e.g: nu --testbin echo_env FOO BAR) +echo_env_mixed -> Mix echo of env keys from input(e.g: nu --testbin echo_env_mixed out-err FOO BAR; nu --testbin echo_env_mixed err-out FOO BAR) +echo_env_stderr -> Echo's value of env keys from args to stderr(e.g: nu --testbin echo_env_stderr FOO BAR) +echo_env_stderr_fail -> Echo's value of env keys from args to stderr, and exit with failure(e.g: nu --testbin echo_env_stderr_fail FOO BAR) +fail -> Exits with failure code 1(e.g: nu --testbin fail) +iecho -> Another type of echo that outputs a parameter per line, looping infinitely(e.g: nu --testbin iecho 3) +input_bytes_length -> Prints the number of bytes received on stdin(e.g: 0x[deadbeef] | nu --testbin input_bytes_length) +meow -> Cross platform cat (open a file, print the contents) using read_to_string and println!()(e.g: nu --testbin meow file.txt) +meowb -> Cross platform cat (open a file, print the contents) using read() and write_all() / binary(e.g: nu --testbin meowb sample.db) +nonu -> Cross platform echo but concats arguments without space and NO newline(e.g: nu --testbin nonu a b c) +nu_repl -> Run a REPL with the given source lines, it must be called with `--testbin=nu_repl`, `--testbin nu_repl` will not work due to argument count logic +relay -> Relays anything received on stdin to stdout(e.g: 0x[beef] | nu --testbin relay) +repeat_bytes -> A version of repeater that can output binary data, even null bytes(e.g: nu --testbin repeat_bytes 003d9fbf 10) +repeater -> Repeat a string or char N times(e.g: nu --testbin repeater a 5) +``` + +### Other additions [[toc](#table-of-contents)] + +- The `commandline edit` command has a new flag `--accept` (or `-A`) which immediately executes the resulting commandline. ([#16193]) + +- The `bench` command in the standard library now shows a progress bar (or spinner) on terminals which support `osc 9;4`. ([#16245]) + +- The `to html` command has a new `--raw` flag, which doesn't escape HTML tags in the input. ([#16373]) + +- Added information to the `run-external` and `help` descriptions that indicates these commands or any with the same names are automatically used for running externals and the `--help` flags respectively. ([#16493]) + +- `std-rfc/kv` commands now take an optional `--table (-t)` argument which allows a custom table name to be used. If not specified, the current `std-kv-store` table will be used. ([#16450]) + +## Deprecations [[toc](#table-of-contents)] + +### Built-in `random dice` deprecated [[toc](#table-of-contents)] + +With `random dice` being moved to `std`, the built-in command is no longer necessary. See [`random dice` moved to `std`](#random-dice-moved-to-std-16420-toc) for more information. + +### Deprecate `watch --debounce-ms` ([#16187]) [[toc](#table-of-contents)] + +With the new [watch --debounce option](#new-watch-debounce-option-16187-toc), the `--debounce-ms` option is no longer necessary. Use `watch --debounce` with a duration value instead. + +## Other changes [[toc](#table-of-contents)] + +### `random dice` moved to `std` ([#16420]) [[toc](#table-of-contents)] + +The `random dice` command has been rewritten in Nushell and moved to the standard library. The `random dice` built-in is still available with a deprecation error, but will be removed in 0.108. The new command can be used as follows: + +```ansi +> use std/random +> random dice +╭───┬───╮ +│ 0 │ 6 │ +╰───┴───╯ +``` + +It's behavior, parameters, and defaults are the same. + +### `http` commands will now fail on invalid headers ([#16078]) [[toc](#table-of-contents)] + +Before, non-UTF-8 headers would be silently ignored. Now, these will cause an error. Here's an example which uses two Nushell instances to demonstrate this. + +In one Nushell instance, we create something resembling an HTTP server on port 1234: + +```nu +["HTTP/1.1 200 OK\r\nContent-Length: 0\r\nx-header: " 0x[1F FF AA AA] "\r\n\r\n"] +| each { into binary } +| bytes collect +| ncat -l 1234 +``` + +In another instance, we connect to port 1234. The `x-header` is not valid UTF-8, which now produces an error: + +```ansi +> http get --full --allow-errors http://localhost:1234 +Error: nu::shell::network_failure + + × Network failure + ╭─[entry #1:1:1] + 1 │ http get --full --allow-errors http://localhost:1234 + · ────┬─── + · ╰── protocol: http parse fail: invalid header value + ╰──── +``` + +### `http post` now sends body serialized as pretty json ([#16078]) [[toc](#table-of-contents)] + +Before, `http post` would serialize values as raw JSON. Now, the JSON will be serialized into the pretty format. Note that this increases the body size. + +```http:title="Before" +POST / HTTP/1.1 +Host: localhost:1234 +User-Agent: nushell +Accept: */* +Content-Type: application/json +accept-encoding: gzip +Content-Length: 13 + +{"foo":"bar"} +``` + +```http:title="After" +POST / HTTP/1.1 +accept-encoding: gzip +content-length: 18 +user-agent: nushell +accept: */* +host: localhost:1234 +content-type: application/json; charset=utf-8 + +{ + "foo": "bar" +} +``` + +### Improved error messages for misspelled flags ([#16427]) [[toc](#table-of-contents)] + +Previously, the help text for a missing flag would list all of them, which could get verbose on a single line: + +```ansi +> ls --full-path +Error: nu::parser::unknown_flag + + × The `ls` command doesn't have flag `full-path`. + ╭─[entry #26:1:4] + 1 │ ls --full-path + ·  ─────┬───── + · ╰── unknown flag + ╰──── + help: Available flags: --help(-h), --all(-a), --long(-l), --short-names(-s), --full-paths(-f), --du(-d), + --directory(-D), --mime-type(-m), --threads(-t). Use `--help` for more information. +``` + +The new error message only suggests the closest flag: + +```ansi +> ls --full-path +Error: nu::parser::unknown_flag + + × The `ls` command doesn't have flag `full-path`. + ╭─[entry #45:1:4] + 1 │ ls --full-path + ·  ─────┬───── + · ╰── unknown flag + ╰──── + help: Did you mean: `--full-paths`? +``` + +### Improved default color theme ([#16509]) [[toc](#table-of-contents)] + +We changed the default theme to use the ANSI default color (`39m`) instead of white (`37m`). +This finally makes the default theme usable in the context of light terminal color settings. On dark terminal palettes this change should have no impact. + +Comparison of white vs default color on Solarized Light theme, before and after: + +

+ + +

+ +### Reset content type for commands returning partial input ([#16500]) [[toc](#table-of-contents)] + +The following commands no longer preserve `content_type` element of the input metadata: + +- `bytes at` - bytes 3..5 of an `image/png` stream are not valid `image/png` stream themselves +- `bytes remove` - when you remove some bytes, the content type likely becomes invalid +- `first` - first 5 bytes of an `image/png` stream are not valid `image/png` stream themselves +- `skip` - bytes after 5th of an `image/png` stream are not valid `image/png` stream +- `take` - see `first` +- `str substring` - a random string slice of `application/json` isn't likely to be a valid `application/json` value + +### Additional changes [[toc](#table-of-contents)] + +- Trying to execute a non-existent script file used to return a confusing error pointing to an internal source code path. That error now points to the script file argument in the commandline. ([#16273]) + +- `format date` will respect `$env.LANG` and override it with `$env.LC_ALL`. ([#16369]) + +- Required named parameters will now always appear before regular named parameters/flags in the `help` output. ([#16476]) + +- `query xml` now has `xml:` namespace prefix available by default, without the need to specify it via `--namespaces`. ([#16472]) + +## Bug fixes [[toc](#table-of-contents)] + +### Fix highlighting of aliases to external commands ([#15408]) [[toc](#table-of-contents)] + +Aliases to external commands will now be properly highlighted as external commands. + +```ansi:title="Behavior in 0.106.1" +> $env.config.highlight_resolved_externals = true +> $env.config.color_config = { shape_external: red_bold, shape_external_resolved: yellow_bold, shape_internalcall: blue_bold } +> alias internal-alias = echo +> alias external-alias = coreutils echo +> alias unresolvable-alias = notacommand +> alias bash = notacommand +> "internal-alias; external-alias; unresolvable-alias; bash;" | nu-highlight +internal-alias; external-alias; unresolvable-alias; bash; +``` + +```ansi:title="Behavior in 0.107.0" +> $env.config.highlight_resolved_externals = true +> $env.config.color_config = { shape_external: red_bold, shape_external_resolved: yellow_bold, shape_internalcall: blue_bold } +> alias internal-alias = echo +> alias external-alias = coreutils echo +> alias unresolvable-alias = notacommand +> alias bash = notacommand +> "internal-alias; external-alias; unresolvable-alias; bash;" | nu-highlight +internal-alias; external-alias; unresolvable-alias; bash; +``` + +### `input list` Plays Nicely With Styled Input ([#16276]) [[toc](#table-of-contents)] + +`input list` had some trouble dealing with ANSI styled inputs, such as: + +- not resetting terminal styles after each item, leading to items' styles leaking and affecting how the following items are rendered +- in fuzzy mode, resetting the styles _a little too much_ after emphasizing matching sections + +Here's a before/after comparison: + +| | Select | Fuzzy | +| --- | ---------------- | --------------- | +| ❌ | ![select-before] | ![fuzzy-before] | +| ✅ | ![select-fixed] | ![fuzzy-fixed] | + +[select-before]: https://gist.githubusercontent.com/Bahex/ee2fe5074a9e2368913879159e70998c/raw/8fe913647280191f137023447c84f685e825659e/select-before.svg +[select-fixed]: https://gist.githubusercontent.com/Bahex/ee2fe5074a9e2368913879159e70998c/raw/8fe913647280191f137023447c84f685e825659e/select-after.svg +[fuzzy-before]: https://gist.githubusercontent.com/Bahex/ee2fe5074a9e2368913879159e70998c/raw/8fe913647280191f137023447c84f685e825659e/fuzzy-before.svg +[fuzzy-fixed]: https://gist.githubusercontent.com/Bahex/ee2fe5074a9e2368913879159e70998c/raw/8fe913647280191f137023447c84f685e825659e/fuzzy-after.svg + +### Fixed spacing of `help` examples ([#16353]) [[toc](#table-of-contents)] + +`help` command used to trim the outputs of examples, which could result in inconsistent white space: + +::: info +Following snippets are generated with this config: + +```nu +$env.config.table = {mode: light, padding: {left: 1}, header_on_separator: false} +``` + +::: + +```txt:title="Before" + Find and replace all occurrences of found string in record using regular expression + > { KeyA: abc, KeyB: abc, KeyC: ads } | str replace --all --regex 'b' 'z' KeyA KeyC + KeyA azc + KeyB abc + KeyC ads +``` + +```txt:title="After" + Find and replace all occurrences of found string in record using regular expression + > { KeyA: abc, KeyB: abc, KeyC: ads } | str replace --all --regex 'b' 'z' KeyA KeyC + KeyA azc + KeyB abc + KeyC ads +``` + +### Prevent `detect columns` from creating invalid records with duplicate keys ([#16527]) [[toc](#table-of-contents)] + +Previously `detect columns` created records (rows) with duplicate key names under some circumstances. The resulting table behaved inconsistently with different commands: + +```ansi +> let data = "meooooow cat\nkitty kitty woof" +> $data | detect columns +╭───┬──────────┬───────╮ +│ # │ meooooow │ cat │ +├───┼──────────┼───────┤ +│ 0 │ kitty │ kitty │ +╰───┴──────────┴───────╯ +> $data | detect columns | get 0.cat +woof +``` + +Now, this will result in an error suggesting using `detect columns --guess` or `parse`: + +```ansi +> let data = "meooooow cat\nkitty kitty woof" +> $data | detect columns +Error: nu::shell::failed_to_detect_columns + + × Failed to detect columns + ╭─[entry #48:1:1] + 1 │ $data | detect columns + · ──┬── ───────┬────── + · │ ╰── tried to detect columns here + · ╰── value coming from here + ╰──── +``` + +### Improvements to errors [[toc](#table-of-contents)] + +This release has a number of improvements to errors in specific circumstances: + +- Improve errors for subcommands without a corresponding parent command ([#16529]) + + Added missing parent ('namespace') commands to improve error reporting: + - `attr` + - `detect` + - `error` + - `query` + - `registry` + +- Before, attempting to run an external command when `$env.PATH` was not set could result in a confusing error. This release improves the error. ([#16410]) + +- Errors which reference values originating from command examples in the output of `scope commands` should now be less confusing. ([#16395]) + +- `where` should now error at parse-time on row condition expressions which are not booleans, in addition to at run-time ([#16175]) + +- Type errors involving boolean literals are now more precise. ([#16408]) + +- The error shown when attempting to run a non-const command in a const-eval context is now more precise. ([#16393]) + +### Other fixes [[toc](#table-of-contents)] + +- Short flags which require a value should now properly be tracked by the parser. Previously, something like the `-a` in `table -a` wouldn't be properly highlighted if no value for `-a` was provided. This also means that the `ast` command will now properly account for these flags. ([#16376]) + +- Parse-time pipeline type checking now properly supports commands with multiple pipeline output types for the same pipeline input type. ([#16111]) + +- Previously, a record key `=` would not be quoted in `to nuon`, producing invalid nuon output. It wasn't quoted in other string values either, but it didn't cause problems there. Now any string containing `=` gets quoted. ([#16440]) + +- `path relative-to` works better for case-insensitive filesystems, this works on `Windows` or `macOS`: `"/etc" | path relative-to "/Etc"` ([#16310]) + +- Stepped range literals where `..=` precedes the second value no longer cause a parser panic. e.g: `random int 1..=3..5` ([#16231]) + +- Arguments to external commands with subexpressions like `^/bin/echo ProxyCommand=($'hello')` are now parsed correctly ([#16346]) + +- The index column in a table will get a highlight color if `$env.config.table.header_on_separator = true` ([#16377]) + +- In `explore`, cursor position and search highlighting works better on non-ASCII characters. ([#16325]) + +- The gstat plugin will show correct branch in detached HEAD if commit hash starts with 0 ([#16309]) + +- Interrupting a script with `ctrl-c` now properly kills background jobs on exit. ([#16285]) + +- Argument variables for custom commands no longer leak outside of their scope. ([#16262]) + +- `into sqlite` will respect `$env.PWD` rather than current working directory. ([#16349]) + +- `std help` displays better on binary examples. ([#16354]) + +- Using `polars open --type tsv` will now correctly use tabs as the delimiter. ([#16524]) + +- The `polars fill-null` command previously only allowed dataframes as inputs. Now, `polars fill-null` also accepts expressions as an input type. ([#16444]) + +# 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 | change | link | +| -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | +| [@blindFS] | Refactor(completion, parser): move custom_completion info from Expression to Signature | [#15613] | +| [@ysthakur] | Revert "refactor(completion, parser): move custom_completion info from Expression to Signature" | [#16250] | +| [@ysthakur] | Reapply "refactor(completion, parser): move custom_completion info from Expression to Signature" (#16250) | [#16259] | +| [@sholderbach] | Bump version to 0.106.2 | [#16295] | +| [@sholderbach] | Manual GH workflow for `cargo hack` before release | [#16304] | +| [@sholderbach] | Fixup pre-release checkup workflow | [#16305] | +| [@WindSoilder] | Introduce 2 associated functions to `PipelineData` | [#16233] | +| [@ItsHarper] | `input` command has 1 more example on `--reedline` flag. | [#16329] | +| [@sholderbach] | Forgo full build in the `cargo hack` wf | [#16328] | +| [@Direwolfesp] | Fix typo: `help format filesize` has a wrong example | [#16336] | +| [@sholderbach] | Fix panic in unit parsing with non-UTF8 code | [#16355] | +| [@Tyarel8] | Fix (std/help): fix bug and use `is-not-empty` | [#16394] | +| [@ItsHarper] | Clarify that `input`'s history feature uses reedline | [#16334] | +| [@ItsHarper] | Add examples for sending and receiving data across jobs | [#16372] | +| [@Bahex] | Impl<B> for (From/Into)Value for Cow<'\_, B> where B::Owned: (From/Into)Value | [#16380] | +| [@Bahex] | Implement `FromValue` for `std::time::Duration` and refactor relevant commands to utilize that | [#16414] | +| [@kaathewisegit] | Document undocumented `Signature` methods | [#16417] | +| [@weirdan] | std/random dice ensure `sides` and `dice` are positive | [#16430] | +| [@132ikl] | Rework PR template | [#16412] | +| [@fdncred] | Users can use rust version 1.87.0 to compile nushell now | [#16437] | +| [@cptpiepmatz] | Add well-optimized string types | [#16446] | +| [@WindSoilder] | Fix uninlined_format_args clippy warnings | [#16452] | +| [@132ikl] | Add "Motivation and technical details | [#16458] | +| [@132ikl] | Redirect "Questions" issue option to Discussions | [#16443] | +| [@132ikl] | Tweak PR template | [#16460] | +| [@Jan9103] | Hover on external 0x08 handling | [#16316] | +| [@sholderbach] | Use direct `Value.as_str()` in string commands | [#16468] | +| [@hustcer] | Fix loongarch64 builds for rust 1.87.0 | [#16455] | +| [@sholderbach] | Update PLATFORM_SUPPORT to mention loongarch limitations | [#16470] | +| [@sholderbach] | Clippy and dead code elimination pass | [#16469] | +| [@132ikl] | Mitigate `watch -d` breaking change | [#16473] | +| [@132ikl] | Add assertion that DeprecationEntry flag do not have dashes | [#16475] | +| [@132ikl] | Make `Span` mandatory for some fields in `ShellError` | [#16471] | +| [@blindFS] | Env shorthand false positive | [#16337] | +| [@sholderbach] | Add a benchmark `use`ing the whole `std` | [#16485] | +| [@fdncred] | Update reedline dep to latest commit | [#16487] | +| [@Bahex] | Move `SplitRead` and `MultiLife` into `nu-utils` | [#16482] | +| [@sholderbach] | Update benchmarking README | [#16486] | +| [@cptpiepmatz] | Fix `native-tls` feature | [#16518] | +| [@cptpiepmatz] | Fix some broken doc links | [#16519] | +| [@Bahex] | Refactor `Record` api. Reduce code duplication and make future refactors easier. | [#16490] | +| [@sholderbach] | Add "did my homework" checkboxes to issue template | [#16520] | +| [@fdncred] | Pin polars dependency planus to version 1.1.1 | [#16538] | +| [@sholderbach] | Fix issue form syntax | [#16541] | +| [@ItsHarper] | Fix incorrect documentation of the default behavior of the `bits rol`, `bits ror`, `bits shl`, and `bits shr` commands when the `--number-bytes` flag is not provided | [#16542] | + +# Full changelog [[toc](#table-of-contents)] + +| author | title | link | +| ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | +| [@132ikl] | Fix parse-time pipeline type checking to support multiple output types for same input type | [#16111] | +| [@132ikl] | Check type of row conditions at parse-time | [#16175] | +| [@132ikl] | Rework PR template | [#16412] | +| [@132ikl] | Redirect "Questions" issue option to Discussions | [#16443] | +| [@132ikl] | Add "Motivation and technical details | [#16458] | +| [@132ikl] | Tweak PR template | [#16460] | +| [@132ikl] | Make `Span` mandatory for some fields in `ShellError` | [#16471] | +| [@132ikl] | Mitigate `watch -d` breaking change | [#16473] | +| [@132ikl] | Add assertion that DeprecationEntry flag do not have dashes | [#16475] | +| [@Bahex] | script file not found error should point to commandline, not rust code | [#16273] | +| [@Bahex] | fix(input list): don't leak ansi styling, fuzzy match indicator preserves styles | [#16276] | +| [@Bahex] | refactor: run `env_change` hooks before `pre_prompt` hooks | [#16356] | +| [@Bahex] | feat: impl<B> for (From/Into)Value for Cow<'\_, B> where B::Owned: (From/Into)Value | [#16380] | +| [@Bahex] | feat: `null` values can be spread as if they are empty lists or records. | [#16399] | +| [@Bahex] | feat(get,select,reject): add `--ignore-case` which interprets cell-paths case insensitively, analogous to `--optional` | [#16401] | +| [@Bahex] | implement `FromValue` for `std::time::Duration` and refactor relevant commands to utilize that | [#16414] | +| [@Bahex] | feat: `watch` returns a stream of events as a table when called without a closure | [#16428] | +| [@Bahex] | refactor: move `SplitRead` and `MultiLife` into `nu-utils` | [#16482] | +| [@Bahex] | Refactor `Record` api. Reduce code duplication and make future refactors easier. | [#16490] | +| [@Direwolfesp] | fix typo: `help format filesize` has a wrong example | [#16336] | +| [@Ecorous] | Add `--raw` flag to `to html` | [#16373] | +| [@Ecorous] | Fix missing $env.PATH unhelpful error and breaking CMD builtins | [#16410] | +| [@ItsHarper] | Add multiline example for `input` command | [#16329] | +| [@ItsHarper] | Clarify that `input`'s history feature uses reedline | [#16334] | +| [@ItsHarper] | Add examples for receiving data from a job | [#16372] | +| [@ItsHarper] | Fix error message: custom commands cannot be `const` | [#16393] | +| [@ItsHarper] | Fix documentation of `--number-bytes` flag for several `bits` commands | [#16542] | +| [@Jan9103] | fix(nu-lsp): hover on external 0x08 handling | [#16316] | +| [@NotTheDr01ds] | Ability to specify a table name for kv commands | [#16450] | +| [@Sheape] | Use default color in default theme for light-theme terminals | [#16509] | +| [@Tyarel8] | feat(std-rfc/str): add `str align` | [#16062] | +| [@Tyarel8] | feat(std/bench) add `osc 9;4` progress bar | [#16245] | +| [@Tyarel8] | fix(help): don't trim example result beginning | [#16353] | +| [@Tyarel8] | fix(std/help): trim example results and fix binary examples | [#16354] | +| [@Tyarel8] | fix (std/help): fix bug and use `is-not-empty` | [#16394] | +| [@Tyarel8] | feat(each): noop on single null input, `map-null` equivalent | [#16396] | +| [@Tyarel8] | feat(docs): add to `run-external` and `help` command descriptions | [#16493] | +| [@WindSoilder] | Add `-h/--help` flag to testbin | [#16196] | +| [@WindSoilder] | Refactor: introduce 2 associated functions to `PipelineData` | [#16233] | +| [@WindSoilder] | fix uninlined_format_args clippy warnings | [#16452] | +| [@YPares] | 'stor create/insert/open' & 'query db' now support JSON columns | [#16258] | +| [@andoalon] | Change the output of `format bits` to big endian instead of native endian | [#16435] | +| [@andoalon] | Add `--endian` flag to `into binary` | [#16466] | +| [@app/dependabot] | build(deps): bump oem_cp from 2.0.0 to 2.1.0 | [#16298] | +| [@app/dependabot] | build(deps): bump crate-ci/typos from 1.34.0 to 1.35.1 | [#16360] | +| [@app/dependabot] | build(deps): bump mach2 from 0.4.2 to 0.4.3 | [#16363] | +| [@app/dependabot] | build(deps): bump fancy-regex from 0.14.0 to 0.16.1 | [#16365] | +| [@app/dependabot] | build(deps): bump rayon from 1.10.0 to 1.11.0 | [#16422] | +| [@app/dependabot] | build(deps): bump sysinfo from 0.36.0 to 0.36.1 | [#16423] | +| [@app/dependabot] | build(deps): bump crate-ci/typos from 1.35.1 to 1.35.4 | [#16424] | +| [@app/dependabot] | build(deps): bump actions/checkout from 4 to 5 | [#16426] | +| [@app/dependabot] | build(deps): bump crate-ci/typos from 1.35.4 to 1.35.5 | [#16478] | +| [@app/dependabot] | build(deps): bump tempfile from 3.20.0 to 3.21.0 | [#16480] | +| [@app/dependabot] | build(deps): bump indexmap from 2.10.0 to 2.11.0 | [#16516] | +| [@app/dependabot] | build(deps): bump heapless from 0.8.0 to 0.9.1 | [#16517] | +| [@blindFS] | refactor(completion, parser): move custom_completion info from Expression to Signature | [#15613] | +| [@blindFS] | fix(parser): `export def` exposes arguments to current scope | [#16262] | +| [@blindFS] | fix(parser): env shorthand false positive | [#16337] | +| [@blindFS] | fix(parser): external argument with subexpressions | [#16346] | +| [@blindFS] | fix(parser): missing span of short flag that requires a value | [#16376] | +| [@cptpiepmatz] | Fully qualify the sqlite path for `into sqlite` | [#16349] | +| [@cptpiepmatz] | Add well-optimized string types | [#16446] | +| [@cptpiepmatz] | Fix `native-tls` feature | [#16518] | +| [@cptpiepmatz] | Fix some broken doc links | [#16519] | +| [@cyradotpink] | Fix highlighting of aliases to external commands | [#15408] | +| [@fdncred] | update to rust version 1.87.0 | [#16437] | +| [@fdncred] | update reedline dep to latest commit | [#16487] | +| [@fdncred] | pin polars dependency planus to version 1.1.1 | [#16538] | +| [@hardfau1t] | feat(overlay): add active column to `overlay list` | [#16125] | +| [@hustcer] | Fix commit ID hex formatting in gstat | [#16309] | +| [@hustcer] | Fix path relative-to for case-insensitive filesystems | [#16310] | +| [@hustcer] | Fix loongarch64 builds for rust 1.87.0 | [#16455] | +| [@kaathewisegit] | [nu-std] std-rfc/random: add `random choice` | [#16270] | +| [@kaathewisegit] | [parser] Improve type errors for boolean literals | [#16408] | +| [@kaathewisegit] | docs: document undocumented `Signature` methods | [#16417] | +| [@kaathewisegit] | feat: move random dice to std | [#16420] | +| [@kaathewisegit] | Improve wrong flag help | [#16427] | +| [@lucascherzer] | feat(watch): implement --debounce flag with duration | [#16187] | +| [@new-years-eve] | Change the behavior of `--ignore-case` and `--multiline` options for `find` | [#16323] | +| [@nitsky] | Kill background jobs on interrupt | [#16285] | +| [@pyz4] | fix(polars): fix `polars fill-null` signature to also accept expression as input | [#16444] | +| [@samoylovfp] | Bump ureq, get redirect history. | [#16078] | +| [@sgvictorino] | fix panic when `..=` syntax is used in stepped ranges | [#16231] | +| [@sholderbach] | Bump version to 0.106.2 | [#16295] | +| [@sholderbach] | Manual GH workflow for `cargo hack` before release | [#16304] | +| [@sholderbach] | Fixup pre-release checkup workflow | [#16305] | +| [@sholderbach] | Fix UTF-8 multibyte handling in `explore` inputs | [#16325] | +| [@sholderbach] | Add `send: vichangemode` to reedline config | [#16327] | +| [@sholderbach] | Forgo full build in the `cargo hack` wf | [#16328] | +| [@sholderbach] | Fix panic in unit parsing with non-UTF8 code | [#16355] | +| [@sholderbach] | Use direct `Value.as_str()` in string commands | [#16468] | +| [@sholderbach] | chore: Clippy and dead code elimination pass | [#16469] | +| [@sholderbach] | Update PLATFORM_SUPPORT to mention loongarch limitations | [#16470] | +| [@sholderbach] | Add a benchmark `use`ing the whole `std` | [#16485] | +| [@sholderbach] | Update benchmarking README | [#16486] | +| [@sholderbach] | Add "did my homework" checkboxes to issue template | [#16520] | +| [@sholderbach] | Fix `polars open` to use tab as separator for TSV | [#16524] | +| [@sholderbach] | Fix issue form syntax | [#16541] | +| [@stuartcarnie] | feat: `commandline edit --accept` to instantly execute command | [#16193] | +| [@uraneko] | Sort help message flags by required field | [#16476] | +| [@weirdan] | Respect `$env.LC_ALL` and `$env.LANG` in `format date` | [#16369] | +| [@weirdan] | Fix example result span | [#16395] | +| [@weirdan] | Fix `watch` return type | [#16400] | +| [@weirdan] | Validate `std/random dice` args | [#16430] | +| [@weirdan] | Quote strings containing `=` | [#16440] | +| [@weirdan] | Multiple output types for `query xml` | [#16459] | +| [@weirdan] | Use fixed column name for `query xml` output | [#16461] | +| [@weirdan] | Extend nodeset output formats for `query xml` | [#16465] | +| [@weirdan] | Make `xml:` prefix always available in `query xml` | [#16472] | +| [@weirdan] | Reset content type for commands returning partial input | [#16500] | +| [@weirdan] | Prevent `detect columns` from creating invalid records with duplicate keys | [#16527] | +| [@weirdan] | Dummy 'namespace' commands for multiword orphans | [#16529] | +| [@ysthakur] | Revert "refactor(completion, parser): move custom_completion info from Expression to Signature" | [#16250] | +| [@ysthakur] | Reapply "refactor(completion, parser): move custom_completion info from Expression to Signature" (#16250) | [#16259] | +| [@zhiburt] | nu-table: Fix header on border index coloring | [#16377] | + +[@132ikl]: https://github.com/132ikl +[@Bahex]: https://github.com/Bahex +[@Direwolfesp]: https://github.com/Direwolfesp +[@Ecorous]: https://github.com/Ecorous +[@ItsHarper]: https://github.com/ItsHarper +[@Jan9103]: https://github.com/Jan9103 +[@NotTheDr01ds]: https://github.com/NotTheDr01ds +[@Sheape]: https://github.com/Sheape +[@Tyarel8]: https://github.com/Tyarel8 +[@WindSoilder]: https://github.com/WindSoilder +[@YPares]: https://github.com/YPares +[@andoalon]: https://github.com/andoalon +[@app/dependabot]: https://github.com/app/dependabot +[@blindFS]: https://github.com/blindFS +[@cptpiepmatz]: https://github.com/cptpiepmatz +[@cyradotpink]: https://github.com/cyradotpink +[@fdncred]: https://github.com/fdncred +[@hardfau1t]: https://github.com/hardfau1t +[@hustcer]: https://github.com/hustcer +[@kaathewisegit]: https://github.com/kaathewisegit +[@lucascherzer]: https://github.com/lucascherzer +[@new-years-eve]: https://github.com/new-years-eve +[@nitsky]: https://github.com/nitsky +[@pyz4]: https://github.com/pyz4 +[@samoylovfp]: https://github.com/samoylovfp +[@sgvictorino]: https://github.com/sgvictorino +[@sholderbach]: https://github.com/sholderbach +[@stuartcarnie]: https://github.com/stuartcarnie +[@uraneko]: https://github.com/uraneko +[@weirdan]: https://github.com/weirdan +[@ysthakur]: https://github.com/ysthakur +[@zhiburt]: https://github.com/zhiburt +[#15408]: https://github.com/nushell/nushell/pull/15408 +[#15613]: https://github.com/nushell/nushell/pull/15613 +[#16062]: https://github.com/nushell/nushell/pull/16062 +[#16078]: https://github.com/nushell/nushell/pull/16078 +[#16111]: https://github.com/nushell/nushell/pull/16111 +[#16125]: https://github.com/nushell/nushell/pull/16125 +[#16175]: https://github.com/nushell/nushell/pull/16175 +[#16187]: https://github.com/nushell/nushell/pull/16187 +[#16193]: https://github.com/nushell/nushell/pull/16193 +[#16196]: https://github.com/nushell/nushell/pull/16196 +[#16231]: https://github.com/nushell/nushell/pull/16231 +[#16233]: https://github.com/nushell/nushell/pull/16233 +[#16245]: https://github.com/nushell/nushell/pull/16245 +[#16250]: https://github.com/nushell/nushell/pull/16250 +[#16258]: https://github.com/nushell/nushell/pull/16258 +[#16259]: https://github.com/nushell/nushell/pull/16259 +[#16262]: https://github.com/nushell/nushell/pull/16262 +[#16270]: https://github.com/nushell/nushell/pull/16270 +[#16273]: https://github.com/nushell/nushell/pull/16273 +[#16276]: https://github.com/nushell/nushell/pull/16276 +[#16285]: https://github.com/nushell/nushell/pull/16285 +[#16295]: https://github.com/nushell/nushell/pull/16295 +[#16298]: https://github.com/nushell/nushell/pull/16298 +[#16304]: https://github.com/nushell/nushell/pull/16304 +[#16305]: https://github.com/nushell/nushell/pull/16305 +[#16309]: https://github.com/nushell/nushell/pull/16309 +[#16310]: https://github.com/nushell/nushell/pull/16310 +[#16316]: https://github.com/nushell/nushell/pull/16316 +[#16323]: https://github.com/nushell/nushell/pull/16323 +[#16325]: https://github.com/nushell/nushell/pull/16325 +[#16327]: https://github.com/nushell/nushell/pull/16327 +[#16328]: https://github.com/nushell/nushell/pull/16328 +[#16329]: https://github.com/nushell/nushell/pull/16329 +[#16334]: https://github.com/nushell/nushell/pull/16334 +[#16336]: https://github.com/nushell/nushell/pull/16336 +[#16337]: https://github.com/nushell/nushell/pull/16337 +[#16346]: https://github.com/nushell/nushell/pull/16346 +[#16349]: https://github.com/nushell/nushell/pull/16349 +[#16353]: https://github.com/nushell/nushell/pull/16353 +[#16354]: https://github.com/nushell/nushell/pull/16354 +[#16355]: https://github.com/nushell/nushell/pull/16355 +[#16356]: https://github.com/nushell/nushell/pull/16356 +[#16360]: https://github.com/nushell/nushell/pull/16360 +[#16363]: https://github.com/nushell/nushell/pull/16363 +[#16365]: https://github.com/nushell/nushell/pull/16365 +[#16369]: https://github.com/nushell/nushell/pull/16369 +[#16372]: https://github.com/nushell/nushell/pull/16372 +[#16373]: https://github.com/nushell/nushell/pull/16373 +[#16376]: https://github.com/nushell/nushell/pull/16376 +[#16377]: https://github.com/nushell/nushell/pull/16377 +[#16380]: https://github.com/nushell/nushell/pull/16380 +[#16393]: https://github.com/nushell/nushell/pull/16393 +[#16394]: https://github.com/nushell/nushell/pull/16394 +[#16395]: https://github.com/nushell/nushell/pull/16395 +[#16396]: https://github.com/nushell/nushell/pull/16396 +[#16399]: https://github.com/nushell/nushell/pull/16399 +[#16400]: https://github.com/nushell/nushell/pull/16400 +[#16401]: https://github.com/nushell/nushell/pull/16401 +[#16408]: https://github.com/nushell/nushell/pull/16408 +[#16410]: https://github.com/nushell/nushell/pull/16410 +[#16412]: https://github.com/nushell/nushell/pull/16412 +[#16414]: https://github.com/nushell/nushell/pull/16414 +[#16417]: https://github.com/nushell/nushell/pull/16417 +[#16420]: https://github.com/nushell/nushell/pull/16420 +[#16422]: https://github.com/nushell/nushell/pull/16422 +[#16423]: https://github.com/nushell/nushell/pull/16423 +[#16424]: https://github.com/nushell/nushell/pull/16424 +[#16426]: https://github.com/nushell/nushell/pull/16426 +[#16427]: https://github.com/nushell/nushell/pull/16427 +[#16428]: https://github.com/nushell/nushell/pull/16428 +[#16430]: https://github.com/nushell/nushell/pull/16430 +[#16435]: https://github.com/nushell/nushell/pull/16435 +[#16437]: https://github.com/nushell/nushell/pull/16437 +[#16440]: https://github.com/nushell/nushell/pull/16440 +[#16443]: https://github.com/nushell/nushell/pull/16443 +[#16444]: https://github.com/nushell/nushell/pull/16444 +[#16446]: https://github.com/nushell/nushell/pull/16446 +[#16450]: https://github.com/nushell/nushell/pull/16450 +[#16452]: https://github.com/nushell/nushell/pull/16452 +[#16455]: https://github.com/nushell/nushell/pull/16455 +[#16458]: https://github.com/nushell/nushell/pull/16458 +[#16459]: https://github.com/nushell/nushell/pull/16459 +[#16460]: https://github.com/nushell/nushell/pull/16460 +[#16461]: https://github.com/nushell/nushell/pull/16461 +[#16465]: https://github.com/nushell/nushell/pull/16465 +[#16466]: https://github.com/nushell/nushell/pull/16466 +[#16468]: https://github.com/nushell/nushell/pull/16468 +[#16469]: https://github.com/nushell/nushell/pull/16469 +[#16470]: https://github.com/nushell/nushell/pull/16470 +[#16471]: https://github.com/nushell/nushell/pull/16471 +[#16472]: https://github.com/nushell/nushell/pull/16472 +[#16473]: https://github.com/nushell/nushell/pull/16473 +[#16475]: https://github.com/nushell/nushell/pull/16475 +[#16476]: https://github.com/nushell/nushell/pull/16476 +[#16478]: https://github.com/nushell/nushell/pull/16478 +[#16480]: https://github.com/nushell/nushell/pull/16480 +[#16482]: https://github.com/nushell/nushell/pull/16482 +[#16485]: https://github.com/nushell/nushell/pull/16485 +[#16486]: https://github.com/nushell/nushell/pull/16486 +[#16487]: https://github.com/nushell/nushell/pull/16487 +[#16490]: https://github.com/nushell/nushell/pull/16490 +[#16493]: https://github.com/nushell/nushell/pull/16493 +[#16500]: https://github.com/nushell/nushell/pull/16500 +[#16509]: https://github.com/nushell/nushell/pull/16509 +[#16516]: https://github.com/nushell/nushell/pull/16516 +[#16517]: https://github.com/nushell/nushell/pull/16517 +[#16518]: https://github.com/nushell/nushell/pull/16518 +[#16519]: https://github.com/nushell/nushell/pull/16519 +[#16520]: https://github.com/nushell/nushell/pull/16520 +[#16524]: https://github.com/nushell/nushell/pull/16524 +[#16527]: https://github.com/nushell/nushell/pull/16527 +[#16529]: https://github.com/nushell/nushell/pull/16529 +[#16538]: https://github.com/nushell/nushell/pull/16538 +[#16541]: https://github.com/nushell/nushell/pull/16541 +[#16542]: https://github.com/nushell/nushell/pull/16542 diff --git a/typos.toml b/typos.toml index 7c0b2a359cb..b89a226153c 100644 --- a/typos.toml +++ b/typos.toml @@ -7,15 +7,16 @@ extend-ignore-identifiers-re = [ ] [default.extend-words] -ons = "ons" # false positive in commands/docs/str_replace.md -ful = "ful" # false positive in commands/docs/str_replace.md -optio = "optio" # false positive in cookbook/http.md "ime" = "ime" # false positive in cookbook/polars_v_pandas_v_nushell.md -ws = "ws" # false positive in book/nushell_map.md -ratatui = "ratatui" +ba = "ba" doas = "doas" +ful = "ful" # false positive in commands/docs/str_replace.md +guid = "guid" +hel = "hel" # false positive in blog/2025-09-02-nushell_0_107_0.md iterm = "iterm" nushell = "nushell" -ba = "ba" -guid = "guid" +ons = "ons" # false positive in commands/docs/str_replace.md +optio = "optio" # false positive in cookbook/http.md +ratatui = "ratatui" +ws = "ws" # false positive in book/nushell_map.md