# Nushell 0.108.0 Complete Breaking Changes and Features Documentation

**Release Date:** 2025-10-15
**Version:** 0.108.0
**Previous Version:** 0.107.x

## Table of Contents

1. [Breaking Changes](#breaking-changes)
2. [New Features](#new-features)
3. [Experimental Features](#experimental-features)
4. [Plugin API Changes](#plugin-api-changes)
5. [Command Changes](#command-changes)
6. [Behavior Changes](#behavior-changes)
7. [Build System Changes](#build-system-changes)
8. [Bug Fixes](#bug-fixes)
9. [Migration Guide](#migration-guide)
10. [Recommendations for Best Practices](#recommendations-for-best-practices)

---

## Breaking Changes

### 1. Command Rename: `into value` → `detect type`

**Category:** command_rename
**Impact:** HIGH
**Old:** `into value`
**New:** `detect type` (for type detection) and `into value` (for custom value conversion)

**Description:**
Until version 0.107, `into value` tried to detect the types of table cells by converting strings into typed values. This command is now called `detect type`, but it doesn't operate on cells anymore.

**Migration Guide:**
```nushell
# OLD (0.107)
$data | into value

# NEW (0.108.0) - for type detection on cells
$data | update cells {detect type}

# NEW (0.108.0) - for type detection on non-table types
$value | detect type

# NEW (0.108.0) - for converting custom plugin values to native values
$custom_value | into value
```

**Additional Notes:**
- `detect type` can now be used on non-table types to try to infer the types
- The `into value` name is now used for converting custom values from plugins into native Nushell values

---

### 2. Stream Error Collection Behavior

**Category:** behavior_change
**Impact:** HIGH
**Old:** Collecting a stream with errors would silently include or hide errors
**New:** Collecting a stream that contains errors now raises an error itself

**Description:**
Implemented by @Bahex to fix an issue where some errors hiding inside other commands weren't showing up quite right. This makes error handling more explicit and prevents silent failures.

**Migration Guide:**
```nushell
# If you were relying on error suppression in stream collection, you now need to:

# Option 1: Use try-catch to handle errors explicitly
try {
    $stream | collect
} catch {
    # Handle error
}

# Option 2: Use error handling flags where available
$stream | collect --ignore-errors  # If supported by command
```

**Impact:**
- Code that was silently ignoring errors in streams will now fail explicitly
- Better error visibility but may break existing scripts that relied on silent error handling

---

### 3. `format bits` Endian Behavior

**Category:** behavior_change
**Impact:** MEDIUM
**Old:** `format bits` used native endian (before 0.107), then changed to big endian in 0.107
**New:** Explicit `--endian` flag to choose behavior

**Description:**
`format bits` used to output in native endian until Nu 0.107.0 changed it to big endian. Now, you can choose the behavior with `--endian`.

**Migration Guide:**
```nushell
# To get original behavior (before Nu 0.107.0):
format bits --endian native

# To use big endian (0.107.0 default):
format bits --endian big

# Or explicitly:
format bits --endian little
```

---

### 4. Polars Plugin Changes

**Category:** api_change
**Impact:** MEDIUM
**Old:** `polars fetch` command available, `polars pivot` stable by default
**New:** `polars fetch` removed, `polars pivot` requires `--stable` flag

**Description:**
- `polars fetch` has been removed due to no longer being supported on LazyFrame
- `polars pivot` will no longer perform a stable pivot by default

**Migration Guide:**
```nushell
# polars fetch - REMOVED
# OLD (0.107):
$data | polars fetch

# NEW (0.108.0):
# No direct replacement - functionality removed due to upstream Polars changes
# Alternative approaches depend on your use case

# polars pivot - requires --stable flag
# OLD (0.107):
$data | polars pivot  # Was stable by default

# NEW (0.108.0):
$data | polars pivot --stable  # Must explicitly request stable pivot
```

---

### 5. Windows Path Handling

**Category:** behavior_change
**Impact:** LOW (Windows-only)
**Platform:** Windows
**Old:** UNC and device paths got trailing `\` appended, device paths didn't work with `open`, `save`, `source`
**New:** No trailing backslashes, full device path support

**Description:**
On Windows, UNC and device paths no longer get a trailing `\` appended when being cast to path, and `open`, `save`, and `source` now work with device paths like `\\.\NUL` or `\\.\CON`, as well as reserved device names like `NUL` and `CON`.

**Migration Guide:**
```nushell
# Windows device paths now work correctly:
open \\.\NUL    # Now works
source \\.\CON  # Now works
save \\.\NUL    # Now works

# Reserved device names work:
open NUL        # Now works
open CON        # Now works

# UNC paths no longer get trailing backslash:
# OLD: \\server\share\
# NEW: \\server\share
```

**Note:** Using full device paths is recommended for clarity.

---

### 6. Network Commands Feature Flag

**Category:** build_change
**Impact:** LOW (affects custom builds only)
**Old:** Network commands included by default
**New:** Must explicitly enable with `--features network` when building without defaults

**Description:**
Nushell can now be compiled without network-related commands. If building manually without default features, you must pass `--features network` to get access to network commands.

**Migration Guide:**
```bash
# OLD (0.107):
cargo build --no-default-features

# NEW (0.108.0):
cargo build --no-default-features --features network
```

**Affected Commands:**
- `http get`, `http post`, `http delete`, etc.
- Other network-related commands

---

### 7. Power Operator Associativity Fix

**Category:** behavior_change
**Impact:** LOW
**Old:** `**` operator parsed left-to-right (incorrect)
**New:** `**` operator parses right-to-left (mathematically correct)

**Description:**
The `**` (power) operator now parses as right-associative instead of left-associative, matching standard mathematical behavior.

**Migration Guide:**
```nushell
# Expression: 2.0 ** 3.0 ** 4.0

# OLD (0.107) - left-associative (WRONG):
# (2.0 ** 3.0) ** 4.0 = 8.0 ** 4.0 = 4096

# NEW (0.108.0) - right-associative (CORRECT):
# 2.0 ** (3.0 ** 4.0) = 2.0 ** 81.0 = 2.4178516392292583e+24

# If you were relying on the old (incorrect) behavior, use explicit parentheses:
(2.0 ** 3.0) ** 4.0
```

---

## New Features

### 1. MCP Server for AI Agents

**Category:** Optional Feature (Compilation Flag)
**Added by:** @ayax79
**Status:** Experimental

**Description:**
Adds an MCP (Model Context Protocol) server for Nushell, allowing AI agents to run Nushell commands.

**How to Enable:**
```bash
# Compile Nushell with MCP feature (not included by default):
cargo build --features mcp
```

**Usage:**
When compiled with the "mcp" feature, the nushell binary can be used as a local (stdio) MCP server, allowing a local AI agent to use MCP to execute native nushell commands and external commands.

**Capabilities:**
- Execute native Nushell commands via MCP
- Execute external commands via MCP
- Secure command execution for AI agents

**Community:**
Join the discussion on Discord in #ai-with-nu channel.

---

### 2. Smarter Completions with Per-Command Completers

**Category:** Enhancement
**Impact:** User Experience Improvement

**Description:**
New, simpler way to define completions for command parameters with inline completion lists.

**Features:**

#### Inline Completion Lists
```nushell
# Define completions inline:
def go [direction: string@[left up right down]] {
    $direction
}

# Use const variables for reusable completions:
const directions = [left up right down]
def go [direction: string@$directions] {
    $direction
}
```

#### Built-in Command Suggestions
Built-in commands that expect a specific set of values now suggest these values automatically.

#### File Completions for Redirections
File completions have been added for command redirections (`o>>`, `e>`, etc.)

#### Directory-Only Completions
For commands expecting directory arguments, regular files will no longer be suggested as completions when no directory can be suggested.

---

### 3. Enhanced CustomValue Support

**Category:** Plugin API Enhancement
**Added by:** @cptpiepmatz
**Impact:** Plugin Developers

**Description:**
CustomValues let plugin authors introduce their own data types without being limited to Nushell's built-in Values. They now behave much closer to regular Values.

**New Capabilities:**

#### Error Propagation Syntax Support
```nushell
# Both syntaxes now work with CustomValues:
$custom_value?  # Old syntax (try operator)
$custom_value!  # New syntax (unwrap operator, added in 0.105.0)
```

Plugin authors can now decide exactly how these should behave for their custom types.

#### Save Command Integration
```nushell
# CustomValues now work with save:
$custom_value | save output.dat
```

Plugin authors can define how their custom data should be saved, which is often more complex than for built-in types.

#### New `into value` Command
```nushell
# Convert custom plugin values to native Nushell values:
$custom_value | into value
```

---

### 4. `which` Command Enhancement

**Category:** Command Enhancement

**Description:**
The `which` command now lists all commands (internal and external) when no argument is passed to it.

**Usage:**
```nushell
# OLD (0.107):
which  # Would show help or error

# NEW (0.108.0):
which  # Lists ALL available commands (internal and external)

# Still works with specific command:
which ls
which cargo
```

---

### 5. Enhanced HTTP Commands

**Category:** Command Enhancement

**Description:**
All http commands now attach response data (previously only accessible with `http * --full`) as metadata to their output streams.

**Usage:**
```nushell
# Access response metadata without --full flag:
let response = http get https://api.example.com/data

# Metadata now automatically attached
$response | metadata
```

---

### 6. New Date/Time Format Specifiers

**Category:** Command Enhancement

**Description:**
The `format date` and `into datetime` commands now support two new format specifiers for creating compact, sortable date and time components.

**New Specifiers:**
- `%J` - Produces compact dates in YYYYMMDD format (e.g., 20250918)
- `%Q` - Produces compact times in HHMMSS format (e.g., 131144)

**Usage:**
```nushell
# Compact date format:
date now | format date "%J"  # Output: 20251015

# Compact time format:
date now | format date "%Q"  # Output: 143022

# Combined for sortable timestamp:
date now | format date "%J%Q"  # Output: 20251015143022
```

---

### 7. Metadata Set Merge

**Category:** Command Enhancement

**Description:**
New `--merge` flag for `metadata set` command to attach arbitrary metadata fields.

**Usage:**
```nushell
# Merge custom metadata:
$value | metadata set --merge { custom_field: "value", priority: 1 }
```

---

### 8. Each Flatten

**Category:** Command Enhancement

**Description:**
New `--flatten` flag for `each` command for better streaming behavior.

**Usage:**
```nushell
# Flatten nested results while streaming:
$data | each --flatten { |item|
    # Process and return potentially nested data
}
```

---

## Experimental Features

### 1. Pipefail

**Status:** Opt-in Experimental
**Added by:** @WindSoilder
**Tracking Issue:** #16760

**Description:**
When enabled, `$env.LAST_EXIT_CODE` will be set to the exit code of the rightmost command in a pipeline that exited with a non-zero status, or zero if all commands succeeded.

**How to Enable:**
```bash
# Command line:
nu --experimental-options='pipefail'

# Or in config:
$env.config.experimental = { pipefail: true }
```

**Behavior:**

**Before enabling pipefail:**
```nushell
^false | echo ''
$env.LAST_EXIT_CODE  # Returns 0 (incorrect)
```

**After enabling pipefail:**
```nushell
^false | echo ''
$env.LAST_EXIT_CODE  # Returns 1 (correct)
```

**Enhanced Error Reporting:**
When used together with `$env.config.display_errors.exit_code = true`, Nushell will also report which command failed.

**Use Cases:**
- Shell scripting requiring strict error checking
- CI/CD pipelines where any failure should be caught
- Bash-like pipeline error handling

---

### 2. Enforce Runtime Annotations

**Status:** Opt-in Experimental
**Added by:** @mkatychev

**Description:**
When enabled, Nushell catches errors at runtime when assigning values to type-annotated variables, providing stronger runtime type safety.

**How to Enable:**
```bash
# Command line:
nu --experimental-options='enforce-runtime-annotations'

# Or in config:
$env.config.experimental = { enforce-runtime-annotations: true }
```

**Behavior:**

**Without feature:**
```nushell
let x: int = "not a number"  # May pass parse time, fail silently at runtime
```

**With feature enabled:**
```nushell
let x: int = "not a number"  # Throws cant_convert error at runtime
```

**Why Experimental:**
This would be a breaking change for scripts where any coercion/conversions previously ignored field constraints for records and tables.

**Use Cases:**
- Stricter type safety in production scripts
- Catching type conversion errors early
- More predictable behavior for typed variables

---

### 3. Reorder Cell Paths (Now Enabled by Default)

**Status:** Opt-out (Previously opt-in, now default)
**Tracking Issue:** #16766

**Description:**
Promoted from opt-in to opt-out, so it's now enabled by default. Improves cell-path accesses by reordering how the cell-path should be evaluated without modifying the output.

**Performance:**
Improves performance by reordering how cell-paths are evaluated, making lookups faster.

**How to Disable (if needed):**
```bash
# Command line:
nu --experimental-options='reorder-cell-paths=false'

# Or in config:
$env.config.experimental = { reorder-cell-paths: false }
```

**Note:** Originally introduced in Nushell 0.106.0, now default in 0.108.0.

---

## Plugin API Changes

### 1. CustomValue API Enhancements

**Impact:** Plugin Developers
**Added by:** @cptpiepmatz

**Changes:**

#### Error Propagation Support
```rust
// Plugin authors can now implement both:
// - try operator (?)
// - unwrap operator (!)

impl CustomValue for MyCustomValue {
    fn follow_path_int(&self, ...) -> Result<Value, ShellError> {
        // Supports both $value? and $value! syntax
    }
}
```

#### Save Command Integration
```rust
impl CustomValue for MyCustomValue {
    fn to_base_value(&self, span: Span) -> Result<Value, ShellError> {
        // Define how custom value should be saved
        // This is called when using `save` command
    }
}
```

#### Into Value Support
```rust
// Custom values can now be converted to native values
// via the new `into value` command
impl CustomValue for MyCustomValue {
    fn to_base_value(&self, span: Span) -> Result<Value, ShellError> {
        // Return native Nushell value representation
    }
}
```

**Plugin Developer Notes:**
- CustomValues now support all major value operations
- Better integration with Nushell's type system
- More predictable behavior matching built-in types

---

### 2. Plugin Protocol Stability

**Status:** Stable
**Version:** 0.108.0

**Notes:**
No breaking changes to the plugin protocol in this release. Plugins compiled for 0.107.x should work with 0.108.0.

**Recommendation:**
While the protocol is stable, rebuilding plugins against 0.108.0 is recommended to take advantage of new CustomValue features.

---

## Command Changes

### Commands Renamed

| Old Name | New Name | Purpose |
|----------|----------|---------|
| `into value` | `detect type` | Type detection from strings |
| N/A | `into value` | Convert custom plugin values to native values |

### Commands Removed

| Command | Reason | Alternative |
|---------|--------|-------------|
| `polars fetch` | No longer supported on LazyFrame | Depends on use case - functionality removed upstream |

### Commands Added

| Command | Description | Category |
|---------|-------------|----------|
| `detect type` | Detect and convert string types to typed values | Type Conversion |
| `into value` (new purpose) | Convert custom plugin values to native Nushell values | Plugin Integration |

### Commands Modified

| Command | Change | Description |
|---------|--------|-------------|
| `format bits` | Added `--endian` flag | Choose endian behavior (native, big, little) |
| `polars pivot` | Added `--stable` flag | Must explicitly request stable pivot |
| `which` | No args lists all | Lists all commands when called without arguments |
| `http *` | Metadata attachment | Response data attached as metadata without `--full` |
| `format date` | New format specifiers | Added `%J` (compact date) and `%Q` (compact time) |
| `into datetime` | New format specifiers | Added `%J` (compact date) and `%Q` (compact time) |
| `metadata set` | Added `--merge` | Merge arbitrary metadata fields |
| `each` | Added `--flatten` | Better streaming behavior for nested data |
| `compact` | Improved `--empty` | Now recognizes 0 byte binary values as empty |
| `open` | Windows improvement | Now works with device paths (Windows only) |
| `save` | Windows improvement | Now works with device paths (Windows only) |
| `save` | CustomValue support | Now works with custom plugin values |
| `source` | Windows improvement | Now works with device paths (Windows only) |

---

## Behavior Changes

### 1. Error Handling in Try Blocks

**Description:**
Clean up error handlers when jumping outside of try blocks with break/continue.

**Impact:**
- Error handlers now properly clean up when using break/continue to exit try blocks
- Previously, error handlers would remain active after breaking out
- More predictable error handling behavior

**Example:**
```nushell
# Previously could cause issues:
for $item in $items {
    try {
        if $condition {
            break  # Now properly cleans up error handler
        }
    } catch {
        # This won't catch errors from outside the try block anymore
    }
}
```

---

### 2. Break/Continue Outside Loops

**Description:**
Using break/continue outside loops now raises a compile error.

**Impact:**
- Catches logical errors at compile time
- Previously may have caused runtime errors or unexpected behavior

**Example:**
```nushell
# This now produces a compile error:
break  # Error: break used outside of loop

# Must be inside a loop:
for $i in 1..10 {
    if $i == 5 { break }  # OK
}
```

---

### 3. Error Context Preservation

**Description:**
Errors inside `each` calls now keep their full context, making it easier to track down what went wrong.

**Impact:**
- Better error messages
- Easier debugging of pipeline errors
- Full stack traces preserved

**Example:**
```nushell
# Better error reporting:
[1 2 "three"] | each { |x| $x + 1 }
# Error now includes full context of which element failed
```

---

### 4. Improved Error Messages

**Description:**
Improved error message is thrown for invalid binary, hexadecimal, and octal strings.

**Impact:**
- Clearer error messages when parsing number literals fails
- Better guidance on correct syntax

**Example:**
```nushell
# Invalid binary:
0b102  # Better error message explaining invalid binary digit

# Invalid hex:
0xGGG  # Clearer error about invalid hex characters

# Invalid octal:
0o999  # Better error for invalid octal digit
```

---

## Build System Changes

### 1. Optional Network Commands

**Change:** Network commands now optional via feature flag
**Impact:** Custom builds can exclude network functionality
**Feature Flag:** `network`

**Usage:**
```bash
# Include network commands (default):
cargo build

# Exclude network commands:
cargo build --no-default-features

# Explicitly include network commands:
cargo build --no-default-features --features network
```

---

### 2. Optional MCP Server

**Change:** MCP server support via feature flag
**Impact:** Can build Nushell with MCP server for AI integration
**Feature Flag:** `mcp`

**Usage:**
```bash
# Include MCP server:
cargo build --features mcp

# Default build (no MCP):
cargo build
```

---

## Bug Fixes

### Critical Fixes

1. **Try block error handler cleanup**
   - Fixed: Error handlers not cleaning up when jumping out of try blocks with break/continue
   - Impact: More predictable error handling behavior

2. **Power operator associativity**
   - Fixed: `**` operator was left-associative (incorrect)
   - Impact: Mathematical expressions now compute correctly

3. **Stream error collection**
   - Fixed: Errors in streams weren't being properly reported
   - Impact: Errors are now explicitly raised when collecting streams with errors

### Platform-Specific Fixes

1. **Windows UNC and device paths**
   - Fixed: Trailing backslash on UNC paths
   - Fixed: Device paths (\\.\NUL, \\.\CON) now work with open, save, source
   - Impact: Better Windows compatibility

### Command-Specific Fixes

1. **compact --empty recognition**
   - Fixed: Now recognizes 0 byte binary values as empty
   - Impact: More consistent empty value handling

2. **Error context in each**
   - Fixed: Errors inside each calls now preserve full context
   - Impact: Easier debugging of pipeline errors

3. **Break/Continue compile-time checks**
   - Fixed: Using break/continue outside loops now caught at compile time
   - Impact: Better error detection during parsing

---

## Migration Guide

### High Priority Changes (Must Update)

#### 1. Replace `into value` with `detect type`

**Search for:**
```nushell
| into value
```

**Replace with:**
```nushell
| update cells {detect type}  # For table cell type detection
# OR
| detect type                  # For non-table type detection
```

**Automated migration:**
```nushell
# Find all uses of `into value`:
rg "into value" --type nu

# Review each case and update based on context
```

---

#### 2. Update stream error handling

**Before:**
```nushell
# Silently collected streams with errors
let results = $stream | collect
```

**After:**
```nushell
# Option 1: Handle errors explicitly
let results = try {
    $stream | collect
} catch {
    # Handle collection errors
    []
}

# Option 2: Filter out errors first (if appropriate)
let results = $stream
    | where ($it | describe) != "error"
    | collect
```

---

#### 3. Update `format bits` calls

**Before:**
```nushell
# Relied on default endian behavior
$value | format bits
```

**After:**
```nushell
# Explicitly specify endian if you need specific behavior:
$value | format bits --endian native  # Pre-0.107 behavior
$value | format bits --endian big     # 0.107 default
$value | format bits --endian little  # Little endian
```

---

### Medium Priority Changes (Should Update)

#### 1. Update `polars` commands

**Remove `polars fetch`:**
```nushell
# OLD:
$data | polars fetch

# NEW:
# No direct replacement - review your use case
# Alternative approaches depend on what you're trying to achieve
```

**Add `--stable` to `polars pivot`:**
```nushell
# OLD:
$data | polars pivot  # Was stable by default

# NEW:
$data | polars pivot --stable  # Must be explicit
```

---

#### 2. Update custom builds without defaults

**Before:**
```bash
cargo build --no-default-features
```

**After:**
```bash
# Include network commands:
cargo build --no-default-features --features network
```

---

#### 3. Review power operator usage

**Check chained power operations:**
```nushell
# This now evaluates differently:
2 ** 3 ** 4

# If you need the old behavior, use parentheses:
(2 ** 3) ** 4  # Explicit left-to-right evaluation
```

---

### Low Priority Changes (Nice to Have)

#### 1. Adopt inline completion syntax

**Old style:**
```nushell
def my-command [direction: string] {
    # Custom completer function elsewhere
}
```

**New style:**
```nushell
# Inline completions:
def my-command [direction: string@[left up right down]] {
    $direction
}

# Or with const:
const directions = [left up right down]
def my-command [direction: string@$directions] {
    $direction
}
```

---

#### 2. Use new date/time format specifiers

**New compact formats:**
```nushell
# Sortable date stamps:
date now | format date "%J"      # 20251015
date now | format date "%Q"      # 143022
date now | format date "%J%Q"    # 20251015143022
```

---

#### 3. Simplify HTTP metadata access

**Before:**
```nushell
# Had to use --full flag:
let response = http get $url --full
$response.headers
```

**After:**
```nushell
# Metadata automatically attached:
let response = http get $url
$response | metadata  # Includes headers and other response data
```

---

### Testing Your Migration

#### 1. Run your test suite
```bash
nu your_test_suite.nu
```

#### 2. Check for deprecated patterns
```nushell
# Search for problematic patterns:
rg "into value" . --type nu
rg "polars fetch" . --type nu
rg "format bits" . --type nu | where ($it !~ "--endian")
```

#### 3. Test with experimental features
```bash
# Test with stricter settings:
nu --experimental-options='pipefail,enforce-runtime-annotations' your_script.nu
```

---

## Recommendations for Best Practices

### 1. Error Handling

**Always handle stream errors explicitly:**
```nushell
# GOOD:
try {
    $stream | collect
} catch { |err|
    log error $"Failed to collect stream: ($err.msg)"
    []
}

# AVOID:
$stream | collect  # May fail silently in older code
```

---

### 2. Type Safety

**Use explicit type annotations with runtime checks:**
```nushell
# Enable runtime type checking for production:
$env.config.experimental = {
    enforce-runtime-annotations: true
}

# Use type annotations:
def process-data [count: int, name: string] -> list<string> {
    # Implementation
}
```

---

### 3. Completions

**Prefer inline completions for simple cases:**
```nushell
# GOOD for static values:
def deploy [env: string@[dev staging prod]] {
    # Implementation
}

# Use custom completers for dynamic values:
def deploy [env: string@get-environments] {
    # Implementation
}

def get-environments [] {
    # Dynamic completion logic
}
```

---

### 4. Platform Compatibility

**Windows path handling:**
```nushell
# Use full device paths on Windows:
if $nu.os-info.name == "windows" {
    open \\.\NUL  # Better than "NUL"
}

# Handle UNC paths correctly:
# Don't assume trailing backslashes
```

---

### 5. Custom Values in Plugins

**Implement full CustomValue support:**
```rust
impl CustomValue for MyValue {
    // Support error propagation:
    fn follow_path_int(&self, ...) -> Result<Value, ShellError> { ... }

    // Support save command:
    fn to_base_value(&self, span: Span) -> Result<Value, ShellError> { ... }

    // Support into value:
    // (same as to_base_value)
}
```

---

### 6. Endian Handling

**Be explicit about endian when it matters:**
```nushell
# For binary data interchange, always specify:
$data | format bits --endian big    # Network byte order
$data | format bits --endian little # Intel/AMD architecture
$data | format bits --endian native # Platform-specific
```

---

### 7. Pipeline Error Handling

**Use pipefail for critical scripts:**
```nushell
# In critical scripts:
$env.config.experimental = { pipefail: true }
$env.config.display_errors = { exit_code: true }

# Then check exit codes:
some-command | another-command
if $env.LAST_EXIT_CODE != 0 {
    error make { msg: "Pipeline failed" }
}
```

---

### 8. Migration Testing

**Test incrementally:**
```nushell
# 1. Update syntax without logic changes
# 2. Test with old behavior flags
# 3. Enable new features one at a time
# 4. Run comprehensive test suite
# 5. Deploy to staging environment first
```

---

### 9. Documentation

**Update your code documentation:**
```nushell
# Document required Nushell version:
# @requires nushell >= 0.108.0
# @experimental pipefail, enforce-runtime-annotations

def my-command [] {
    # Implementation
}
```

---

### 10. Future-Proofing

**Prepare for experimental features to become default:**
```nushell
# Write code that works with experimental features enabled:
# - Explicit error handling (pipefail-ready)
# - Type annotations (runtime-check-ready)
# - Explicit endian specifications
# - No reliance on removed commands
```

---

## Summary of Impact Levels

### HIGH Impact (Must Address)
- `into value` → `detect type` rename
- Stream error collection behavior
- Polars fetch removal (if using polars)

### MEDIUM Impact (Should Address)
- `format bits` endian behavior
- Network feature flag (custom builds only)
- Power operator associativity (if using chained powers)
- Polars pivot --stable flag (if using polars)

### LOW Impact (Nice to Have)
- Windows UNC/device path improvements (Windows users)
- Inline completion syntax adoption
- HTTP metadata access simplification
- New date/time format specifiers
- Enhanced CustomValue support (plugin developers)

---

## Additional Resources

- **Official Release Notes:** https://www.nushell.sh/blog/2025-10-15-nushell_v0_108_0.html
- **GitHub Release:** https://github.com/nushell/nushell/releases/tag/0.108.0
- **Discord Community:** #ai-with-nu (for MCP server discussions)
- **Experimental Options Tracking:**
  - Pipefail: Issue #16760
  - Reorder Cell Paths: Issue #16766

---

## Contributors

This release was made possible by PR contributions from:

@132ikl, @andoalon, @app/dependabot, @ayax79, @Bahex, @blindFS, @cablehead, @cptpiepmatz, @fdncred, @fixerer, @Jan9103, @maxim-uvarov, @mkatychev, @nome, @sgvictorino, @Sheape, @sholderbach, @simonborje, @Tyarel8, @weirdan, @WindSoilder, @xolra0d, @Xylobyte, @ysthakur

---

**Document Version:** 1.0
**Last Updated:** 2025-10-18
**Maintained By:** Nushell Plugins Repository Team
