Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .vuepress/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import BlogPosts from './components/BlogPosts.vue';
import ExperimentalOption from './components/ExperimentalOption.vue';
import JumpToc from './components/JumpToc.vue';
import PrBy from './components/PrBy.vue';
import PrOther from './components/PrOther.vue';
import ReleaseToc from './components/ReleaseToc.vue';
import URLDocSearch from './components/URLDocSearch.vue';

Expand All @@ -20,6 +21,7 @@ export default defineClientConfig({
app.component('ExperimentalOption', ExperimentalOption);
app.component('JumpToc', JumpToc);
app.component('PrBy', PrBy);
app.component('PrOther', PrOther);
app.component('ReleaseToc', ReleaseToc);

// Override the builtin searchbox
Expand Down
15 changes: 15 additions & 0 deletions .vuepress/components/PrOther.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<template>
(<a :href="prLink" target="_blank">#{{ pr }}</a
>)
</template>

<script setup lang="ts">
const props = defineProps({
pr: {
type: Number,
required: true,
},
});

const prLink = 'https://github.com/nushell/nushell/pull/' + props.pr;
</script>
271 changes: 271 additions & 0 deletions blog/2026-07-11-nushell_v0_114_1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,271 @@
---
title: Nushell 0.114.1
author: The Nu Authors
author_site: https://www.nushell.sh/blog
author_image: https://www.nushell.sh/blog/images/nu_logo.png
excerpt: Today, we're releasing version 0.114.1 of Nu. This patch release fixes issues found after `enforce-runtime-annotations` became opt-out in the last version, improving runtime type checks and error reporting.
---

<!-- TODO: complete the excerpt above -->

<!-- NOTE: start from the TODO all the way at the bottom (and sort of work your way up) -->

# Nushell 0.114.1

Today, we're releasing version 0.114.1 of Nu. This patch release fixes issues found after `enforce-runtime-annotations` became opt-out in the last version, improving runtime type checks and error reporting.

# Where to get it

Nu 0.114.1 is available as [pre-built binaries](https://github.com/nushell/nushell/releases/tag/0.114.1) 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

<ReleaseToc/>

# Highlights and themes of this release <JumpToc/>

<!-- NOTE: if you wanna write a section about a breaking change, when it's a very important one,
please add the following snippet to have a "warning" banner :)
> see [an example](https://www.nushell.sh/blog/2023-09-19-nushell_0_85_0.html#pythonesque-operators-removal)

```md
::: warning Breaking change
See a full overview of the [breaking changes](#breaking-changes)
:::
```
-->
<!-- NOTE: see https://vuepress.github.io/reference/default-theme/markdown.html#custom-containers
for the list of available *containers*
-->

## Follow-up fixes for runtime annotation checks <JumpToc/>

In [Nushell 0.114.0](/blog/2026-07-04-nushell_v0_114_0.html), we promoted [`enforce-runtime-annotations`](https://github.com/nushell/nushell/issues/16832) from an opt-in experimental option to an opt-out experimental option. That is the usual path for experimental options: more people try them, we get better feedback, and the feature gets closer to being stable.

As expected, that wider testing found some rough edges. Some came from invalid signatures, some from type checks that were too strict, and some from checks that were simply not accurate enough. We are tracking those reports in [issue #18528](https://github.com/nushell/nushell/issues/18528), and this patch release fixes a number of them, mostly thanks to [@Bahex](https://github.com/Bahex). Thank you!

More issues may still turn up. Please report them if you run into anything suspicious. If `enforce-runtime-annotations` blocks your workflow, you can disable just that option before Nushell starts:

```nushell
NU_EXPERIMENTAL_OPTIONS=enforce-runtime-annotations=false nu
```

Or pass it as a command-line flag:

```nushell
nu --experimental-options enforce-runtime-annotations=false
```

See the [`nu-experimental` user documentation](https://docs.rs/nu-experimental/latest/nu_experimental/#for-users) for more details.

We still encourage everyone to keep as many experimental options enabled as possible. It helps us find bugs earlier and make Nushell better for future releases.

# Changes <JumpToc/>

## Bug fixes <JumpToc/>

### More helpful errors for failed assignments with `enforce-runtime-annotations` <JumpToc/> <PrBy :pr="18531" user="Bahex" />

With `enforce-runtime-annotations` enabled, assignments with incorrect types raise errors.

Previously this error was `nu::shell::cant_convert` originally used for unsuccessful type coercions of command arguments. Unfortunately, this error only pointed at the assigned values _origin_ and not at the failed assignment.

This error has been switched to `nu::shell::type_mismatch` and now points to the failed assignment in addition to the value's origin.

##### Example 1

<table>
<tr>
<td>Code</td>
<td width="1000">

```nushell :line-numbers
mut execution_time = -1
$execution_time = $env.CMD_DURATION_MS
```

</td>
</tr>

<tr>
<td>Before</td>
<td>

```ansi :no-line-numbers
Error: nu::shell::cant_convert

× Can't convert to int.
╭─[Host Environment Variables:1:1]
1 │ "ALLUSERSPROFILE"="C:\\ProgramData"
· ▲
· ╰── can't convert string to int
2 │ "ANDROID_AVD_HOME"="B:\\AndroidAVDs"
╰────

```

</td>
</tr>

<tr>
<td>After</td>
<td>

```ansi :no-line-numbers
Error: nu::shell::type_mismatch

× Type mismatch.
╭─[repl_entry #3:1:17]
1 │ $execution_time = $env.CMD_DURATION_MS
·  ┬
· ╰── expected int, got string
╰────

```

</td>
</tr>
</table>

##### Example 2

<table>
<tr>
<td>Code</td>
<td width="1000">

```nushell :line-numbers
# delibarete type erasure
# we need to bypass parse-time
# type checking for this example
let stuff: any = {
foo: "bar"
}

mut x = 1

$x = $stuff.foo
```

</td>
</tr>

<tr>
<td>Before</td>
<td>

```ansi :no-line-numbers
Error: nu::shell::cant_convert

× Can't convert to int.
╭─[repl_entry #5:1:24]
1 │ let stuff: any = {foo: "bar"}
·  ──┬──
· ╰── can't convert string to int
╰────

```

</td>
</tr>

<tr>
<td>After</td>
<td>

```ansi :no-line-numbers
Error: nu::shell::type_mismatch

× Type mismatch.
╭─[repl_entry #5:1:24]
1 │ let stuff: any = {foo: "bar"}
·  ──┬──
· ╰── the value is a string
╰────
╭─[repl_entry #7:1:4]
1 │ $x = $stuff.foo
·  ┬
· ╰── expected int, got string
╰────

```

</td>
</tr>
</table>

### Closure's input type is not inherited from the surrounding scope <JumpToc/> <PrBy :pr="18540" user="Bahex" />

With last release, pipeline input type and how it affects various expressions are being tracked in a lot more cases.

In fact, at least one too many:

```nushell
def mk-add-suffix [suffix: string]: nothing -> closure {
{|| $in ++ $suffix }
}
```

```ansi :no-line-numbers
Error: nu::parser::operator_unsupported_type

× The '++' operator does not work on values of type 'nothing'.
╭─[repl_entry #8:2:5]
1 │ def mk-add-suffix [suffix: string]: nothing -> closure {
2 │ {|| $in ++ $suffix }}
·  ─┬─ ─┬
· │ ╰── does not support 'nothing'
· ╰── nothing
╰────
```

This is now fixed, and closures' input type will be inferred as `any`, the way it was before `0.114.0`.

### Add list input type to more date commands <JumpToc/> <PrBy :pr="18536" user="fdncred" />

Allow more `date` commands to have a list as `input -> output`. These are the commands that were updated:

- `date humanize`
- `date from-human`
- `date to-timezone`
- `format date`
- `into datetime`

### Other fixes <JumpToc/>

- Fixed `input listen`'s output type signature to match actual returned value. With the incorrect signature (and `enforce-runtime-annotations` on) `let x = input listen` would raise an error due to `$x`'s inferred type (based on `input listen`'s signature) not matching the value assigned to it. <PrOther :pr="18535" />
- Type checking treats `table` and `list<record>` as compatible (provided the columns aren't disjoint), but that did not extend to `list<oneof<record, ...>>`. This has been fixed. <PrOther :pr="18560" />
- Runtime type checking of _non-stream_ pipeline data is now more accurate. <PrOther :pr="18560" />
- Fixed `uname`'s output type signature to match its actual output. Previously it was `table`, now it's `record<...>` and also includes its columns. <PrOther :pr="18568" />
- Fixed an issue where `run script.nu --some-flag` could bind the value to the wrong flag of the script's `main` when `main` declared multiple flags, causing shifted positional arguments or a value being accepted into a flag of the wrong type. Flags passed to `run` are now matched to `main` parameters by name. ([#18533](https://github.com/nushell/nushell/pull/18533))
- Fixed an incorrect `idx search --help` example. ([#18550](https://github.com/nushell/nushell/pull/18550))
- Type checking of lists are relaxed. ([#18555](https://github.com/nushell/nushell/pull/18555))
- Fixed an issue in `for` loops where type of the looping variable was inferred incorrectly when iterating over a value/stream with a union type (`oneof<list, table, binary>`). This could manifest as a runtime type checking error with `enforce-runtime-annotations` enabled. ([#18551](https://github.com/nushell/nushell/pull/18551))

# Hall of fame <JumpToc/>

Thanks to all the contributors below for helping us solve issues, improve documentation, refactor code, and more! :pray:

| author | change | link |
| ---------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------- |
| [@cptpiepmatz](https://github.com/cptpiepmatz) | `cargo update` crossbeam crates | [#18554](https://github.com/nushell/nushell/pull/18554) |
| [@Juhan280](https://github.com/Juhan280) | Initialize `start_time` for MCP only in MCP mode to avoid cargo warning | [#18530](https://github.com/nushell/nushell/pull/18530) |

# Full changelog <JumpToc/>

| author | title | link |
| ---------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------- |
| [@Alb-O](https://github.com/Alb-O) | fix(idx): correct search context help example | [#18550](https://github.com/nushell/nushell/pull/18550) |
| [@Alb-O](https://github.com/Alb-O) | fix(parser): infer for loop items from iterable unions | [#18551](https://github.com/nushell/nushell/pull/18551) |
| [@Bahex](https://github.com/Bahex) | fix: assignment errors point to the assignment | [#18531](https://github.com/nushell/nushell/pull/18531) |
| [@Bahex](https://github.com/Bahex) | fix: `input listen`'s output type | [#18535](https://github.com/nushell/nushell/pull/18535) |
| [@Bahex](https://github.com/Bahex) | fix: closure's input type shouldn't be inherited from scope | [#18540](https://github.com/nushell/nushell/pull/18540) |
| [@Bahex](https://github.com/Bahex) | fix: relax assignability of list types | [#18555](https://github.com/nushell/nushell/pull/18555) |
| [@Bahex](https://github.com/Bahex) | fix type comparisons between `table` and `list&lt;oneof&gt;` | [#18560](https://github.com/nushell/nushell/pull/18560) |
| [@Bahex](https://github.com/Bahex) | fix: `uname` signature, and add detailed column info | [#18568](https://github.com/nushell/nushell/pull/18568) |
| [@Juhan280](https://github.com/Juhan280) | fix(mcp): initialize `start_time` for MCP only in MCP mode to avoid cargo warning | [#18530](https://github.com/nushell/nushell/pull/18530) |
| [@cptpiepmatz](https://github.com/cptpiepmatz) | `cargo update` crossbeam crates | [#18554](https://github.com/nushell/nushell/pull/18554) |
| [@fdncred](https://github.com/fdncred) | add list input type to more date commands | [#18536](https://github.com/nushell/nushell/pull/18536) |
| [@hexbinoct](https://github.com/hexbinoct) | Fix `run` binding forwarded flags to the wrong parameter | [#18533](https://github.com/nushell/nushell/pull/18533) |