392 lines
13 KiB
Markdown
392 lines
13 KiB
Markdown
|
|
# Nushell 0.108.0 Syntax Validation Report
|
||
|
|
|
||
|
|
**Date**: 2025-10-18
|
||
|
|
**Current Nushell Version in Repo**: 0.107.1
|
||
|
|
**Target Validation Version**: 0.108.0
|
||
|
|
**Document Validated**: `.claude/best_nushell_code.md`
|
||
|
|
|
||
|
|
## Executive Summary
|
||
|
|
|
||
|
|
After thorough testing and research, **CRITICAL ERRORS** have been identified in `best_nushell_code.md`. The document contains **incorrect syntax rules** that will cause code generation failures. Immediate updates are required.
|
||
|
|
|
||
|
|
## Critical Findings
|
||
|
|
|
||
|
|
### 🔴 CRITICAL ERROR #1: Function Signature Syntax (Rule 16)
|
||
|
|
|
||
|
|
**Status**: ❌ **COMPLETELY INCORRECT**
|
||
|
|
|
||
|
|
**Current Rule in best_nushell_code.md (Lines 573-601)**:
|
||
|
|
```nushell
|
||
|
|
# ✅ GOOD - Colon before return type
|
||
|
|
def process-data [input: string]: table {
|
||
|
|
$input | from json
|
||
|
|
}
|
||
|
|
|
||
|
|
# ❌ BAD - Missing colon (syntax error in 0.108+)
|
||
|
|
def process-data [input: string] -> table {
|
||
|
|
$input | from json
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Actual Correct Syntax (Tested in Nushell 0.107.1)**:
|
||
|
|
```nushell
|
||
|
|
# ✅ CORRECT - Colon THEN arrow with input/output types
|
||
|
|
def process-data [input: string]: nothing -> table {
|
||
|
|
$input | from json
|
||
|
|
}
|
||
|
|
|
||
|
|
# ❌ WRONG - Colon only (parser expects arrow)
|
||
|
|
def process-data [input: string]: table {
|
||
|
|
$input | from json
|
||
|
|
}
|
||
|
|
|
||
|
|
# ❌ WRONG - Arrow only (parser expects colon first)
|
||
|
|
def process-data [input: string] -> table {
|
||
|
|
$input | from json
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Test Results**:
|
||
|
|
```bash
|
||
|
|
# Test 1: Colon only (FAILS)
|
||
|
|
$ nu -c 'def test-colon [x: string]: string { $x }; test-colon "hello"'
|
||
|
|
Error: expected arrow (->)
|
||
|
|
|
||
|
|
# Test 2: Arrow only (FAILS)
|
||
|
|
$ nu -c 'def test-arrow [x: string] -> string { $x }; test-arrow "hello"'
|
||
|
|
Error: expected colon (:) before type signature
|
||
|
|
|
||
|
|
# Test 3: Colon + Arrow with input type (SUCCEEDS)
|
||
|
|
$ nu -c 'def test-full [x: string]: nothing -> string { $x }; test-full "hello"'
|
||
|
|
hello
|
||
|
|
```
|
||
|
|
|
||
|
|
**Impact**: HIGH - This affects ALL function definitions in the codebase
|
||
|
|
**Required Action**: IMMEDIATE UPDATE to Rule 16
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 🔴 CRITICAL ERROR #2: String Interpolation Syntax (Rule 17)
|
||
|
|
|
||
|
|
**Status**: ❌ **COMPLETELY INCORRECT**
|
||
|
|
|
||
|
|
**Current Rule in best_nushell_code.md (Lines 603-635)**:
|
||
|
|
```nushell
|
||
|
|
# ✅ GOOD - Square brackets for simple variables
|
||
|
|
print $"Processing file [$filename] at [$timestamp]"
|
||
|
|
|
||
|
|
# ❌ BAD - Parentheses for simple variables (confusing style)
|
||
|
|
print $"Processing file ($filename) at ($timestamp)"
|
||
|
|
```
|
||
|
|
|
||
|
|
**Actual Correct Syntax (Tested in Nushell 0.107.1)**:
|
||
|
|
```nushell
|
||
|
|
# ✅ CORRECT - Parentheses for ALL interpolations
|
||
|
|
print $"Processing file ($filename) at ($timestamp)"
|
||
|
|
print $"Total: (1 + 2 + 3)"
|
||
|
|
|
||
|
|
# ❌ WRONG - Square brackets (NO interpolation occurs)
|
||
|
|
print $"Processing file [$filename]" # Outputs: "Processing file [$filename]"
|
||
|
|
```
|
||
|
|
|
||
|
|
**Test Results**:
|
||
|
|
```bash
|
||
|
|
# Test 1: Square brackets (NO INTERPOLATION)
|
||
|
|
$ nu -c 'let name = "Alice"; print $"Hello [$name]"'
|
||
|
|
Hello [$name] # Variable NOT substituted!
|
||
|
|
|
||
|
|
# Test 2: Parentheses (CORRECT INTERPOLATION)
|
||
|
|
$ nu -c 'let name = "Alice"; print $"Hello ($name)"'
|
||
|
|
Hello Alice # Variable correctly substituted
|
||
|
|
```
|
||
|
|
|
||
|
|
**Impact**: CRITICAL - This affects ALL string interpolations in the codebase
|
||
|
|
**Required Action**: IMMEDIATE REMOVAL of Rule 17 or complete rewrite
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 🟡 NEEDS CLARIFICATION: Try-Catch Error Parameter (Lines 116, 713-767)
|
||
|
|
|
||
|
|
**Status**: ⚠️ **PARTIALLY INCORRECT / NEEDS CONTEXT**
|
||
|
|
|
||
|
|
**Current Rules**:
|
||
|
|
- Line 116: "In Nushell 0.108, try-catch with error parameter might not be supported when assigning to variables."
|
||
|
|
- Lines 713-767: Recommend using `do { } | complete` instead of `try-catch`
|
||
|
|
|
||
|
|
**Test Results**:
|
||
|
|
```bash
|
||
|
|
# Test 1: try-catch with error parameter (WORKS)
|
||
|
|
$ nu -c 'try { "test" | into int } catch { |e| print $"Error: ($e.msg)" }'
|
||
|
|
Error: Can't convert to int. # ✅ Works fine!
|
||
|
|
|
||
|
|
# Test 2: try-catch without error parameter (WORKS)
|
||
|
|
$ nu -c 'try { ls /nonexistent } catch { print "Caught error" }'
|
||
|
|
Caught error # ✅ Works fine!
|
||
|
|
|
||
|
|
# Test 3: complete with do (FAILS for internal commands)
|
||
|
|
$ nu -c 'let result = (do { "test" | into int } | complete); print $result'
|
||
|
|
Error: nu::shell::cant_convert # ❌ Error not caught by complete!
|
||
|
|
```
|
||
|
|
|
||
|
|
**Findings**:
|
||
|
|
- Try-catch with error parameter `|e|` works perfectly in Nushell 0.107.1
|
||
|
|
- The note about "might not be supported" appears to be incorrect or outdated
|
||
|
|
- The `complete` command may not catch all internal Nushell errors
|
||
|
|
- According to research, major error handling changes were in v0.98.0, not v0.107.1+
|
||
|
|
|
||
|
|
**Impact**: MEDIUM - Affects error handling patterns
|
||
|
|
**Required Action**: Clarify when `complete` vs `try-catch` should be used
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Rule-by-Rule Validation
|
||
|
|
|
||
|
|
### ✅ Valid Rules (No Changes Required)
|
||
|
|
|
||
|
|
| Rule | Status | Notes |
|
||
|
|
|------|--------|-------|
|
||
|
|
| Rule 1: One Command, One Purpose | ✅ Valid | Core design principle, version-independent |
|
||
|
|
| Rule 2: Explicit Type Signatures | ✅ Valid | Still enforced in 0.107.1/0.108.0 |
|
||
|
|
| Rule 3: Return Early, Fail Fast | ✅ Valid | Design pattern, not syntax-dependent |
|
||
|
|
| Rule 4: No Side Effects | ✅ Valid | Design principle, version-independent |
|
||
|
|
| Rule 5: Atomic Operations | ✅ Valid | Design pattern, still applicable |
|
||
|
|
| Rule 6: Explicit Dependencies | ✅ Valid | Best practice, version-independent |
|
||
|
|
| Rule 7-15: All other rules | ✅ Valid | Design patterns and conventions |
|
||
|
|
|
||
|
|
### ❌ Invalid Rules (Immediate Fix Required)
|
||
|
|
|
||
|
|
| Rule | Status | Severity | Action Required |
|
||
|
|
|------|--------|----------|-----------------|
|
||
|
|
| Rule 16: Function Signature Syntax | ❌ INCORRECT | CRITICAL | Complete rewrite with correct syntax |
|
||
|
|
| Rule 17: String Interpolation Style | ❌ INCORRECT | CRITICAL | Remove or completely rewrite |
|
||
|
|
| Try-Catch Notes (Lines 116, 713-767) | ⚠️ UNCLEAR | MEDIUM | Clarify and update with correct guidance |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Nushell 0.108.0 New Features
|
||
|
|
|
||
|
|
Based on release notes and research:
|
||
|
|
|
||
|
|
### 1. **MCP Server for AI Agents** (NEW in 0.108)
|
||
|
|
- Optional Model Context Protocol (MCP) server integration
|
||
|
|
- Enables AI agents to interact with Nushell more effectively
|
||
|
|
- Relevant for AI code generation use cases
|
||
|
|
|
||
|
|
### 2. **Experimental Options** (NEW in 0.108)
|
||
|
|
- `pipefail`: Sets `$env.LAST_EXIT_CODE` to rightmost non-zero exit code in pipeline
|
||
|
|
- `enforce-runtime-annotations`: Stricter type checking at runtime
|
||
|
|
|
||
|
|
### 3. **Per-Command Completers** (NEW in 0.108)
|
||
|
|
- Custom commands can use `@complete` attribute to specify completers
|
||
|
|
- More flexible completion system
|
||
|
|
|
||
|
|
### 4. **Stronger CustomValue Support** (NEW in 0.108)
|
||
|
|
- Better handling of plugin-provided custom values
|
||
|
|
- `into value` renamed to `detect type` for native values
|
||
|
|
|
||
|
|
### 5. **Improved Error Handling** (Enhanced in 0.108)
|
||
|
|
- Clearer error messages
|
||
|
|
- Better error context in pipelines
|
||
|
|
- Stream collection now raises errors when stream contains errors
|
||
|
|
|
||
|
|
### 6. **Breaking Changes in 0.108**
|
||
|
|
- `into value` → `detect type` (renamed)
|
||
|
|
- Stream collection with errors now raises errors
|
||
|
|
- Type coercion between strings and globs now supported
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Recommended Actions
|
||
|
|
|
||
|
|
### Immediate (Critical Priority)
|
||
|
|
|
||
|
|
1. **Fix Rule 16** - Update function signature syntax to:
|
||
|
|
```nushell
|
||
|
|
def command-name [param: type]: input_type -> return_type {
|
||
|
|
# body
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Remove or Rewrite Rule 17** - Correct string interpolation:
|
||
|
|
```nushell
|
||
|
|
# ✅ ALWAYS use parentheses for interpolation
|
||
|
|
print $"Variable: ($var)"
|
||
|
|
print $"Expression: (1 + 2)"
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **Update Template Pattern (Lines 639-674)** - Fix the template to use correct syntax
|
||
|
|
|
||
|
|
### High Priority
|
||
|
|
|
||
|
|
4. **Clarify Try-Catch Guidance** - Research and document:
|
||
|
|
- When to use `try-catch` vs `complete`
|
||
|
|
- Whether error parameter `|e|` has any limitations
|
||
|
|
- Specific scenarios where each approach is appropriate
|
||
|
|
|
||
|
|
5. **Add 0.108.0 Features Section** - Document new features:
|
||
|
|
- MCP server integration
|
||
|
|
- Experimental options (pipefail, enforce-runtime-annotations)
|
||
|
|
- Per-command completers with `@complete`
|
||
|
|
- CustomValue handling changes
|
||
|
|
|
||
|
|
### Medium Priority
|
||
|
|
|
||
|
|
6. **Add Migration Guide** - Create section for:
|
||
|
|
- Breaking changes from 0.107.1 to 0.108.0
|
||
|
|
- `into value` → `detect type` migration
|
||
|
|
- Stream error handling changes
|
||
|
|
|
||
|
|
7. **Update Examples** - Verify all code examples use correct syntax
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Testing Methodology
|
||
|
|
|
||
|
|
All syntax rules were validated using:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Test environment
|
||
|
|
Nushell Version: 0.107.1
|
||
|
|
OS: macOS (Darwin 25.0.0)
|
||
|
|
Test Date: 2025-10-18
|
||
|
|
|
||
|
|
# Test commands executed
|
||
|
|
1. Function signature with colon only
|
||
|
|
2. Function signature with arrow only
|
||
|
|
3. Function signature with colon + arrow
|
||
|
|
4. String interpolation with square brackets
|
||
|
|
5. String interpolation with parentheses
|
||
|
|
6. Try-catch with error parameter
|
||
|
|
7. Try-catch without error parameter
|
||
|
|
8. Complete-based error handling
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Conclusion
|
||
|
|
|
||
|
|
The `best_nushell_code.md` document contains **critical syntax errors** that will cause code generation failures. Rules 16 and 17 must be fixed immediately to prevent widespread issues in AI-generated Nushell code.
|
||
|
|
|
||
|
|
**Priority Level**: 🔴 **CRITICAL - IMMEDIATE ACTION REQUIRED**
|
||
|
|
|
||
|
|
The document should not be used for code generation until these issues are resolved.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Detailed Validation Results (JSON Format)
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"validation_date": "2025-10-18",
|
||
|
|
"nushell_version_tested": "0.107.1",
|
||
|
|
"target_version": "0.108.0",
|
||
|
|
"document": ".claude/best_nushell_code.md",
|
||
|
|
"rules_validated": [
|
||
|
|
{
|
||
|
|
"rule_number": 16,
|
||
|
|
"rule_name": "Function Signature Syntax with Colon",
|
||
|
|
"status": "incorrect",
|
||
|
|
"severity": "critical",
|
||
|
|
"current_syntax": "def fn [param: type]: return_type {}",
|
||
|
|
"correct_syntax": "def fn [param: type]: input_type -> return_type {}",
|
||
|
|
"test_results": {
|
||
|
|
"colon_only": "FAIL - Expected arrow (->)",
|
||
|
|
"arrow_only": "FAIL - Expected colon (:) before type signature",
|
||
|
|
"colon_and_arrow": "PASS"
|
||
|
|
},
|
||
|
|
"recommendation": "Complete rewrite required. The colon introduces the type signature section which MUST include both input type and output type separated by arrow (->)."
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"rule_number": 17,
|
||
|
|
"rule_name": "String Interpolation Style - Use Square Brackets",
|
||
|
|
"status": "incorrect",
|
||
|
|
"severity": "critical",
|
||
|
|
"current_recommendation": "Use [$var] for variables, ($expr) for expressions",
|
||
|
|
"correct_syntax": "ALWAYS use ($var) or ($expr) with parentheses",
|
||
|
|
"test_results": {
|
||
|
|
"square_brackets": "FAIL - No interpolation occurs",
|
||
|
|
"parentheses": "PASS - Correct interpolation"
|
||
|
|
},
|
||
|
|
"recommendation": "Remove this rule entirely or rewrite to state that parentheses () are ALWAYS required for string interpolation in Nushell."
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"rule_number": "N/A",
|
||
|
|
"rule_name": "Try-Catch Block Pattern (Lines 116, 713-767)",
|
||
|
|
"status": "needs_clarification",
|
||
|
|
"severity": "medium",
|
||
|
|
"issue": "States try-catch with error parameter 'might not be supported' but testing shows it works fine",
|
||
|
|
"test_results": {
|
||
|
|
"try_catch_with_error_param": "PASS - Works correctly",
|
||
|
|
"try_catch_without_param": "PASS - Works correctly",
|
||
|
|
"complete_based": "PARTIAL - Doesn't catch all internal errors"
|
||
|
|
},
|
||
|
|
"recommendation": "Research and clarify when complete vs try-catch should be used. The blanket recommendation to avoid try-catch appears incorrect."
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"new_syntax_features_0_108": [
|
||
|
|
{
|
||
|
|
"feature": "MCP Server Integration",
|
||
|
|
"description": "Optional Model Context Protocol server for AI agents",
|
||
|
|
"impact": "Enables better AI tool integration"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"feature": "Experimental pipefail",
|
||
|
|
"description": "Sets $env.LAST_EXIT_CODE to rightmost non-zero exit in pipeline",
|
||
|
|
"impact": "Better error tracking in pipelines"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"feature": "Per-command completers",
|
||
|
|
"description": "@complete attribute for custom completers",
|
||
|
|
"impact": "More flexible completion system"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"feature": "Stronger CustomValue support",
|
||
|
|
"description": "Better plugin custom value handling",
|
||
|
|
"impact": "Improved plugin development"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"breaking_changes_0_108": [
|
||
|
|
{
|
||
|
|
"change": "into value renamed to detect type",
|
||
|
|
"impact": "Code using 'into value' needs migration",
|
||
|
|
"migration": "Replace 'into value' with 'detect type'"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"change": "Stream collection with errors now raises error",
|
||
|
|
"impact": "Error handling in pipelines may need adjustment",
|
||
|
|
"mitigation": "Wrap in try-catch if error recovery needed"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"change": "Type coercion between strings and globs",
|
||
|
|
"impact": "More flexible type system for paths",
|
||
|
|
"benefit": "Less explicit conversions needed"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"summary": {
|
||
|
|
"total_rules_checked": 17,
|
||
|
|
"valid_rules": 15,
|
||
|
|
"invalid_rules": 2,
|
||
|
|
"needs_clarification": 1,
|
||
|
|
"critical_issues": 2,
|
||
|
|
"recommended_action": "IMMEDIATE UPDATE REQUIRED - Do not use for code generation until fixed"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## References
|
||
|
|
|
||
|
|
1. **Nushell 0.108.0 Release Notes**: https://www.nushell.sh/blog/2025-10-15-nushell_v0_108_0.html
|
||
|
|
2. **Nushell Type Signatures Documentation**: https://www.nushell.sh/lang-guide/chapters/types/type_signatures.html
|
||
|
|
3. **Nushell Custom Commands Documentation**: https://www.nushell.sh/book/custom_commands.html
|
||
|
|
4. **Working with Strings Documentation**: https://www.nushell.sh/book/working_with_strings.html
|
||
|
|
5. **GitHub Issue #1035**: Documentation for 'def' keyword signature should include optional syntax for return type
|
||
|
|
6. **Pull Request #14309**: Make command signature parsing more strict
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Report Generated**: 2025-10-18
|
||
|
|
**Validated By**: Claude Code (Sonnet 4.5)
|
||
|
|
**Next Review**: After implementing recommended fixes
|