Nushell 0.112.1
Today, we're releasing version 0.112.1 of Nu. This release adds structured markdown parsing with from md, a new % sigil to explicitly call internal commands, and a bunch of new config options to better shape Nu to your workflow, along with improvements to type checking for cell paths.
Note
Some crates failed to release properly, so we skip 0.112.0.
Where to get it
Nu 0.112.1 is available as pre-built binaries or from crates.io. 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 you can install and use with Nushell.
Table of contents
Highlights and themes of this release [toc]
Parse markdown via from md
Breaking change
The from md is considered a breaking change as previously open *.md would return a string.
We added a new from md command that lets you parse markdown into structured data. Instead of manually pulling pieces out of a markdown string and hoping it works, you now get something much more reliable to work with.
Info
Since from commands affect how open behaves, we'd love your input on whether the name still makes sense. Join the discussion on Github and share your thoughts.
Check out the example output here.
No more shadows, call internals with %
Nushell already has the ^ sigil to explicitly call external commands. That way you can still run a binary even if there's a built-in or custom command with the same name.
A lot of people asked for something similar for internal commands and now we have it. Thanks to @fdncred, the new % sigil lets you explicitly call built-ins.
It always uses the initial scope and won't fall back to externals. That means you can reliably call internal commands, even if they're hidden.
> version | get version
0.112.1
> hide version
> version | get version
Error: nu::shell::external_command
× External command failed
╭─[repl_entry #17:1:1]
1 │ version | get version
· ───┬───
· ╰── Command `version` not found
╰────
help: Did you mean `version check`?
> %version | get version
0.112.1More details in the main entry.
Configure Nushell how you like
This release comes with a bunch of new config options to tweak things to your liking.
$env.config.history.path
# history.path (string): Path to the history file.
# If not set, Nushell will use the default location.
# You can also provide a custom path for your history file.
# Examples:
# Use a custom location (e.g., in your home directory):
$env.config.history.path = "~/custom/my-history.txt"
# Default behavior:
# If not set (null), Nushell stores history in the default config directory.
# If set to a directory, the appropriate file name (e.g., history.txt) is used.
# If set to a filename only, the file will be stored in $nu.default-config-dir.Thanks to @kx0101, you can now choose exactly where your history file lives. This ignores the file format, so make sure your config matches. You can also set it to null to disable history entirely. Read more.
$env.config.history.ignore_space_prefixed
# history.ignore_space_prefixed (bool): Whether commands starting with leading whitespace are saved to history.
# true: Commands starting with one or more spaces or tabs will NOT be saved.
# false: All commands are saved, including those with any amount of leading whitespace.
# Default: true
$env.config.history.ignore_space_prefixed = true@guluo2016 added an option to control whether commands starting with a space end up in your history. Read more.
$env.config.auto_cd_implicit
# auto_cd_implicit (bool): Gives precedence to auto-cd when command string is
# an existing directory path.
# false: A relative (e.g. './dirname') or absolute path is required to auto-cd.
# true: If the command string matches a subdirectory in the current directory
# (e.g. 'src'), auto-cd will be triggered without needing './' or '/'.
$env.config.auto_cd_implicit = false@dxrcy added a config option that lets you automatically cd into directories when you type their name. Read more.
$env.config.hinter.closure
# hinter.closure (closure|null): Custom hint closure.
# Closure input: one record argument {|ctx| ... } where
# $ctx.line (string): current line buffer
# $ctx.pos (int): current cursor position
# $ctx.cwd (string): current working directory
# Return:
# string -> hint suffix to render and accept
# record -> {hint: string, next_token?: string} for custom token splitting
# null -> no hint (equivalent to "")
# Any closure error or unsupported return type yields no hint.
# To use the built-in hinter instead, set hinter.closure = null in config.
# This closure runs frequently while typing, so keep it lightweight.
# Default: null
$env.config.hinter.closure = null
# Example:
# $env.config.hinter.closure = {|ctx|
# let last = (history | last 1 | get command_line? | get 0?)
# if $last == null or not ($last | str starts-with $ctx.line) {
# null
# } else {
# ($last | str substring ($ctx.line | str length)..)
# }
# }Thanks to @stuartcarnie, you can now plug in your own hinter using a closure. Read more.
$env.config.table.mode = "frameless"
# table.mode (string): Visual border style for tables.
# One of: "rounded", "basic", "compact", "compact_double", "light", "thin",
# "with_love", "reinforced", "heavy", "none", "psql", "markdown", "dots",
# "restructured", "ascii_rounded", "basic_compact", "single", "double",
# "frameless".
# Can be overridden with `| table --theme/-t`.
# Default: "rounded"
$env.config.table.mode = "rounded"@Benjas333 added a new table style called "frameless". Take a look here.
$env.config.color_config.binary_*
# color_config.binary_null_char: Style for null characters (\0) in binary hex viewer.
# Default: grey42
$env.config.color_config.binary_null_char = "grey42"
# color_config.binary_printable: Style for printable ASCII characters in binary hex viewer.
# Default: cyan_bold
$env.config.color_config.binary_printable = "cyan_bold"
# color_config.binary_whitespace: Style for whitespace ASCII characters in binary hex viewer.
# Default: green_bold
$env.config.color_config.binary_whitespace = "green_bold"
# color_config.binary_ascii_other: Style for other ASCII characters in binary hex viewer.
# Default: purple_bold
$env.config.color_config.binary_ascii_other = "purple_bold"
# color_config.binary_non_ascii: Style for non-ASCII characters in binary hex viewer.
# Default: yellow_bold
$env.config.color_config.binary_non_ascii = "yellow_bold"@ian-h-chamberlain added more color options for binary data in the hex viewer in #17887.
Types via cell.paths! - cell-path-types
Experimental option
This feature is behind an experimental option. Run Nushell with --experimental-option=cell-path-types or set before running Nushell the environment variable to NU_EXPERIMENTAL_OPTIONS=cell-path-types.
@blindFS introduced a new experimental option that makes type inference smarter when working with cell paths.
Before this, issues with nested types would only show up at runtime. Now they can already be caught during parsing.
Check out some examples here.
Changes [toc]
Breaking changes [toc]
Parse markdown via from md [toc]
Info
The introduction of from md caused some discussion whether Nushell should automatically parse text formats like markdown. We want to encourage discussion whether this is a fitting name or not in a Github discussion. Please state your opinion on this.
Added new command from md to parse markdown into an AST. This is considered a breaking change as opening a markdown file now no longer returns a raw string but rather a structured AST.
Use open --raw to open without conversion or hide the command using hide 'from md'.
> '# Title' | from md | table -e
╭───────┬──────────┬────────────────────────────────┬──────────────────┬───────────────────────────────────────────────────────────────────────────────────╮
│ # │ type │ position │ attrs │ children │
├───────┼──────────┼────────────────────────────────┼──────────────────┼───────────────────────────────────────────────────────────────────────────────────┤
│ 0 │ h1 │ ╭───────┬────────────────╮ │ ╭───────┬───╮ │ ╭───┬──────┬────────────────────────────┬───────────────────┬────────────────╮ │
│ │ │ │ │ ╭────────┬───╮ │ │ │ depth │ 1 │ │ │ # │ type │ position │ attrs │ children │ │
│ │ │ │ start │ │ line │ 1 │ │ │ │ level │ 1 │ │ ├───┼──────┼────────────────────────────┼───────────────────┼────────────────┤ │
│ │ │ │ │ │ column │ 1 │ │ │ ╰───────┴───╯ │ │ 0 │ text │ ╭───────┬────────────────╮ │ ╭───────┬───────╮ │ [list 0 items] │ │
│ │ │ │ │ ╰────────┴───╯ │ │ │ │ │ │ │ │ ╭────────┬───╮ │ │ │ value │ Title │ │ │ │
│ │ │ │ │ ╭────────┬───╮ │ │ │ │ │ │ │ start │ │ line │ 1 │ │ │ ╰───────┴───────╯ │ │ │
│ │ │ │ end │ │ line │ 1 │ │ │ │ │ │ │ │ │ │ column │ 3 │ │ │ │ │ │
│ │ │ │ │ │ column │ 8 │ │ │ │ │ │ │ │ │ ╰────────┴───╯ │ │ │ │ │
│ │ │ │ │ ╰────────┴───╯ │ │ │ │ │ │ │ │ ╭────────┬───╮ │ │ │ │ │
│ │ │ ╰───────┴────────────────╯ │ │ │ │ │ │ end │ │ line │ 1 │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ column │ 8 │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ ╰────────┴───╯ │ │ │ │ │
│ │ │ │ │ │ │ │ ╰───────┴────────────────╯ │ │ │ │
│ │ │ │ │ ╰───┴──────┴────────────────────────────┴───────────────────┴────────────────╯ │
╰───────┴──────────┴────────────────────────────────┴──────────────────┴───────────────────────────────────────────────────────────────────────────────────╯Other breaking changes [toc]
- Mutable cell assignment now respects experimental option
reorder-cell-paths. (#17696) job tagis now calledjob describe, the--tagflag injob spawnand thetagcolumn injob list, astagwas renamed todescriptionfor these. (#17496)random choicefromstd-rfcnow behaves more similar tofirst, so thatrandom choicereturns a single element andrandom choice 1returns a list with one element. (#17983)
Additions [toc]
New flag --list-of-records for to nuon [toc]
Add support for list-of-records serialization in to nuon command to return tables as a list of records instead of inline tables.
> ls | to nuon --list-of-records
[{name: ".cargo", type: dir, size: 0b, modified: 2026-04-11T14:28:01.485060+02:00}, {name: ".gitattributes", type: file, size: 113b, modified: 2026-04-11T14:28:01.485565900+02:00}, {name: ".githooks", type: dir, size: 0b, modified: 2026-04-11T14:28:01.486572700+02:00}, {name: ".github", type: dir, size: 0b, modified: 2026-04-11T14:28:01.490573100+02:00}, {name: ".gitignore", type: file, size: 834b, modified: 2026-04-11T14:28:01.497597200+02:00}, {name: "AGENTS.md", type: file, size: 2115b, modified: 2026-04-11T14:28:01.498597200+02:00}, {name: "CITATION.cff", type: file, size: 838b, modified: 2026-04-11T14:28:01.498597200+02:00}, {name: "CLAUDE.md", type: symlink, size: 0b, modified: 2026-04-11T14:28:01.499597100+02:00}, {name: "CODE_OF_CONDUCT.md", type: file, size: 3520b, modified: 2026-04-11T14:28:01.499597100+02:00}, {name: "CONTRIBUTING.md", type: file, size: 18714b, modified: 2026-04-11T14:28:01.500597200+02:00}, {name: "Cargo.lock", type: file, size: 257047b, modified: 2026-04-11T14:28:01.501597200+02:00}, {name: "Cargo.toml", type: file, size: 11950b, modified: 2026-04-11T14:28:01.502596700+02:00}, {name: "Cross.toml", type: file, size: 684b, modified: 2026-04-11T14:28:01.502596700+02:00}, {name: LICENSE, type: file, size: 1115b, modified: 2026-04-11T14:28:01.502596700+02:00}, {name: "README.md", type: file, size: 12742b, modified: 2026-04-11T14:28:01.504102900+02:00}, {name: "SECURITY.md", type: file, size: 2710b, modified: 2026-04-11T14:28:01.504102900+02:00}, {name: assets, type: dir, size: 0b, modified: 2026-04-11T14:28:01.512623900+02:00}, {name: ast-grep, type: dir, size: 0b, modified: 2026-04-11T14:28:01.522645800+02:00}, {name: benches, type: dir, size: 0b, modified: 2026-04-11T14:28:01.524151300+02:00}, {name: "clippy.toml", type: file, size: 170b, modified: 2026-04-11T14:28:01.525159300+02:00}, {name: crates, type: dir, size: 0b, modified: 2026-04-11T14:28:02.451098600+02:00}, {name: devdocs, type: dir, size: 0b, modified: 2026-04-11T14:28:02.457631100+02:00}, {name: docker, type: dir, size: 0b, modified: 2026-04-11T14:28:02.458631500+02:00}, {name: "rust-toolchain.toml", type: file, size: 956b, modified: 2026-04-11T14:28:02.459632800+02:00}, {name: "rustfmt.toml", type: file, size: 18b, modified: 2026-04-11T14:28:02.459632800+02:00}, {name: scripts, type: dir, size: 0b, modified: 2026-04-11T14:28:02.466730800+02:00}, {name: "sgconfig.yml", type: file, size: 218b, modified: 2026-04-11T14:28:02.466730800+02:00}, {name: src, type: dir, size: 0b, modified: 2026-04-11T14:28:02.472540600+02:00}, {name: target, type: dir, size: 0b, modified: 2026-04-11T14:30:48.430795700+02:00}, {name: tests, type: dir, size: 0b, modified: 2026-04-11T14:28:02.629683500+02:00}, {name: toolkit, type: dir, size: 0b, modified: 2026-04-11T14:28:02.641237300+02:00}, {name: "toolkit.nu", type: file, size: 61b, modified: 2026-04-11T14:28:02.635231400+02:00}, {name: "typos.toml", type: file, size: 732b, modified: 2026-04-11T14:28:02.642236500+02:00}, {name: wix, type: dir, size: 0b, modified: 2026-04-11T14:28:02.645247500+02:00}]> ls | to nuon --list-of-records --indent 2
[
{name: ".cargo", type: dir, size: 0b, modified: 2026-04-11T14:28:01.485060+02:00},
{name: ".gitattributes", type: file, size: 113b, modified: 2026-04-11T14:28:01.485565900+02:00},
{name: ".githooks", type: dir, size: 0b, modified: 2026-04-11T14:28:01.486572700+02:00},
{name: ".github", type: dir, size: 0b, modified: 2026-04-11T14:28:01.490573100+02:00},
{name: ".gitignore", type: file, size: 834b, modified: 2026-04-11T14:28:01.497597200+02:00},
{name: "AGENTS.md", type: file, size: 2115b, modified: 2026-04-11T14:28:01.498597200+02:00},
{name: "CITATION.cff", type: file, size: 838b, modified: 2026-04-11T14:28:01.498597200+02:00},
{name: "CLAUDE.md", type: symlink, size: 0b, modified: 2026-04-11T14:28:01.499597100+02:00},
{name: "CODE_OF_CONDUCT.md", type: file, size: 3520b, modified: 2026-04-11T14:28:01.499597100+02:00},
{name: "CONTRIBUTING.md", type: file, size: 18714b, modified: 2026-04-11T14:28:01.500597200+02:00},
{name: "Cargo.lock", type: file, size: 257047b, modified: 2026-04-11T14:28:01.501597200+02:00},
{name: "Cargo.toml", type: file, size: 11950b, modified: 2026-04-11T14:28:01.502596700+02:00},
{name: "Cross.toml", type: file, size: 684b, modified: 2026-04-11T14:28:01.502596700+02:00},
{name: LICENSE, type: file, size: 1115b, modified: 2026-04-11T14:28:01.502596700+02:00},
{name: "README.md", type: file, size: 12742b, modified: 2026-04-11T14:28:01.504102900+02:00},
{name: "SECURITY.md", type: file, size: 2710b, modified: 2026-04-11T14:28:01.504102900+02:00},
{name: assets, type: dir, size: 0b, modified: 2026-04-11T14:28:01.512623900+02:00},
{name: ast-grep, type: dir, size: 0b, modified: 2026-04-11T14:28:01.522645800+02:00},
{name: benches, type: dir, size: 0b, modified: 2026-04-11T14:28:01.524151300+02:00},
{name: "clippy.toml", type: file, size: 170b, modified: 2026-04-11T14:28:01.525159300+02:00},
{name: crates, type: dir, size: 0b, modified: 2026-04-11T14:28:02.451098600+02:00},
{name: devdocs, type: dir, size: 0b, modified: 2026-04-11T14:28:02.457631100+02:00},
{name: docker, type: dir, size: 0b, modified: 2026-04-11T14:28:02.458631500+02:00},
{name: "rust-toolchain.toml", type: file, size: 956b, modified: 2026-04-11T14:28:02.459632800+02:00},
{name: "rustfmt.toml", type: file, size: 18b, modified: 2026-04-11T14:28:02.459632800+02:00},
{name: scripts, type: dir, size: 0b, modified: 2026-04-11T14:28:02.466730800+02:00},
{name: "sgconfig.yml", type: file, size: 218b, modified: 2026-04-11T14:28:02.466730800+02:00},
{name: src, type: dir, size: 0b, modified: 2026-04-11T14:28:02.472540600+02:00},
{name: target, type: dir, size: 0b, modified: 2026-04-11T14:30:48.430795700+02:00},
{name: tests, type: dir, size: 0b, modified: 2026-04-11T14:28:02.629683500+02:00},
{name: toolkit, type: dir, size: 0b, modified: 2026-04-11T14:28:02.641237300+02:00},
{name: "toolkit.nu", type: file, size: 61b, modified: 2026-04-11T14:28:02.635231400+02:00},
{name: "typos.toml", type: file, size: 732b, modified: 2026-04-11T14:28:02.642236500+02:00},
{name: wix, type: dir, size: 0b, modified: 2026-04-11T14:28:02.645247500+02:00}
]New command str escape-regex [toc]
A new command, str escape-regex, has been added. It allows us to sanitize strings before inserting them into a regular-expression pattern.
# Check if the input matches the data exactly (not using `==` for demonstration)
# User input used directly in a regex
def bad [str: string] {
$in like $"^($str)$"
}
"hello" | bad ".*" # true (incorrect)
# Escape the input before inserting it into the regex
def good [str: string] {
$in like $"^($str | str escape-regex)$"
}
"hello" | good ".*" # falseAdd polars selector ends-with [toc]
Introduces polars selector ends-with allowing columns to be selected by a suffix:
> {
"foo": ["x", "y"],
"bar": [123, 456],
"baz": [2.0, 5.5],
"zap": [false, true],
}
| polars into-df --as-columns
| polars select (polars selector ends-with z)
| polars sort-by baz
| polars collect
╭───┬──────╮
│ # │ baz │
├───┼──────┤
│ 0 │ 2.00 │
│ 1 │ 5.50 │
╰───┴──────╯This is is part of an effort to add selectors available in the python API.
History file path can now be configured [toc]
Nushell now supports configuring the history file path using $env.config.history.path. This value can be null or any custom location, which is particularly useful for TTY login scenarios where the --no-history flag cannot be used.
$env.config.history.path = null # disable history
$env.config.history.path = "/custom/history.txt" # custom locationNew experimental option cell-path-types [toc]
Experimental option
This feature is behind an experimental option. Run Nushell with --experimental-option=cell-path-types or set before running Nushell the environment variable to NU_EXPERIMENTAL_OPTIONS=cell-path-types.
Added a new experimental option named cell-path-types which enforces type inferencing on cell path expressions like {foo: 1}.foo if enabled. That means the following examples (previously caused runtime errors or ran successfully) will be rejected by the parser:
> let foo: string = [1].0
Error: nu::parser::type_mismatch
× Type mismatch.
╭─[repl_entry #1:1:19]
1 │ let foo: string = [1].0
· ──┬──
· ╰── expected string, found int
╰────
> mut foo = {bar: 0}
> $foo.bar = 1.0
Error: nu::parser::operator_incompatible_types
× Types 'int' and 'float' are not compatible for the '=' operator.
╭─[repl_entry #4:1:1]
1 │ $foo.bar = 1.0
· ────┬─── ┬ ─┬─
· │ │ ╰── float
· │ ╰── does not operate between 'int' and 'float'
· ╰── int
╰────
> let foo = [1]
> def bar [baz: string] { }
> bar $foo.0
Error: nu::parser::type_mismatch
× Type mismatch.
╭─[repl_entry #8:1:5]
1 │ bar $foo.0
· ───┬──
· ╰── expected string, found int
╰────
Implement selector commands for numeric types [toc]
- Added command
polars selector numericto select all numeric columns. - Added command
polars selector integerto select all integer columns. - Added command
polars selector signed-integerto select signed integer columns. - Added command
polars selector unsigned-integerto select unsigned integer columns. - Added command
polars selector floatto select unsigned float columns.
Added testbin "bins" to nushell help [toc]
Updates the nushell command help by adding the testbin "bins" to the nu --help screen. Now you see this output in the --testbin section of the help.
--testbin <string>
run an internal test binary (see available bins below)
Example: nu --testbin cococo
Available test bins:
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 <c>, if not given, fail with code 1(e.g: nu --testbin fail 10)
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)Added support for parsing hh:mm:ss formatted strings in into duration [toc]
Added the ability to parse h:m:s with into datetime with optional .mmm for millis, .mmmmmm for micros, and .mmmmmmmmm for nanos.
It has to be in the format of h:m:s:
> "3:34" | into duration
Error: nu::shell::incorrect_value
× Incorrect value.
╭─[repl_entry #12:1:1]
1 │ "3:34" | into duration
· ──┬─┬
· │ ╰── encountered here
· ╰── invalid clock-style duration; please use hh:mm:ss with optional .f up to .fffffffff
╰────
When it is, it should just work:
> "3:34:0" | into duration
3hr 34minWhen minutes or seconds >= 60 there are errors:
> "3:61:0" | into duration
Error: nu::shell::incorrect_value
× Incorrect value.
╭─[repl_entry #15:1:1]
1 │ "3:61:0" | into duration
· ───┬──┬
· │ ╰── encountered here
· ╰── invalid clock-style duration; hours must be >= 0 and minutes/seconds must be >= 0 and < 60
╰────
> "3:59:60" | into duration
Error: nu::shell::incorrect_value
× Incorrect value.
╭─[repl_entry #16:1:1]
1 │ "3:59:60" | into duration
· ───┬───┬
· │ ╰── encountered here
· ╰── invalid clock-style duration; hours must be >= 0 and minutes/seconds must be >= 0 and < 60
╰────
Parsing h:m:s:
> "16:59:58" | into duration
16hr 59min 58sec
> "316:59:58" | into duration
1wk 6day 4hr 59min 58secWith 100% more optional fractional time:
> "16:59:58.235" | into duration
16hr 59min 58sec 235ms
> "16:59:58.235123" | into duration
16hr 59min 58sec 235ms 123µs
> "16:59:58.235123456" | into duration
16hr 59min 58sec 235ms 123µs 456ns
> '2:45:31.2' | into duration
2hr 45min 31sec 200ms
> '2:45:31.23' | into duration
2hr 45min 31sec 230ms
> '2:45:31.234' | into duration
2hr 45min 31sec 234ms
> '2:45:31.2345' | into duration
2hr 45min 31sec 234ms 500µshelp now also shows command type [toc]
Add "Command Type" information to help.
> help from ini
Parse text as .ini and create table.
Usage:
> from ini {flags}
Flags:
-h, --help: Display the help message for this command
-q, --no-quote: Disable quote handling for values.
-e, --no-escape: Disable escape sequence handling for values.
-m, --indented-multiline-value: Allow values to continue on indented lines.
-w, --preserve-key-leading-whitespace: Preserve leading whitespace in keys.
Command Type:
> plugin
Input/output types:
╭───┬────────┬────────╮
│ # │ input │ output │
├───┼────────┼────────┤
│ 0 │ string │ record │
╰───┴────────┴────────╯
Examples:
Converts ini formatted string to record
> '[foo]
a=1
b=2' | from ini
╭─────┬───────────╮
│ │ ╭───┬───╮ │
│ foo │ │ a │ 1 │ │
│ │ │ b │ 2 │ │
│ │ ╰───┴───╯ │
╰─────┴───────────╯
Disable escaping to keep backslashes literal
> '[start]
file=C:\Windows\System32\xcopy.exe' | from ini --no-escape
╭───────┬──────────────────────────────────────────╮
│ │ ╭──────┬───────────────────────────────╮ │
│ start │ │ file │ C:\Windows\System32\xcopy.exe │ │
│ │ ╰──────┴───────────────────────────────╯ │
╰───────┴──────────────────────────────────────────╯
Disable quote handling to keep quote characters
> '[foo]
bar="quoted"' | from ini --no-quote
╭─────┬────────────────────╮
│ │ ╭─────┬──────────╮ │
│ foo │ │ bar │ "quoted" │ │
│ │ ╰─────┴──────────╯ │
╰─────┴────────────────────╯
Allow values to continue on indented lines
> '[foo]
bar=line one
line two' | from ini --indented-multiline-value
╭─────┬────────────────────╮
│ │ ╭─────┬──────────╮ │
│ foo │ │ bar │ line one │ │
│ │ │ │ line two │ │
│ │ ╰─────┴──────────╯ │
╰─────┴────────────────────╯
Preserve leading whitespace in keys
> '[foo]
key=value' | from ini --preserve-key-leading-whitespace
╭─────┬───────────────────╮
│ │ ╭───────┬───────╮ │
│ foo │ │ key │ value │ │
│ │ ╰───────┴───────╯ │
╰─────┴───────────────────╯
New flag --prune for group-by [toc]
Adds group-by --prune to delete the column(s) used for grouping when the arguments are cell paths; closure arguments are unaffected. If pruning leaves a parent empty (e.g., due to nested columns), the parent is removed as well.`
> let table = [
[name, meta];
[andres, {lang: rb, year: "2019"}],
[jt, {lang: rs, year: "2019"}],
[storm, {lang: rs, year: "2021"}],
[kai, {lang: rb, year: "2021"}]
]
> $table
╭───┬────────┬─────────────────╮
│ # │ name │ meta │
├───┼────────┼─────────────────┤
│ 0 │ andres │ ╭──────┬──────╮ │
│ │ │ │ lang │ rb │ │
│ │ │ │ year │ 2019 │ │
│ │ │ ╰──────┴──────╯ │
│ 1 │ jt │ ╭──────┬──────╮ │
│ │ │ │ lang │ rs │ │
│ │ │ │ year │ 2019 │ │
│ │ │ ╰──────┴──────╯ │
│ 2 │ storm │ ╭──────┬──────╮ │
│ │ │ │ lang │ rs │ │
│ │ │ │ year │ 2021 │ │
│ │ │ ╰──────┴──────╯ │
│ 3 │ kai │ ╭──────┬──────╮ │
│ │ │ │ lang │ rb │ │
│ │ │ │ year │ 2021 │ │
│ │ │ ╰──────┴──────╯ │
╰───┴────────┴─────────────────╯
> $table | group-by meta.year --prune
╭──────┬────────────────────────────────╮
│ │ ╭───┬────────┬───────────────╮ │
│ 2019 │ │ # │ name │ meta │ │
│ │ ├───┼────────┼───────────────┤ │
│ │ │ 0 │ andres │ ╭──────┬────╮ │ │
│ │ │ │ │ │ lang │ rb │ │ │
│ │ │ │ │ ╰──────┴────╯ │ │
│ │ │ 1 │ jt │ ╭──────┬────╮ │ │
│ │ │ │ │ │ lang │ rs │ │ │
│ │ │ │ │ ╰──────┴────╯ │ │
│ │ ╰───┴────────┴───────────────╯ │
│ │ ╭───┬───────┬───────────────╮ │
│ 2021 │ │ # │ name │ meta │ │
│ │ ├───┼───────┼───────────────┤ │
│ │ │ 0 │ storm │ ╭──────┬────╮ │ │
│ │ │ │ │ │ lang │ rs │ │ │
│ │ │ │ │ ╰──────┴────╯ │ │
│ │ │ 1 │ kai │ ╭──────┬────╮ │ │
│ │ │ │ │ │ lang │ rb │ │ │
│ │ │ │ │ ╰──────┴────╯ │ │
│ │ ╰───┴───────┴───────────────╯ │
╰──────┴────────────────────────────────╯
> $table | group-by meta.year meta.lang --prune # also removes the parent if it's now empty
╭──────┬─────────────────────────╮
│ │ ╭────┬────────────────╮ │
│ 2019 │ │ │ ╭───┬────────╮ │ │
│ │ │ rb │ │ # │ name │ │ │
│ │ │ │ ├───┼────────┤ │ │
│ │ │ │ │ 0 │ andres │ │ │
│ │ │ │ ╰───┴────────╯ │ │
│ │ │ │ ╭───┬──────╮ │ │
│ │ │ rs │ │ # │ name │ │ │
│ │ │ │ ├───┼──────┤ │ │
│ │ │ │ │ 0 │ jt │ │ │
│ │ │ │ ╰───┴──────╯ │ │
│ │ ╰────┴────────────────╯ │
│ │ ╭────┬───────────────╮ │
│ 2021 │ │ │ ╭───┬───────╮ │ │
│ │ │ rs │ │ # │ name │ │ │
│ │ │ │ ├───┼───────┤ │ │
│ │ │ │ │ 0 │ storm │ │ │
│ │ │ │ ╰───┴───────╯ │ │
│ │ │ │ ╭───┬──────╮ │ │
│ │ │ rb │ │ # │ name │ │ │
│ │ │ │ ├───┼──────┤ │ │
│ │ │ │ │ 0 │ kai │ │ │
│ │ │ │ ╰───┴──────╯ │ │
│ │ ╰────┴───────────────╯ │
╰──────┴─────────────────────────╯New and improved xaccess! [toc]
An experimental upgrade to std/xml xaccess, currently accessible as std-rfc/xml xaccess. It is completely backwards compatible, with the addition of:
- using a
...restparameter, removing the need to use a list (though still supporting it). - supporting cell-paths, rather than plain strings and ints.
- supporting
descendant-or-self::node()(aka//) with**
> use std-rfc/xml xaccess
> http get 'https://www.nushell.sh/rss.xml'
| xaccess rss.**.item # grab all items
| update content {
xaccess * { $in.tag? in [title, link] } # only grab title and link
}
| first 3
| {tag: rss, content: $in}
| to xml -i 2
<rss>
<item>
<title>This week in Nushell #344</title>
<link>https://www.nushell.sh/blog/2026-03-27-twin0344.html</link>
</item>
<item>
<title>This week in Nushell #343</title>
<link>https://www.nushell.sh/blog/2026-03-20-twin0343.html</link>
</item>
<item>
<title>This week in Nushell #342</title>
<link>https://www.nushell.sh/blog/2026-03-13-twin0342.html</link>
</item>
</rss>Added configurable external hinter closure [toc] PR #17566 by @stuartcarnie
Added support for configurable external hinter closures via $env.config.hinter.closure. This allows users to provide a custom closure that receives the current line, cursor position, and working directory, and returns inline hint text (like fish-style autosuggestions). Closures can return a simple string or a record {hint: string, next_token?: string} for custom token-based hint acceptance.
Examples
Atuin-based hint closure
$env.config.line_editor.external.hinter = {
enable: true
closure: {|ctx|
if ($ctx.line | str length) == 0 {
null
} else {
let candidate = (try {
^atuin search --cwd $ctx.cwd --limit 1 --search-mode prefix --cmd-only $ctx.line
| lines
| first
} catch {
null
})
if $candidate == null or not ($candidate | str starts-with $ctx.line) {
null
} else {
($candidate | str substring (($ctx.line | str length))..)
}
}
}
}Simple deterministic test closure (good for validating script hinter behavior)
$env.config.line_editor.external.hinter = {
enable: true
closure: {|ctx|
if ($ctx.line | str length) == 0 {
null
} else {
let target = "zzhint from-script"
if not ($target | str starts-with $ctx.line) {
null
} else {
let remaining = ($target | str substring (($ctx.line | str length))..)
if ($remaining | str length) == 0 { null } else { $remaining }
}
}
}
}New --base flag for url parse [toc] PR #17833 by @smartcoder0777
url parse now supports an optional --base/-b flag to resolve relative URLs against a base URL (WHATWG-compatible). This makes it easier to normalize links from scraped pages while still returning the same structured URL record (scheme, host, path, query, fragment, and params).
MCP: Auto-promote long-running evaluations to background jobs [toc] PR #17861 by @andrewgazelka
Evaluations that take longer than 10 seconds, or are cancelled by the client, are automatically promoted to background jobs instead of being discarded. Their results are delivered to job 0's mailbox, where they can be retrieved using job recv. These promoted jobs appear in job list with descriptions like mcp: <command>, and they can be terminated using job kill. The timeout for this behavior can be configured through the $env.NU_MCP_PROMOTE_AFTER setting.
New option to allow command with space prefixes to be recorded in history [toc] PR #17350 by @guluo2016
Usually commands that start with a space are not recorded to the history. With $env.config.history.ignore_space_prefixed this can be changed.
table command now respects metadata of Custom values. [toc]
# before nushell didn't render the `cwd` column like paths
# now it does
history | metadata set --path-columns [cwd] | table --iconsNew configuration option auto_cd_always [toc]
This release adds the configuration option $env.config.auto_cd_implicit, which allows auto-cd behavior as long as the command string is an existing directory.
Unordered par-each is now streaming [toc]
Allow par-each to stream. The following example will print out a new value each second that passes.
New sigil % to explicitly call built-ins [toc]
Nushell has a new sigil % that allows you to call a built-in even if you have the built-in shadowed by a custom command or alias.
> def ls [] { echo duck }
> ls
duck
> %ls
╭────┬─────────────────────┬─────────┬──────────┬──────────────╮
│ # │ name │ type │ size │ modified │
├────┼─────────────────────┼─────────┼──────────┼──────────────┤
│ 0 │ .cargo │ dir │ 0 B │ 7 months ago │
│ 1 │ .gitattributes │ file │ 113 B │ 7 months ago │
│ 2 │ .githooks │ dir │ 0 B │ 7 months ago │
│ 3 │ .github │ dir │ 0 B │ 3 weeks ago │
│ 4 │ .gitignore │ file │ 834 B │ 2 weeks ago │
│ 5 │ .idea │ dir │ 0 B │ 9 months ago │
│ 6 │ .opencode │ dir │ 0 B │ a month ago │
│ 7 │ .vscode │ dir │ 0 B │ 8 months ago │
│ 8 │ AGENTS.md │ file │ 2,1 kB │ a day ago │
│ 9 │ CITATION.cff │ file │ 838 B │ 6 months ago │
│ 10 │ CLAUDE.md │ symlink │ 0 B │ a day ago │
│ 11 │ CODE_OF_CONDUCT.md │ file │ 3,5 kB │ 7 months ago │
│ 12 │ CONTRIBUTING.md │ file │ 18,7 kB │ 3 weeks ago │
│ 13 │ Cargo.lock │ file │ 257,0 kB │ 4 hours ago │
│ 14 │ Cargo.toml │ file │ 11,9 kB │ a day ago │
│ 15 │ Cross.toml │ file │ 684 B │ 7 months ago │
│ 16 │ LICENSE │ file │ 1,1 kB │ 3 weeks ago │
│ 17 │ README.md │ file │ 12,7 kB │ 3 weeks ago │
│ 18 │ SECURITY.md │ file │ 2,7 kB │ 3 weeks ago │
│ 19 │ assets │ dir │ 0 B │ 7 months ago │
│ 20 │ ast-grep │ dir │ 0 B │ 3 weeks ago │
│ 21 │ benches │ dir │ 0 B │ a week ago │
│ 22 │ clippy.toml │ file │ 170 B │ a week ago │
│ 23 │ crates │ dir │ 0 B │ 3 weeks ago │
│ 24 │ devdocs │ dir │ 0 B │ 2 weeks ago │
│ 25 │ docker │ dir │ 0 B │ 3 weeks ago │
│ 26 │ file.sqlite │ file │ 3 B │ 2 weeks ago │
│ 27 │ my_ls.sqlite │ file │ 8,1 kB │ 6 months ago │
│ 28 │ notes.sqlite.md │ file │ 670 B │ 7 months ago │
│ 29 │ opencode.json │ file │ 809 B │ a day ago │
│ 30 │ rust-toolchain.toml │ file │ 956 B │ 2 weeks ago │
│ 31 │ rustfmt.toml │ file │ 18 B │ 2 days ago │
│ 32 │ scratch │ dir │ 0 B │ 2 weeks ago │
│ 33 │ script.nu │ file │ 416 B │ 4 weeks ago │
│ 34 │ scripts │ dir │ 0 B │ 2 weeks ago │
│ 35 │ sgconfig.yml │ file │ 218 B │ 3 weeks ago │
│ 36 │ src │ dir │ 0 B │ a day ago │
│ 37 │ target │ dir │ 0 B │ 3 hours ago │
│ 38 │ tests │ dir │ 0 B │ a week ago │
│ 39 │ toolkit │ dir │ 0 B │ a week ago │
│ 40 │ toolkit.nu │ file │ 61 B │ 3 weeks ago │
│ 41 │ typos.toml │ file │ 732 B │ 3 weeks ago │
│ 42 │ wix │ dir │ 0 B │ 3 weeks ago │
├────┼─────────────────────┼─────────┼──────────┼──────────────┤
│ # │ name │ type │ size │ modified │
╰────┴─────────────────────┴─────────┴──────────┴──────────────╯If you try to call something that doesn't exist as a built-in you get an error:
> %lss
Error: nu::parser::error
× percent sigil requires a built-in command
╭─[repl_entry #59:1:2]
1 │ %lss
· ─┬─
· ╰── unknown built-in command
╰────
help: remove `%` to use normal resolution, or use `^` to run an external command explicitly
New table style frameless [toc] PR #17993 by @Benjas333
Added the "frameless" table theme.
> $env.config.table.mode = "frameless"
> [[a b, c]; [1 2 3] [4 5 6]] | table
# │ a │ b │ c
───┼───┼───┼───
0 │ 1 │ 2 │ 3
1 │ 4 │ 5 │ 6MCP: Promoted jobs now return full output [toc] PR #17989 by @andrewgazelka
When an MCP evaluation gets auto-promoted to a background job (after timeout or client cancellation), the mailbox payload was the potentially-truncated MCP response. If output exceeded NU_MCP_OUTPUT_LIMIT, job recv would return a dangling $history.N reference instead of the actual data — $history is only populated for non-promoted evals.
This PR introduces an EvalOutput struct that separates the MCP response (possibly truncated with a $history note) from the full output string. Promoted jobs now send full_output through the mailbox so job recv always returns complete, usable data.
Also fixes a pipefail issue where external commands that write to both stdout and stderr would re-raise non_zero_exit_code after process_pipeline had already captured the output — solved by calling ignore_error(true) on the child.
Other additions [toc]
- Added
ctrl + p/nto move up and down the input list like withfzf. (#17707) hide-envnow autocompletes environment variable names when pressing tab. (#17658)- Add the ability for
query webto parse the entire html document when using the--documentflag. (#17759) ansicommand now has completions for its positional argument. (#17761)into binarynow has a completion for the--endianflag. (#17788)ps -loutput has two new columns:process_group_idandsession_id. (#16357)- Binary hex colors are now configurable with
$env.config.color_config.binary_*and$env.config.use_ansi_coloring. (#17887) metadata set --content-typenow also acceptsnullto unset thecontent_typemetadata (#17944)http getnow also automatically parsesx--prefixed mime types likeapplication/x-nuon. (#17967)- The
input listcommand now streams by consuming an upstream list or range incrementally vs collecting. (#17966) - Add
--full(-f) and--allow-errors(-e) support tohttp headfor parity with other HTTP verbs. (#17650)
Removals [toc]
Removed some deprecated commands and flags [toc]
Command removed:
random dicein favor ofstd/random dice
Flags removed:
metadata set --mergein favor ofmetadata set { merge {key: value} }watch --debounce-msin favor ofwatch --debounceinto value --columns --prefer-filesizesin favor ofdetect type --columns --prefer-filesizes
into value no longer infer nushell datatype form string. Use detect type in combination with update cells instead.
Other changes [toc]
$nu/$env/$in are now more aggressively reserved [toc]
More aggressive reserved names ($nu/$env/$in) exclusion in implicit variable declaration. e.g.
for nu: int in [] {}
match [1, 2, 3] { [$in, $nu, $env] => { $in + $nu + $env }, _ => 0 }On the other hand, $it is re-enabled in let it = 1 or 1 | let it
Improve alias expression error message to use user-friendly descriptions [toc]
Error messages for invalid alias expressions now show user-friendly descriptions instead of internal Rust type names. The error code nu::parser::cant_alias_expression is unchanged.
> alias foo = $bar.baz
Error: nu::parser::cant_alias_expression
× Can't create alias to expression.
╭─[repl_entry #4:1:13]
1 │ alias foo = $bar.baz
· ────┬───
· ╰── aliasing FullCellPath is not supported
╰────
help: Only command calls can be aliased.
> alias foo = $bar.baz
Error: nu::parser::cant_alias_expression
× Can't create alias to expression.
╭─[repl_entry #65:1:13]
1 │ alias foo = $bar.baz
· ────┬───
· ╰── aliasing a cell path expression is not supported
╰────
help: Only command calls can be aliased.
More compact output for to nuon --indent n [toc] PR #17928 by @WookiesRpeople2
to nuon --indent n will print in a more compact output:
> [{column1: 1, column2: 2}, {column1: 3, column2: 4}] | to nuon --indent 2
[
[
"column1",
"column2"
];
[
1,
2
],
[
3,
4
]
]> [{column1: 1, column2: 2}, {column1: 3, column2: 4}] | to nuon --indent 2
[
["column1", "column2"];
[1, 2],
[3, 4]
]Some Polars upgrades [toc]
- Upgrades polars to 0.53.
- Reimplemented
polars pivotcommand to polars' updated pivot library. Introduced support for "element" type aggregates. polars unpivotwill now only work on LazyFrames. Eager dataframes will be converted to a LazyFrame.- Added flags
--keep-nullsand--empty-as-nulltopolars concat. - Some improvements on list conversion from nushell to polars. Sub-lists should retain their type instead of being converted to type "object". Using NuDataFrame::try_from_value will convert a Value::List object directly and attempt use an appropriate DataType before falling back to "object".
- Added additional selectors:
polars selector not,polars selector matches,polars selector starts-with.
Additional changes [toc]
- Type widening now flattens a bit more. (#17575)
keybindings listcommand is updated with new descriptions.CutFromStartLinewise/CutToEndLinewisenow takeskeep_lineinstead ofvalueas its parameter for clarity. (#17859)getcommand now removes thepath_columnsmetadata if none of the cell paths are a index. (#17866)firstandlastpreserve pipeline metadata (such ascontent_typeandpath_columns) for list, range, and list-stream input.content_typeis still cleared when the output is only part of a binary value (for example a single byte as an integer or a truncated binary value). (#17875)- Fixed a crash (“known external name not found”) when an alias reused the same name as an extern used for completions (for example wrapping an external with default flags). (#17878)
- Update help text for the
--ide-*commands in thenu --helpscreen. (#17905) detect typenow preservescontent_typemetadata if it cannot detect the input value (#17906)- Some code that was already known to be invalid early-on, will now be highlighted as an error. (#17917)
- When
--fullis used,http headnow returns the standard full response record (urls,headers.request,headers.response,body,status). (#17650) - When
--allow-errorsis used,http headno longer fails on non-2xx statuses and still exposes headers. (#17650) skipcommand only removescontent_typemetadata if n > 0 and input is binary. (#17867)rejectcommand also removes the path frompath_columnsmetadata when removing a column. (#17867)
Bug fixes [toc]
history now returns date values for sqlite-based history [toc]
Update the sqlite output of the history file by adding column adapters so we can maintain speed but still get nushell values out of the command.
> history | last
╭─────────────────┬─────────────────────╮
│ start_timestamp │ 1775933381705 │
│ command │ history | last │
│ cwd │ D:\Projects\nushell │
│ duration │ │
│ exit_status │ │
╰─────────────────┴─────────────────────╯
> history | last 3
╭───┬─────────────────┬──────────────────┬─────────────────────┬──────────┬─────────────╮
│ # │ start_timestamp │ command │ cwd │ duration │ exit_status │
├───┼─────────────────┼──────────────────┼─────────────────────┼──────────┼─────────────┤
│ 0 │ 1775933378360 │ clear │ D:\Projects\nushell │ 1 │ 0 │
│ 1 │ 1775933381705 │ history | last │ D:\Projects\nushell │ 17 │ 0 │
│ 2 │ 1775933392010 │ history | last 3 │ D:\Projects\nushell │ │ │
╰───┴─────────────────┴──────────────────┴─────────────────────┴──────────┴─────────────╯> history | last
╭─────────────────┬─────────────────────╮
│ start_timestamp │ now │
│ command │ history | last │
│ cwd │ D:\Projects\nushell │
│ duration │ │
│ exit_status │ │
╰─────────────────┴─────────────────────╯
> history | last 3
╭───┬─────────────────┬──────────────────┬─────────────────────┬──────────┬─────────────╮
│ # │ start_timestamp │ command │ cwd │ duration │ exit_status │
├───┼─────────────────┼──────────────────┼─────────────────────┼──────────┼─────────────┤
│ 0 │ now │ clear │ D:\Projects\nushell │ 2ms │ 0 │
│ 1 │ now │ history | last │ D:\Projects\nushell │ 19ms │ 0 │
│ 2 │ now │ history | last 3 │ D:\Projects\nushell │ │ │
╰───┴─────────────────┴──────────────────┴─────────────────────┴──────────┴─────────────╯Brought back missing --log-* flags for nushell [toc]
Fixed the broken nushell executable logging flags.
Here's the new logging section.
Logging:
--log-level <string>
log level for diagnostic logs (error, warn, info, debug, trace). Off by default
Example: nu --log-level info
--log-target <string>
set the target for the log to output. stdout, stderr(default), mixed or file (requires --log-file)
Example: nu --log-target stdout
--log-file <path>
specify a custom log file path (requires --log-target file and --log-level <level>)
Example: nu --log-target file --log-file ~/.local/share/nushell/nu.log --log-level info
--log-include <string...>
set the Rust module prefixes to include from the log output
Example: nu --log-include info
--log-exclude <string...>
set the Rust module prefixes to exclude from the log output
Example: nu --log-exclude infoFix confusing type mismatch error in bytes collect [toc] PR #17746 by @Bortlesboat
bytes collect now accepts table/stream input (e.g. from each), and type mismatch errors no longer repeat the same type multiple times.
Two changes:
- Added
Type::table()tobytes collectinput types so pipelines like0..128 | each {} | into binary --compact | bytes collectwork without requiring an explicitcollectfirst - Deduplicated types in
combined_type_stringso error messages say "binary, table, or record" instead of "binary, binary, binary, binary, table, or record"
built-in commands now support null for optional parameters [toc]
Optional positional parameters in built-in commands now accept null, treating it as if the argument was omitted. This allows custom commands to wrap built-ins and transparently forward optional parameters:
> def wraps-first [rows?: int] { [1, 2, 3] | first $rows }
> wraps-first
1
> wraps-first 2
╭───┬───╮
│ 0 │ 1 │
│ 1 │ 2 │
╰───┴───╯finally block won't run twice if error produced in finally block [toc] PR #17764 by @WindSoilder
> try {} finally {
print "inside finally"
error make
}
inside finally
Error: nu::shell::error
× originates from here
╭─[repl_entry #6:3:3]
2 │ print "inside finally"
3 │ error make
· ──────────
4 │ }
╰────
It prints "inside finally" once.
finally block won't run before try/catch finished
> try {
nu -c 'print before; sleep 3sec; print after'
} finally {
print "finally ran"
}
before
after
finally ranFinally won't run before try finished.
Notes about streaming
trydoes not stream ifcatchorfinallyexists.catchdoes not stream iffinallyexists.
let ignores pipefail checking
> nu -c "print 'hello\nworld'; exit 1" | lines | let x
╭───┬───────╮
│ 0 │ hello │
│ 1 │ world │
╰───┴───────╯
> $x
╭───┬───────╮
│ 0 │ hello │
│ 1 │ world │
╰───┴───────╯The variable x will be assigned.
Try doesn't produce output if it has an error
> try { nu -c 'exit 1' | is-empty } catch { 'result-on-catch' }
result-on-catchIt returns result-on-catch, and redundant true won't be returned.
Fixed some into datetime inconsistencies [toc]
> "2026-03-21_00:25" | into datetime --format "%F_%R" --timezone utc
Sat, 21 Mar 2026 00:25:00 +0100 (3 weeks ago)
> "2026-03-21_00:25" | into datetime --format "%F_%R" --timezone local
Sat, 21 Mar 2026 00:25:00 +0100 (3 weeks ago)> "2026-03-21_00:25" | into datetime --format "%F_%R" --timezone utc
Sat, 21 Mar 2026 00:25:00 +0000 (3 weeks ago)
> "2026-03-21_00:25" | into datetime --format "%F_%R" --timezone local
Sat, 21 Mar 2026 00:25:00 +0100 (3 weeks ago)Fixed argument parsing for strings non-space whitespace [toc]
Update argument parsing to allow things like this without having an error.
nu test.nu a b "c\nd"Fixed parsing optional cell paths on literal braced values [toc] PR #17897 by @smartcoder0777
Nushell now correctly parses braced values followed by optional cell paths. Expressions like {}.foo? are handled as expected and return null for missing fields, instead of raising an unclosed-delimiter parse error.
Fixed error propagation for `reject [toc]
Fixed an error in reject command where an error value in the input would return column_not_found error instead of propagating the error.
> ls | insert foo { error make { msg: 'boo' } } | reject name
Error: nu::shell::column_not_found
× Cannot find column 'name'
╭─[repl_entry #2:1:6]
1 │ ls | insert foo { error make { msg: 'boo' } } | reject name
· ───┬── ──┬─
· │ ╰── cannot find column 'name'
· ╰── value originates here
╰────
> ls | insert foo { error make { msg: 'boo' } } | reject name
Error: nu::shell::error
× boo
╭─[repl_entry #1:1:30]
1 │ ls | insert foo { error make { msg: 'boo' } } | reject name
· ──────────────
╰────
Other fixes [toc]
- Fixed the problem where searching in the
explorecommand was off by 1 which caused the hit to sometimes be hidden. (#17718) - There were rendering bugs when the prompt was at the bottom of the screen. Removing the custom rendering helped fix the problems. (#17691)
- When in
exploreand:nureturns null, you can nowq/escout. (#17661) - Fixed a bug where numerical keys in records mess up type inference, e.g.
let foo: string = {1: 1}is allowed before the fix. As a side effect, previously forbidden key names, like{1kb: 1}, are valid now. (#17684) - Nushell now resolves symlinks via
$env.PWDif that dir is the same asstd::env::current_dirto allow formatted paths. (#17720) - Fixed a bug where creating nushell scripts with subcommands would show duplicate subcommands. (#17727)
- Fixed the
variable_not_founderror in scenarios with recursive functions. (#17726) - Default arguments now allowed to have the same name as the parameter. (#17697)
- Avoided
input listen --timeoutpanic from double counting. (#17744) rejectnow preserves the stream metadata. For example,ls | reject ...[]will keep theLS_COLORSand ansi links. (#17775)- Reject format strings with tokens after ending quote. (#17777)
- Fixed a regression of v0.111.0 that made
httpcommands not respect environment variables for proxying likeALL_PROXY. (#17794) - Fixed an issue where read-only directories are unable to be copied due to the mode attribute being preserved by default. (#17791)
- Nushell now resolves library paths with user‑provided
-Ientries before the defaultNU_LIB_DIRS, fixing cases where bundled modules shadowed user scripts.NU_LIB_DIRSis also correctly treated as immutable at startup to avoid unexpected mutation in config or scripts. (#17819) - Added a simple check to prevent histogram output from having overlapping names when a named column is passed to the histogram. So now histograms of columns named "count", "frequency" (or the frequency user-defined name), "quantile", "percentage" will have sensible output. (#17783)
group-bynow correctly groups rows when the grouper values are compound types like lists or records. Previously, grouping could collapse distinct values into the same bucket due to a lossy abbreviation of the compound key. (#17837)- Fixed the command
teetruncating the input for the inner closure when the output ofteeis ignored by subsequent commands. (#17793) - Aligns http options with the other http verbs so flags and output shape match
http head. (#17841) - Fixed a bug of lossy parsing of unclosed subexpressions in string interpolation, e.g.
$'(foo', which blocks completions inside all kinds of string interpolation subexpressions. (#17851) rmnow errors when given a symlink path with a trailing slash, preventing accidental deletion of the underlying directory. Userm foo-linkwithout the trailing slash to remove the symlink itself. (#17847)- Fixed a bug of duration/filesize parsing with numbers started by
., e.g..5sec(#17923) - Made MCP more responsive in stdio mode. (#17945)
- Use strict comparison for float-based sorting to fix panics. (#17930)
nu --experimental-options ... script.nunow works correctly without requiring--before the script path. Nushell no longer treats the script file as part of the--experimental-optionsvalues. (#17943)parsesimple patterns: literal{via(char lbrace)before a{name}capture works now. (#17962)- Fixed
input listwhen stdin is redirected in Unix TTY environments. (#17987)
Notes for plugin developers [toc]
Replaced ShellError::GenericError with ShellError::Generic(GenericError) [toc] PR #17864 by @cptpiepmatz
ShellError::GenericError is now deprecated, prefer to use ShellError::Generic instead.
Hall of fame [toc]
Thanks to all the contributors below for helping us solve issues, improve documentation, refactor code, and more! 🙏
| author | change | link |
|---|---|---|
| @cptpiepmatz | Kitest-based Test Harness | #17628 |
| @cptpiepmatz | Update winresource versions | #17702 |
| @ChrisDenton | Tests should not end cwd with a / | #17721 |
| @fdncred | Refactor sqlite push down and apply to (nearly) all filter commands. | #17737 |
| @cptpiepmatz | Add in-process testing with nu_test_support::test() | #17733 |
| @cptpiepmatz | Moved some tests around and applied some more nu_test_support::test | #17740 |
| @Juhan280 | Two new reedline events added: ToStart and ToEnd to jump to the start/end of the buffer. | #17747 |
| @cptpiepmatz | Use std::panic::Location instead of custom Location type | #17748 |
| @cptpiepmatz | Update more tests and use assert_contains() | #17745 |
| @Juhan280 | Users would not notice any difference other than that the error message when providing incorrect variant will preserve case | #17749 |
| @cptpiepmatz | Added TestResult::expect_value_eq and provide more comprehensive errors for test() | #17750 |
| @preiter93 | Bump edtui to 0.11.2 and remove workarounds | #17752 |
| @weirdan | char command now has completions for its positional argument. | #17762 |
| @cptpiepmatz | Merge To/FromYaml and To/FromYml into one struct | #17766 |
| @cptpiepmatz | Refactored most nested command integraiont tests in nu-command | #17767 |
| @Bahex | Make Span's Debug impl succinct | #17782 |
| @Juhan280 | Update reedline to commit 5c2f105 | #17785 |
| @andrewgazelka | Document automatic JSON parsing for HTTP commands | #17158 |
| @Bahex | test_record! macro for convenience | #17797 |
| @cptpiepmatz | Refactor usages of test_examples with a centralized example testing code (except plugins) | #17801 |
| @cptpiepmatz | Enable env_shlvl_in_repl and env_shlvl_in_exec_repl tests | #17803 |
| @cptpiepmatz | Give http get command tests with socks proxy more time to execute | #17804 |
| @cptpiepmatz | Warn on clippy::push_format_string | #17805 |
| @cptpiepmatz | Bump toml crate to 1.0 | #17813 |
| @zhiburt | Change width estimation in case of header_on_border | #17812 |
| @tauanbinato | N/A — type signature correction only, no behavior change. | #17811 |
| @cptpiepmatz | Refactored more command integration tests | #17820 |
| @hustcer | Exclude nu-test-support for loongarch64 to avoid build error of release script | #17821 |
| @cptpiepmatz | Warn on clippy::needless_raw_strings | #17822 |
| @Rohan5commit | N/A (devdocs wording fix). | #17818 |
| @cptpiepmatz | Fix clippy issues | #17825 |
| @cptpiepmatz | Refactor more command integration tests | #17858 |
| @Juhan280 | Add take_metadata and with_path_columns | #17862 |
| @rayzeller | Replaced Span::unknown() with real spans in the which command. Error messages from which now report accurate source locations. | #17842 |
| @cptpiepmatz | Add GenericError::new_internal_with_location | #17868 |
| @cptpiepmatz | Allow showing an error source for generic errors | #17869 |
| @cptpiepmatz | Add From conversions for ErrorSite | #17870 |
| @cptpiepmatz | Apply #[doc(no_inline)] to prelude modules | #17873 |
| @cptpiepmatz | Only update PR labels on opened or ready PRs | #17874 |
| @rayzeller | Replaced Span::unknown() with real spans in plugin crates. Plugin custom value comparison errors now report accurate source locations. | #17871 |
| @rayzeller | Replaced Span::unknown() with real spans in nu-command filters and strings. This improves error messages by providing accurate source locations when errors occur in uniq, find, sort, detect columns, split list, and related commands. | #17872 |
| @rayzeller | Replaced Span::unknown() with real spans in nu-cli and main binary. Interactive commands like keybindings listen, REPL error handling, and IDE support now provide accurate source locations in error messages. | #17876 |
| @cptpiepmatz | Restructure nu-test-support crate and add lots of docs | #17900 |
| @Juhan280 | Deprecate PipelineData::metadata() | #17891 |
| @Juhan280 | Implement DerefMut for PipelineExecutionData | #17909 |
| @Juhan280 | Fix cargo doc warnings | #17910 |
| @Bahex | http commands' output metadata properly includes content-type | #17899 |
| @cptpiepmatz | Bump rand and related to 0.10 | #17929 |
| @xtqqczze | Update Cargo.toml files to use workspace edition and rust-version | #17931 |
| @xtqqczze | Failed to parse manifest error | #17950 |
| @fdncred | Revert "detect lexer-stage errors at highlighting" | #17955 |
| @cptpiepmatz | Streamline CI Cargo Checks | #17954 |
| @rayzeller | Internal change only: test code now uses Span::test_data() instead of Span::unknown() to better distinguish test spans from genuinely unknown spans. No user-facing behavior changes. | #17893 |
| @rayzeller | Replaced Span::unknown() with real spans in the polars plugin. DataFrame operations, type conversions, and custom value comparisons now provide accurate source locations in error messages. | #17939 |
| @cptpiepmatz | Move conversion between nu_json::Value and nu_protocol::Value into nu-json | #17980 |
| @andrewgazelka | Improve model guidance | #17996 |
| @cptpiepmatz | Mark CustomValue::is_iterable as deprecated | #18003 |
| @sholderbach | Fix confusing double negation with empty else if | #16708 |
Full changelog [toc]
| author | title | link |
|---|---|---|
| @0xRozier | fix: allow passing null to optional positional params in built-in commands | #17753 |
| @Bahex | feat(std-rfc/xml xaccess): experimental rewrite of std/xml xaccess | #16804 |
| @Bahex | feat: make Span's Debug impl succinct | #17782 |
| @Bahex | feat: test_record! macro for convenience | #17797 |
| @Bahex | fix(test_record!): specify $crate::record! | #17848 |
| @Bahex | http commands' output metadata properly includes content-type | #17899 |
| @Benjas333 | Add frameless table theme | #17993 |
| @Bortlesboat | Fix confusing type mismatch error in bytes collect | #17746 |
| @ChrisDenton | Prefer PWD over current_dir if they're the same directory | #17720 |
| @ChrisDenton | Fix: Tests should not end cwd with a / | #17721 |
| @CloveSVG | fix(parser): improve alias expression error message to use user-friendly descriptions | #17751 |
| @Dexterity104 | fix(parse): support char lbrace before trailing capture | #17962 |
| @Juhan280 | feat: add str escape-regex | #17703 |
| @Juhan280 | Add metadata_ref and metadata_mut methods to PipelineData | #17706 |
| @Juhan280 | refactor!: remove deprecated commands and flags | #17731 |
| @Juhan280 | feat: add ToStart/ToEnd reedline events | #17747 |
| @Juhan280 | refactor: move the display logic for ReedlineEvent and EditCommand to nushell | #17749 |
| @Juhan280 | update reedline to commit 5c2f105 | #17785 |
| @Juhan280 | Update the names in keybindings list | #17859 |
| @Juhan280 | nu-protocol: add take_metadata and with_path_columns | #17862 |
| @Juhan280 | Update metadata handling for get command | #17866 |
| @Juhan280 | Update metadata handling for skip and reject command | #17867 |
| @Juhan280 | Deprecate PipelineData::metadata() | #17891 |
| @Juhan280 | build: fix cross compilation to/from windows | #17894 |
| @Juhan280 | Preserve pipeline metadata if detect type cannot determine the input | #17906 |
| @Juhan280 | nu-protocol: Implement DerefMut for PipelineExecutionData | #17909 |
| @Juhan280 | doc: fix cargo doc warnings | #17910 |
| @Juhan280 | fix: preserve metadata when rendering Custom value in table command | #17911 |
| @Juhan280 | Allow --content-type to accept null in metadata set | #17944 |
| @Juhan280 | fix(nu-command/reject): make reject command forward error value properly | #17961 |
| @Juhan280 | refactor(nu-command): update tests for reject command | #17968 |
| @Juhan280 | Add rustfmt.toml | #17995 |
| @Moayad717 | Fix rm symlink trailing slash | #17847 |
| @Rohan5commit | docs: fix devdocs wording | #17818 |
| @Rohan5commit | docs: fix typo in completer comment | #17904 |
| @Rohan5commit | docs: fix typo in flags section comment | #17915 |
| @Tyarel8 | feat(input list): add ctrl+p/n to go up/down | #17707 |
| @WindSoilder | pipefail: avoid try outputs value when catch exists, avoid finally runs twice, avoid finally funs before try finish. | #17764 |
| @WookiesRpeople2 | chore: Update to noun output to be more compact when --indent n is used | #17928 |
| @amaanq | cli: add hide-env autocompletion | #17658 |
| @andrewgazelka | docs(mcp): document automatic JSON parsing for HTTP commands | #17158 |
| @andrewgazelka | feat(mcp): auto-promote long-running evaluations to background jobs | #17861 |
| @andrewgazelka | fix(nu-mcp): deliver full output for promoted background jobs | #17989 |
| @andrewgazelka | Improve model guidance | #17996 |
| @app/ | Add cross-shell search terms to 16 commands (bash/CMD/PowerShell) | #17844 |
| @app/dependabot | build(deps): bump calamine from 0.32.0 to 0.33.0 | #17647 |
| @app/dependabot | build(deps): bump actions/upload-artifact from 6 to 7 | #17710 |
| @app/dependabot | build(deps): bump crate-ci/typos from 1.43.5 to 1.44.0 | #17711 |
| @app/dependabot | build(deps): bump interprocess from 2.3.1 to 2.4.0 | #17713 |
| @app/dependabot | build(deps): bump quickcheck_macros from 1.1.0 to 1.2.0 | #17771 |
| @app/dependabot | build(deps): bump calamine from 0.33.0 to 0.34.0 | #17772 |
| @app/dependabot | build(deps): bump sqlparser from 0.60.0 to 0.61.0 | #17774 |
| @app/dependabot | build(deps): bump scraper from 0.25.0 to 0.26.0 | #17830 |
| @app/dependabot | build(deps): bump winreg from 0.55.0 to 0.56.0 | #17831 |
| @app/dependabot | build(deps): bump ureq from 3.2.0 to 3.3.0 | #17879 |
| @app/dependabot | build(deps): bump toml from 1.0.6+spec-1.1.0 to 1.0.7+spec-1.1.0 | #17883 |
| @app/dependabot | build(deps): bump uuid from 1.22.0 to 1.23.0 | #17946 |
| @app/dependabot | build(deps): bump unicode-segmentation from 1.12.0 to 1.13.2 | #17949 |
| @app/dependabot | build(deps): bump crate-ci/typos from 1.44.0 to 1.45.0 | #17997 |
| @app/dependabot | build(deps): bump tokio from 1.50.0 to 1.51.0 | #17998 |
| @app/dependabot | build(deps): bump similar from 2.7.0 to 3.0.0 | #17999 |
| @app/dependabot | build(deps): bump tempfile from 3.25.0 to 3.27.0 | #18000 |
| @ayax79 | Polars upgrade | #17641 |
| @ayax79 | Polars: added polars selector ends-with | #17722 |
| @ayax79 | Polars: Implement selector commands for numeric types | #17723 |
| @blackhat-hemsworth | Add a check to avoid duplicate histogram output column names | #17783 |
| @blindFS | feat!(parser): type inference following cell paths | #17673 |
| @blindFS | fix(parser): record keys parsed as strings | #17684 |
| @blindFS | fix!: respect reorder-cell-paths option in assignments | #17696 |
| @blindFS | refactor!(parser): move reserved variable name checking near is_variable and add_variable | #17741 |
| @blindFS | fix(parser): string interpolation with unclosed ) | #17851 |
| @blindFS | fix(parser): do not check for reserved variable names in external signature | #17903 |
| @blindFS | fix(parser): an edge case of parse_unit_value | #17923 |
| @blindFS | revert: allow default values in external signatures | #17974 |
| @cmtm | Add process_group_id and session_id to ps -l output | #16357 |
| @coravacav | fix(input listen): calculate timeout using elapsed start time rather than subtraction | #17744 |
| @cosineblast | Reword job tag to job describe | #17496 |
| @cptpiepmatz | Kitest-based Test Harness | #17628 |
| @cptpiepmatz | Bump patch after release | #17682 |
| @cptpiepmatz | Update winresource versions | #17702 |
| @cptpiepmatz | Bump kitest & remove RefUnwindSafe from experimental option markers | #17716 |
| @cptpiepmatz | Add in-process testing with nu_test_support::test() | #17733 |
| @cptpiepmatz | refactor(nu-command/tests): moved some tests around and applied some more nu_test_support::test | #17740 |
| @cptpiepmatz | Bump aws related crates | #17742 |
| @cptpiepmatz | refactor(nu-command/tests): update more tests and use assert_contains() | #17745 |
| @cptpiepmatz | refactor: use std::panic::Location instead of custom Location type | #17748 |
| @cptpiepmatz | refactor(testing): Added TestResult::expect_value_eq and provide more comprehensive errors for test() | #17750 |
| @cptpiepmatz | Bump some packages to handle security issues | #17765 |
| @cptpiepmatz | refactor(nu-command): Merge To/FromYaml and To/FromYml into one struct | #17766 |
| @cptpiepmatz | refactor(nu-command/testing): Refactored most nested command integraiont tests in nu-command | #17767 |
| @cptpiepmatz | Fix http not respecting proxy environment variables like ALL_PROXY | #17794 |
| @cptpiepmatz | Refactor usages of test_examples with a centralized example testing code (except plugins) | #17801 |
| @cptpiepmatz | Enable env_shlvl_in_repl and env_shlvl_in_exec_repl tests | #17803 |
| @cptpiepmatz | Give http get command tests with socks proxy more time to execute | #17804 |
| @cptpiepmatz | Warn on clippy::push_format_string | #17805 |
| @cptpiepmatz | Bump toml crate to 1.0 | #17813 |
| @cptpiepmatz | refactor(nu-command/tests): Refactored more command integration tests | #17820 |
| @cptpiepmatz | Warn on clippy::needless_raw_strings | #17822 |
| @cptpiepmatz | Fix clippy issues | #17825 |
| @cptpiepmatz | Apply security updates | #17852 |
| @cptpiepmatz | refactor(nu-command/testing): refactor more command integration tests | #17858 |
| @cptpiepmatz | refactor(nu-protocol): Replace ShellError::GenericError with ShellError::Generic(GenericError) | #17864 |
| @cptpiepmatz | Add GenericError::new_internal_with_location | #17868 |
| @cptpiepmatz | Allow showing an error source for generic errors | #17869 |
| @cptpiepmatz | Add From conversions for ErrorSite | #17870 |
| @cptpiepmatz | Apply #[doc(no_inline)] to prelude modules | #17873 |
| @cptpiepmatz | Only update PR labels on opened or ready PRs | #17874 |
| @cptpiepmatz | Restructure nu-test-support crate and add lots of docs | #17900 |
| @cptpiepmatz | Add test_cell_path!() macro | #17927 |
| @cptpiepmatz | Bump rand and related to 0.10 | #17929 |
| @cptpiepmatz | Streamline CI Cargo Checks | #17954 |
| @cptpiepmatz | Move conversion between nu_json::Value and nu_protocol::Value into nu-json | #17980 |
| @cptpiepmatz | Let random choice behave like first | #17983 |
| @cptpiepmatz | Mark CustomValue::is_iterable as deprecated | #18003 |
| @dxrcy | feat: add config.auto_cd_always option | #17651 |
| @fdncred | fix type widening for describe | #17575 |
| @fdncred | Add support for list-of-records serialization in to nuon command | #17660 |
| @fdncred | allow esc on :nu when having null response | #17661 |
| @fdncred | update the sqlite history timestamp and duration with nushell values | #17680 |
| @fdncred | fix one-off up/down arrow wrapping bug | #17691 |
| @fdncred | remove bad which test, create better one | #17692 |
| @fdncred | revert 17606 make plugin handling more robust on startup | #17699 |
| @fdncred | fix the off-by-1 jump scrolling in explore when searching | #17718 |
| @fdncred | fix duplicate custom commands from showing up | #17727 |
| @fdncred | Add testbin "bins" to nushell help | #17728 |
| @fdncred | fix re-add support for custom log file path and validation in CLI | #17732 |
| @fdncred | chore: update Rust version to 1.92.0 and fix clippy warnings in configuration | #17734 |
| @fdncred | Fix select pushdown column aliasing | #17737 |
| @fdncred | feat(query_web): add 'document' flag to parse HTML as a full document | #17759 |
| @fdncred | chore(deps): update dependencies and improve compatibility | #17779 |
| @fdncred | feat(duration): add support for parsing hh:mm:ss formatted strings in into duration | #17781 |
| @fdncred | docs: update command docs to include command type | #17800 |
| @fdncred | Swap order of user and default library directories, ensure $NU_LIB_DIRS is const | #17819 |
| @fdncred | feat: enhance script argument parsing to handle newlines and whitespace correctly | #17826 |
| @fdncred | Upgrade glob to use the latest wax crate version 0.7.0 | #17835 |
| @fdncred | upgrade rmcp to version 1.2.0 | #17836 |
| @fdncred | fix(datetime): enhance timezone and offset handling in datetime parsing | #17855 |
| @fdncred | allow par-each to stream except with --keep-order via mspc | #17884 |
| @fdncred | Refactor error handling for directory removal in rm command | #17895 |
| @fdncred | Update IDE help text to specify cursor position and file context | #17905 |
| @fdncred | Update rmcp to version 1.3.0 and adjust session manager configuration | #17912 |
| @fdncred | feat: add from md command to convert markdown text into structured data | #17937 |
| @fdncred | fix: enhance MCP mode handling and output behavior across commands | #17945 |
| @fdncred | Revert "detect lexer-stage errors at highlighting" | #17955 |
| @fdncred | add a new sigil % for built-ins like ^ is a sigil for externals | #17956 |
| @fdncred | feat(input): make input list streamable | #17966 |
| @fdncred | refactor(parser): consolidate span adjustment for external calls | #17978 |
| @fdncred | fix(help): enhance help command to prefer built-in help over aliases | #17979 |
| @fdncred | refactor some commands and add tests | #17988 |
| @fdncred | deps: bump uu_* packages to 0.8.0 | #17994 |
| @galuszkak | use strict comparison for float sorting to avoid panics - fixes #16750 | #17930 |
| @guluo2016 | Add option to save leading-space commands to history.txt | #17350 |
| @hustcer | Exclude nu-test-support for loongarch64 to avoid build error of release script | #17821 |
| @hustcer | Fix parser scope leak in where $cond | #17976 |
| @hustcer | Fix input list when stdin is redirected in Unix TTY environments | #17987 |
| @ian-h-chamberlain | Customize binary hex styles with color_config | #17887 |
| @kiannidev | Add full and allow-errors flags to http head | #17650 |
| @kx0101 | feat: add support for custom history file path in config | #17425 |
| @musicinmybrain | Update lscolors from 0.20 to 0.21 | #17832 |
| @niklasmarderx | fix(http): handle x- vendor prefix in Content-Type for automatic parsing | #17967 |
| @pickx | fix: reject format strings with tokens after ending quote | #17777 |
| @pickx | feat: group-by flag to delete column after grouping by it | #17787 |
| @pickx | detect lexer-stage errors at highlighting | #17917 |
| @preiter93 | refactor(nu-explore): bump edtui to 0.11.2 and remove workarounds | #17752 |
| @rayzeller | Replace Span::unknown() with real spans in which_.rs | #17842 |
| @rayzeller | Replace Span::unknown() with real spans in plugin crates | #17871 |
| @rayzeller | Replace Span::unknown() with real spans in nu-command filters and strings | #17872 |
| @rayzeller | Replace Span::unknown() with real spans in nu-cli and main | #17876 |
| @rayzeller | Replace Span::unknown() with real spans in nu-protocol and nu-mcp | #17877 |
| @rayzeller | Replace Span::unknown() with real spans in remaining nu-command files | #17888 |
| @rayzeller | Replace Span::unknown() with Span::test_data() in test code | #17893 |
| @rayzeller | Replace Span::unknown() with real spans in nu-engine | #17938 |
| @rayzeller | Replace Span::unknown() with real spans in nu_plugin_polars | #17939 |
| @rbran | fix tee truncating input for inner closure if output is ignored | #17793 |
| @seroperson | fix: allow default argument to have the same name as parameter | #17697 |
| @seroperson | fix: block captures redundant variables | #17726 |
| @sholderbach | Fix confusing double negation with empty else if | #16708 |
| @smartcoder0777 | feat(url): add --base support to url parse | #17833 |
| @smartcoder0777 | fix(group-by): correct grouping for lists/records | #17837 |
| @smartcoder0777 | fix http head http options missing full and allow error | #17841 |
| @smartcoder0777 | Preserve pipeline metadata in first and last for list/range streams | #17875 |
| @smartcoder0777 | Fix known external name lookup under alias shadowing | #17878 |
| @smartcoder0777 | Fix parsing of braced-value optional cell paths | #17897 |
| @smartcoder0777 | Fix experimental-options consuming script path | #17943 |
| @stuartcarnie | feat(repl): add configurable external hinter closure | #17566 |
| @tauanbinato | Fix hash md5 and hash sha256 output type signatures | #17811 |
| @weirdan | ansi completions | #17761 |
| @weirdan | char completions | #17762 |
| @weirdan | reject: preserve metadata | #17775 |
| @weirdan | Completions for into binary --endian | #17788 |
| @xtqqczze | fix: update Cargo.toml files to use workspace edition and rust-version | #17931 |
| @xtqqczze | fix: failed to parse manifest error | #17950 |
| @xtqqczze | deps: update git2 minimum to 0.20.4 | #17984 |
| @ymcx | Drop mode preservation in order to fix copying of read-only directories | #17791 |
| @ysthakur | Bump reedline to latest main | #17834 |
| @zhiburt | nu-table: Change width estimation in case of header_on_border | #17812 |